公司使用 Kong 为网关,实现服务的注册和发现和调用,以及限流追踪,近期从 0.X 版本 升级到了 2.X,我虽不负责该部分工作,但查阅相关资料,发现 Kong 非常强大,可支撑庞大并发和流量,因此对此进行探索学习。
后续写一些 Kong 嵌入项目 相关笔记
OpenResty
OpenResty® 是一个基于 Nginx 与 Lua 的高性能 Web 平台,其内部集成了大量精良的 Lua 库、第三方模块以及大多数的依赖项。用于方便地搭建能够处理超高并发、扩展性极高的动态 Web 应用、Web 服务和动态网关。因此,我们可以做出各种符合我们需要的网关策略的Lua脚本,以其为基础构建高性能的网关系统。
Kong
Kong基于OpenResty,是一个云原生、快速、可扩展、分布式的Api 网关。继承了OpenResty的高性能、易扩展性等特点。Kong通过简单的增加机器节点,可以很容易的水平扩展。同时功能插件化,可通过插件来扩展其能力。而且在任何基础架构上都可以运行。具有以下特性:
- 提供了多样化的认证层来保护Api。
- 可对出入流量进行管制。
- 提供了可视化的流量检查、监视分析Api。
- 能够及时的转换请求和相应。
- 提供log解决方案
- 可通过api调用Serverless 函数。
这是 Kong 的官网,中文社区还处于混沌状态
Kong: Next-Generation API platform for Microservices
https://konghq.com/
定个基调:我翻阅很多资料,安装了若干版本,最终确定版本组件:
- postgresql-9.6.17.tar.bz2
- kong-2.1.3.el7.amd64.rpm
- konga (0.14.9 当前最新版本 )
选择理由:konga 是一个可视化的 Kong 管理界面,支持 Kong 2.0 以上版本,但仅支持 postgresql 9.X(否则就要换成 MySql)
因此上述版本,是目前最新的版本。
进入正题,开始安装
写这篇博客时,我重新创建了一台虚拟机,用 Centos7_X64_mini 最小 ISO镜像,安装在 VMware WorkStation 15 Pro 上,设置为nat模式(当局域网内接入设备较少,推荐桥接),并使用 Xshell 6 SSH 进行访问。
如果是公司局域网,网络条件复杂,需要使用代理进行上网,VM 如何设置,可以查看我的另外一篇文章:公司局域网条件下设置网络代理,及虚拟机中Linux配置网络 | 猥琐发育不要浪
完成安装后,热身动作:
# 关闭防火墙
systemctl stop firewalld.service
# 禁止firewall开机启动
systemctl disable firewalld.service
# 关闭安全强化
vi /etc/selinux/config
SELINUX=disabled
#重新拉取构建源
yum clean all
yum makecache
#安装常用组件
yum install wget -y
yum install lrzsz -y
yum install gcc -y
STEP 1 安装 postgresql-9
基本安装
# Install the repository RPM:
yum install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-7-x86_64/pgdg-redhat-repo-latest.noarch.rpm
# Install PostgreSQL:
yum install -y postgresql96-server
# Optionally initialize the database and enable automatic start:
# 默认配置初始化 postgresql-9, 默认数据目录为:/var/lib/pgsql/9.6/data
/usr/pgsql-9.6/bin/postgresql96-setup initdb
# 开启和 运行 postgresql-9
systemctl enable postgresql-9.6
systemctl start postgresql-9.6
# 查看 postgresql-9 状态
systemctl status postgresql-9.6
以上说明 安装 postgresql-9.6 成功
postgresql会自动完成以下操作:
自动生成一个linux系统用户postgres:管理数据库的系统用户
数据库用户postgres:数据库超级管理员
此用户的默认数据库为postgres
可有修改下默认postgres数据库用户的密码:
# 切换用户
su - postgres
-bash-4.2$ psql
psql (9.6.19)
Type "help" for help.
postgres=# alter role postgres with password '123456';
依次建立两个数据库,供之后使用:
# 建立kong
create user kong with password '123456';
# 为新用户建立数据库
create database kong owner kong;
# 把新建的数据库权限赋予新用户
grant all privileges on database kong to kong;
#如果需要 自定义安装数据目录:
#新建数据目录
mkdir -p /data/postgresql/data
#授权
chown -R postgres:postgres /data/postgresql/data
#切换到postgres用户,初始化
$ su - postgres
-bash-4.2$ /usr/pgsql-12/bin/initdb -D /data/postgresql/data
#修改postgresql的system.service文件
vim /usr/lib/systemd/system/postgresql-9.6.service
Environment=PGDATA=/data/postgresql/data/
#重新加载系统服务
systemctl daemon-reload
基本配置
默认路径为 /var/lib/pgsql/9.6/data
# 建议在修改配置前,都对文件进行备份存档 ,用 xftp 编辑文件超级方便
cp postgresql.conf postgresql.conf.bak
cp pg_hba.conf pg_hba.conf.bak
# 第一个配置文件
vi postgresql.conf
# 修改监听的ip和端口, 修改内容,删除注释
listen_addresses = '*'
port = 5432
# 第二个配置文件
vi pg_hba.conf
# 简单起见,注释掉所有默认配置,
# 添加一条 host all all 0.0.0.0/0 trust,远程 or 本地访问,任何 PostgreSQL 用户和数据库,使用 trust 认证方式
常见的四种身份验证方式:
1. trust:凡是能连接到服务器的,都是可信任的。只需要提供数据库用户名,可以没有对应的操作系统同名用户;
2. password 和 md5:对于外部访问,需要提供 psql 用户名和密码。对于本地连接,提供 psql 用户名密码之外,还需要有操作系统访问权(用操作系统同名用户验证)。password 和 md5 的区别就是外部访问时传输的密码是否用 md5 加密;
3. ident:对于外部访问,从 ident 服务器获得客户端操作系统用户名,然后把操作系统作为数据库用户名进行登录;对于本地连接,实际上使用了peer;
4. peer:通过客户端操作系统内核来获取当前系统登录的用户名,并作为psql用户名进行登录。
# 重启服务,配置生效
systemctl restart postgresql-9.6
修改操作详情
navicat 连接 postgre
其他版本选择下载:PostgreSQL: Linux downloads (Red Hat family)
https://www.postgresql.org/download/linux/redhat/
STEP 2 安装 kong-2.1
1. 官网下载 rpm 文件
Install - CentOS | Kong - Open-Source API Management and Microservice Management
https://docs.konghq.com/install/centos/
2. 执行安装
sudo yum install epel-release -y
# 这里 * 指代 前方下载的 rpm 文件详细版本号,如我的是 postgresql-9.6.17.tar.bz2
# 则执行 sudo yum install kong-2.1.3.el7.amd64.rpm -y --nogpgcheck
sudo yum install kong-2.1.3.*.noarch.rpm -y --nogpgcheck
3. 执行配置
Kong 的默认配置文件为 /etc/kong/kong.conf.default,
执行命令,复制新配置文件:
cp /etc/kong/kong.conf.default /etc/kong/kong.conf
复制完成后,修改 /etc/kong/kong.conf 配置,设置使用 PostgreSQL 数据库
4. 执行命令,进行 Kong 的 PostgreSQL 数据库的表初始化:
kong migrations bootstrap -c /etc/kong/kong.conf
完成后,使用 Navicat 看到如下表:
5. 启动 Kong
执行命令:
kong start -c /etc/kong/kong.conf
启动成功时,会看到 Kong started 日志
默认情况下,Kong 绑定 4 个端口:
- Proxy 8000:接收客户端的 HTTP 请求,并转发到后端的 Upstream。
- Proxy 8443:接收客户端的 HTTPS 请求,并转发到后端的 Upstream。
- Admin 8001:接收管理员的 HTTP 请求,进行 Kong 的管理。
- Admin 8444:接收管理员的 HTTPS 请求,进行 Kong 的管理。
简单测试如下则说明成功:
# 请求 Proxy 端口 暂未配置路由
curl http://127.0.0.1:8000
{"message":"no Route matched with those values"}
# 请求 Admin 端口
curl http://127.0.0.1:8001
{"plugins":{"enabled_in_cluster":[],"available_on_server":{... // 很长一堆的结果
其他版本选择下载:Install - CentOS | Kong - Open-Source API Management and Microservice Management
https://docs.konghq.com/install/centos/
STEP 3 安装 konga
konga 是 kong 的第三方可视化界面,只有商业版本的 kong 官方提供 可视化界面
Konga 是基于 NodeJS 开发的项目,所以需要安装 NodeJS 相关的环境。执行命令如下:
# 安装 NodeJS
curl -sL https://rpm.nodesource.com/setup_12.x | bash -
# 这个命令有的时候会报错,如
wget https://nodejs.org/dist/v10.16.3/node-v10.16.3-linux-x64.tar.xz
#解压nodejs 压缩包
tar -xvf node-v10.16.3-linux-x64.tar.xz -C /usr/local/
# 部署bin文件
先确认你的nodejs路径,我这里为/usr/local/node-v10.16.3-linux-x64/bin 确认后创建软连接:依次执行
ln -s /usr/local/node-v10.16.3-linux-x64/bin/node /usr/bin/node
ln -s /usr/local/node-v10.16.3-linux-x64/bin/npm /usr/bin/npm
# 设置全局淘宝源
npm config set registry https://registry.npm.taobao.org
# 查看镜像源
npm config get registry
# 打印版本
node --version
v10.16.3
npm --version
6.9.0
# 安装 gulp、bower、sails,(安装期间长时间卡住,直接ctrl + c , 重新执行)
npm install -g gulp
npm install -g bower
npm install -g sails
- NodeJS:运行在服务端的 JavaScript。
- npm:npm 是 JavaScript 世界的包管理工具,并且是 NodeJS 平台的默认包管理工具。通过 npm 可以安装、共享、分发代码,管理项目依赖关系。
- gulp:一个自动化构建工具,开发者可以使用它在项目开发过程中自动执行常见任务。
- bower:一个针对Web开发的包管理器。该工具主要用来帮助用户轻松安装 CSS、JavaScript、图像等相关包,并管理这些包之间的依赖。
- sails:NodeJS 的 MVC 框架。
安装 Konga
# 安装 Git
yum install git -y
git clone https://github.com/pantsel/konga.git
# 下载 NodeJS 相关依赖包
$ cd konga
$ npm i
# 解决 bower 相关依赖包(耗时较长)
$ npm run bower-deps
创建 Konga 的 PostgreSQL 数据库 konga
# 创建一个 Linux 用户 `konga`
adduser konga
# 进入 PostgreSQL 控制台
# 因为我们切换了 PostgreSQL 的认证方式为 trust 方式,所以可以这样连接
psql -U postgres -h 127.0.0.1 -p 5432
# 创建一个 PostgreSQL 用户 `konga`,和上面创建的 Linux 用户 `konga` 对应。
$ create user konga with password '123456';
# 创建一个 PostgreSQL 数据库 `konga`
$ create database konga owner konga;
# 将数据库 `konga` 授权给 PostgreSQL 用户 `konga`
$ grant all privileges on database konga to konga;
# 退出 PostgreSQL 控制台
$ \q
konga 环境初始化
执行命令:
#这里要 ll -a 才能 看的 .xxx文件
cp .env_example .env
复制出 .env 配置文件,接入 PostgreSQL 作为数据库。配置内容如下:
PORT=1337
NODE_ENV=production
KONGA_HOOK_TIMEOUT=120000
DB_ADAPTER=postgres
DB_URI=postgresql://konga:[email protected]:5432/konga
KONGA_LOG_LEVEL=warn
TOKEN_SECRET=some_secret_token
初始化 PostgreSQL 数据库:
node ./bin/konga.js prepare [--adapter postgres --uri postgresql://konga:[email protected]:5432/konga]
启动 Konga 服务:
npm run production
后台启动 无日志输出
nohup npm run production &
或者
nohup npm run production >/dev/null 2>&1 & exit
#如需要关闭当前SSH连接,也能后台运行,还需要改一下
STEP 4 Docker 安装 konga
2020年11月14日更新,我换了台电脑重写安装,konga 竟然各种报错 nodeJS,心态崩了,改成用 docker 部署 konga 吧,是一样的
4.1 拉取镜像
$ docker pull pantsel/konga
4.2 数据库环境初始化
$ docker run --rm pantsel/konga:latest -c prepare -a {} -u {}
argument | description | default |
---|---|---|
-c | command | - |
-a | adapter (can be postgres or mysql) | - |
-u | full database connection url | - |
# 我的命令
$ docker run --rm pantsel/konga:latest -c prepare -a postgres -u postgresql://konga:[email protected]:5432/konga
4.3 启动容器
这有两种方式。我用的第二种
$ docker run -p 1337:1337
--network {{kong-network}} \ // optional
-e "TOKEN_SECRET={{somerandomstring}}" \
-e "DB_ADAPTER=the-name-of-the-adapter" \ // 'mongo','postgres','sqlserver' or 'mysql'
-e "DB_HOST=your-db-hostname" \
-e "DB_PORT=your-db-port" \ // Defaults to the default db port
-e "DB_USER=your-db-user" \ // Omit if not relevant
-e "DB_PASSWORD=your-db-password" \ // Omit if not relevant
-e "DB_DATABASE=your-db-name" \ // Defaults to 'konga_database'
-e "DB_PG_SCHEMA=my-schema"\ // Optionally define a schema when integrating with prostgres
-e "NODE_ENV=production" \ // or 'development' | defaults to 'development'
--name konga \
pantsel/konga
// Alternatively you can use the full connection string to connect to a database
$ docker run -p 1337:1337
--network {{kong-network}} \ // optional
-e "TOKEN_SECRET={{somerandomstring}}" \
-e "DB_ADAPTER=the-name-of-the-adapter" \ // 'mongo','postgres','sqlserver' or 'mysql'
-e "DB_URI=full-connection-uri" \
-e "NODE_ENV=production" \ // or 'development' | defaults to 'development'
--name konga \
pantsel/konga
#我的 命令
$ docker run -p 1337:1337 \
--net host \
-e "NODE_ENV=production" \
-e "DB_ADAPTER=postgres" \
-e "DB_URI=postgresql://konga:[email protected]:5432/konga" \
--name konga \
pantsel/konga