公司使用 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

PostGre安装

以上说明 安装 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';
ALTER ROLE

依次建立两个数据库,供之后使用:
# 建立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

PostGre配置文件


# 建议在修改配置前,都对文件进行备份存档 ,用 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

修改操作详情

PostGre 修改配置

navicat连接postgre

其他版本选择下载:PostgreSQL: Linux downloads (Red Hat family)
https://www.postgresql.org/download/linux/redhat/

STEP 2 安装 kong-2.1

1. 官网下载 rpm 文件

下载 Kong

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 数据库

修改Kong配置文件

4. 执行命令,进行 Kong 的 PostgreSQL 数据库的表初始化:
kong migrations bootstrap -c /etc/kong/kong.conf 

完成后,使用 Navicat 看到如下表:

Kong数据库初始化

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":{... // 很长一堆的结果

Kong完成安装

其他版本选择下载: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 14.x
 curl -sL https://rpm.nodesource.com/setup_12.x | bash -

# 这个命令有的时候会报错,如
## Run `sudo yum install -y nodejs` to install Node.js 12.x and npm.
## You may also need development tools to build native addons:
     sudo yum install gcc-c++ make
## To install the Yarn package manager, run:
     curl -sL https://dl.yarnpkg.com/rpm/yarn.repo | sudo tee /etc/yum.repos.d/yarn.repo
     sudo yum install yarn

#则直接执行 sudo yum install -y nodejs

# 安装 NPM
 yum install nodejs npm -y

#如果报错: 
#You could try using --skip-broken to work around the problem
#You could try running: rpm -Va --nofiles --nodigest
则直接执行  yum install nodejs npm -y --skip-broken


# 打印版本
 node --version
 v12.18.3 
 npm --version
 6.14.6

# 安装 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 kongga
$ 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初始化表

启动 Konga 服务:

npm run production

后台启动 无日志输出
nohup npm run production &
或者
nohup npm run production >/dev/null 2>&1 & exit

#如需要关闭当前SSH连接,也能后台运行,还需要改一下

STEP 4 konga 接入 kong

访问 虚拟机的 1337 端口,这是 konga 运行的端口

konga 初始化界面

账号初始化

konga 接入 kong

添加 kong 地址,完成集成

完成集成