API网关:Kong
技术实现对比
Kong | ApiSix | Trk | ApiGee | |
---|---|---|---|---|
部署模式 | 单机/集群 | 单机/集群 | 单机/集群 | 仅集群 |
数据存储 | PGSQL/Cseeandra | etcd | Redis | PGSQL/Cseeandra/Zookeeper |
是否开源 | Apache V2.0 | Apache V2.0 | MPL | 否 |
核心技术 | Nginx + LUA | Nginx + LUA | Golang | ? |
私有化部署 | 支持 | 支持 | 支持 | 不支持 |
自定义插件 | 支持 | 支持 | 支持 | 不支持 |
社区活跃度 | 高 | 高 | 高 | 中 |
yaml | 支持 | 支持 | 不支持 | 不支持 |
集成&开发
环境和脚本
# 安装postgres
> docker network create kong-net
> docker run -d --name kong-database \
--network=kong-net \
-p 5432:5432 \
-e "POSTGRES_USER=kong" \
-e "POSTGRES_DB=kong" \
-e "POSTGRES_PASSWORD=kong" \
postgres:13
> docker run --rm --network=kong-net \
-e "KONG_DATABASE=postgres" \
-e "KONG_PG_HOST=kong-database" \
-e "KONG_PG_PASSWORD=kong" \
kong:3.7.0 kong migrations bootstrap
# docker安装kong
> docker run -d --name kong-gateway \
--network=kong-net \
-e "KONG_DATABASE=postgres" \
-e "KONG_PG_HOST=kong-database" \
-e "KONG_PG_USER=kong" \
-e "KONG_PG_PASSWORD=kong" \
-e "KONG_PROXY_ACCESS_LOG=/dev/stdout" \
-e "KONG_ADMIN_ACCESS_LOG=/dev/stdout" \
-e "KONG_PROXY_ERROR_LOG=/dev/stderr" \
-e "KONG_ADMIN_ERROR_LOG=/dev/stderr" \
-e "KONG_ADMIN_LISTEN=0.0.0.0:8001, 0.0.0.0:8444 ssl" \
-e "KONG_ADMIN_GUI_URL=http://172.16.185.168:8002" \
-p 8000:8000 \
-p 8443:8443 \
-p 172.16.185.168:8001:8001 \
-p 172.16.185.168:8002:8002 \
-p 172.16.185.168:8444:8444 \
kong:3.7.0
# 二进制包安装
> curl -1sLf "https://packages.konghq.com/public/gateway-37/config.rpm.txt?distro=el&codename=$(rpm --eval '%{rhel}')" | sudo tee /etc/yum.repos.d/kong-gateway-37.repo
> sudo yum -q makecache -y --disablerepo='*' --enablerepo='kong-gateway-37'
> sudo yum install -y kong-3.7.0
# 拷贝配置文件
> cp /etc/kong/kong.conf.default /etc/kong/kong.conf
# 修改如下内容(基本是取消掉这些配置项的注释即可)
admin_listen = 0.0.0.0:8001 reuseport backlog=16384, 0.0.0.0:8444 http2 ssl reuseport backlog=16384
proxy_listen = 0.0.0.0:8000 reuseport backlog=16384, 0.0.0.0:8443 http2 ssl reuseport backlog=16384
database = postgres
pg_host = 172.16.185.168
pg_port = 5432
pg_timeout = 5000
pg_user = kong
pg_password = kong
pg_database = kong
dns_resolver = 127.0.0.1:8600 # 这里配置的是Consul的访问地址和端口
# 启动kong,在浏览器中打开 [IP:8002] 即可访问
> kong start -c /etc/kong/kong.conf
# 停止服务
> kong stop
# 安装konga
> docker run -d -p 1337:1337 --name konga pantsel/konga
# 在浏览器中打开 [IP:1337] 即可访问
# 注意:用konga连接kong时,admin的URL端口时8001而非8002
创建路由
Kong和Konga位于同一台服务器:
172.16.185.168
。通过
http://172.16.185.168:8000
地址访问kong
的管理端口(用于路由转发)。通过
http://172.16.185.168:8001
地址访问kong
的服务端口。通过
http://172.16.185.168:8002
地址访问kong
的管理页面。通过
http://172.16.185.168:1337
地址访问konga
的管理页面。
Gin和GRPC服务位于同一台服务器:
192.168.2.31
。通过
http://192.168.2.31:8080
地址访问Gin
提供的服务。通过
http://192.168.2.31:9090
地址访问GRPC
提供的服务。
在Konga中创建
user-api
服务。在
user-api
服务中创建用户列表
路由,Paths
=/
。然后通过
http://172.16.185.168:8000/u/v1/users/list
即可访问Gin提供的用户列表
服务,实现了路由转发。
从Consul发现服务
修改以下Kong的
Service
配置。将
Host
配置为${服务名称}.service.consul
。将
Port
配置为80
。
将同一个服务启动两次即可看到效果(因为Consul里面所有注册的服务ID都是随机的,服务名是唯一的)。

给Kong添加JWT插件
新建一个
Consumer
。为这个
Consumer
添加JWT,路径:Consumer
->Credentials
->JWT
。记住添加的
Key
,后面要用到。记住添加的
secret
,后面要用到。
配置全局的
Plugins
,路径:Plugins
->Add GLOBAL PLUGINS
->JWT
。
测试接口
1. 不使用Gin的JWT
先把待测试接口原本的JWT验证取消掉
用Postman等接口测试工具访问
/v1/users/list
会出现{"message": "Unauthorized"}
这样的消息。在Postman的
Headers
中添加键名为x-token
的参数,键值是:Bearer ${生成的Encoded}
。再用Postman访问,就能看到正常的数据输出。
2. 整合Gin的JWT
删掉
Consumer
中的secret
,重新生成一个JWT插件。将新JWT插件的
key
替换成Gin里面使用的issuer
(位于JWT中),同时将secret
替换成之前配置过的JWT的secret
。在JWT重新生成一次
Encoded
(暂时命名为E1),记得加入:"iss": ${key}
。拿着
E1
,按照Kong的要求添加x-token
参数,值是:Bearer ${E1}
,从验证码接口得到验证码。得到验证码后调用登录接口
/v1/users/login/password
,即可看到返回的数据。再用登录接口返回的
token
,按照Kong的要求添加x-token
参数,就能顺利调用其他接口
感谢支持
更多内容,请移步《超级个体》。