Kong 是 Mashape 开源的高性能高可用 API 网关和 API 服务管理层。自 2015 年在 github 开源后,广泛受到关注。它基于 OpenResty,进行 API 管理,并提供了插件实现 API 的 AOP。Kong 在 Mashape 管理了超过 15,000 个 API,为 200,000 开发者提供了每月数十亿的请求支持。
在微服务架构之下,服务被拆的非常零散,降低了耦合度的同时也给服务的统一管理增加了难度。如上图左所示,在旧的服务治理体系之下,鉴权,限流,日志,监控等通用功能需要在每个服务中单独实现,这使得系统维护者没有一个全局的视图来统一管理这些功能。API 网关致力于解决的问题便是为微服务纳管这些通用的功能,在此基础上提高系统的可扩展性。如右图所示,微服务搭配上 API 网关,可以使得服务本身更专注于自己的领域,很好地对服务调用者和服务提供者做了隔离。
Kong 的插件机制是其高可扩展性的根源,Kong 可以很方便地为路由和服务提供各种插件,网关所需要的基本特性,Kong 都如数支持:
云原生: 与平台无关,Kong 可以从裸机运行到 Kubernetes
动态路由: Kong 的背后是 OpenResty+Lua,所以从 OpenResty 继承了动态路由的特性
熔断
健康检查
日志: 可以记录通过 Kong 的 HTTP,TCP,UDP 请求和响应。
鉴权: 权限控制,IP 黑白名单,同样是 OpenResty 的特性
SSL: Setup a Specific SSL Certificate for an underlying service or API.
监控: Kong 提供了实时监控插件
认证: 如数支持 HMAC, JWT, Basic, OAuth2.0 等常用协议
限流
REST API: 通过 Rest API 进行配置管理,从繁琐的配置文件中解放
可用性: 天然支持分布式
高性能: 背靠非阻塞通信的 nginx,性能自不用说
插件机制: 提供众多开箱即用的插件,且有易于扩展的自定义插件接口,用户可以使用 Lua 自行开发插件
一、安装
Kong 支持多种安装方式,这里使用 Docker 安装,比较简单。
1.1 安装 Kong
使用数据库
1. 创建一个 Docker 网络
首先,我们你需要创建一个自定义网络,这样的话多个容器之间能够相互发现和通讯,网络名称可以随便命名。
docker network create kong-net
2. 启动数据库
你可以使用 PostgreSQL 或 Cassandra 作为你的存储。这里选择 PostgreSQL 作为 Kong 的数据库。
$ docker run -d --name kong-database \
--network=kong-net \
-p 5432:5432 \
-e "POSTGRES_USER=kong" \
-e "POSTGRES_DB=kong" \
postgres:9.6
如果你希望使用 Cassandra。
$ docker run -d --name kong-database \
--network=kong-net \
-p 9042:9042 \
3. 准备数据库
现在让我们通过启动一个短暂的 Kong 容器来准备我们的数据库,这个容器将运行适当的迁移并死掉!
$ docker run --rm \
--network=kong-net \
-e "KONG_DATABASE=postgres" \
-e "KONG_PG_HOST=kong-database" \
-e "KONG_CASSANDRA_CONTACT_POINTS=kong-database" \
kong:latest kong migrations bootstrap
注意:上面的例子中,如果你使用的是 Cassandra,那么你应该更新 KONG_DATABASE 环境变量的值为 cassandra。
4. 启动 Kong
当迁移已经运行并且数据库准备就绪后,启动一个 Kong 容器,它将连接到你的数据库容器。
$ docker run -d --name kong \
--network=kong-net \
-e "KONG_DATABASE=postgres" \
-e "KONG_PG_HOST=kong-database" \
-e "KONG_CASSANDRA_CONTACT_POINTS=kong-database" \
-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" \
-p 8000:8000 \
-p 8443:8443 \
-p 8001:8001 \
-p 8444:8444 \
kong:latest
5. 测试 Kong!
Kong’s admin API is exposed on port 8001 and the gateway on port 8000
$ curl -i http://localhost:8001/
$ curl -i http://localhost:8000/
更多见官方安装指南
1.2 安装 Konga
当前 KONG 的社区版是没有 dashboard 的,但是付费的企业版是有带的,并且还有一些企业版才能使用的插件以及升级后的企业版插件。所以对于使用社区版的用户而言,排除自己去撸一个 dashboard 的这种选择,第三方开源的 dashboard 无疑是首选。当前 GitHub 上还在更新维护的 dashboard 有三个,分别是 kong-dashboard,kongdash 和 konga。
说道 Kong 的管理 GUI,网上说的比较多的都是 kong-dashboard,但目前最新版(v3.6.0)似乎并未支持最新版本的 Kong。而目前在 github 能找到 star 比较多的就是 konga 了。konga 不仅支持了 Kong 的最新版本(service 和 route 的拆分新特性)同时支持管理员的权限控制和多个 Kong 连接池的管理。Konga 由于自带了用户权限控制和 Kong 连接池管理,所以需要一些数据持久化处理。默认支持的数据库有 mongodb、postgres、mysql。这里我们选择的是 PostgresSQL,原因是 KONG 连接的数据库也是 PGSQL,这样可以减少数据库的部署。
1. 和以前一样,我们需要通过启动一个短暂的容器来准备 Konga 的数据库。
$ docker run --rm \
--network=kong-net \
pantsel/konga -c prepare -a postgres -u postgresql://kong@kong-database:5432/konga_db
当迁移运行了,我们可以启动 Konga
$ docker run -p 1337:1337 \
--network=kong-net \
-e "DB_ADAPTER=postgres" \
-e "DB_HOST=kong-database" \
-e "DB_USER=kong" \
-e "DB_DATABASE=konga_db" \
-e "KONGA_HOOK_TIMEOUT=120000" \
-e "NODE_ENV=production" \
--name konga \
pantsel/konga
After a while, Konga will be available at:
http://<your-servers-public-ip-or-host>:1337
你需要注册一个管理员账号
二、Konga 操作
2.1 设置连接
登录成功后,你将看到这个页面:
此时,您需要手动创建与 Kong 的管理 API 的连接。
如果您打开连接 (connections) 页面,您会注意到与先前创建的 Kong 实例的连接已经存在但尚未激活。
点击激活按钮。如果一切设置正确,Konga 将连接到 Kong,界面将充满各种酷感。
2.2 核心概念
简要介绍一些核心的概念
Dashboard
仪表板显示有关您当前连接的 Kong 实例,基础数据库和可用插件的基本信息。更多详细信息可在 INFO 页面中找到。
Snapshots
快照功能允许您轻松地跨节点备份,恢复和移动 Kong 配置。您还可以安排 Kong 实例的自动快照。
Settings
设置页面提供了一种配置 Konga 并为用户帐户设置基本 ACL 的简单方法。请记住,用户权限是全局设置的,并将用户帐户称为实体。尚不支持单个用户 ACL。
三、创建服务(Services)和路由(Routes)
我们将使用优秀的在线虚假 API(由 typicode 提供的)进行测试和原型设计。
导航到服务页面并添加新服务。填写表格如下:
提交后,服务被创建,详情如下:
注意:这里需要特别说下,Path 是后端真实 API 的路径。
The jsonplaceholder API 提供以下资源(假设我们有这些 API):
posts
comments
albums
photos
todos
users
我们需要为这些资源创建路由。单击 json-placeholder 服务,选择 routes 选项卡并添加新路由。
这里的 Path 可以和服务里的 Path 不一样,比如加一个前缀 /passport/users,但最终会映射到服务里的 Path /users。客户端调用 API 必须和 Routes 里的 Path 一致才行,否则会得到 404,无法匹配。用户的请求是先匹配 route,然后转发到 service。
比如:
If your route has /my-service in the paths property, then
/my-service/foo will be routed upstream as /foo,
/my-service/bar will be routed upstream as /bar.
I’d recommend you to go through the definition of the Route Object in Kong to gain a better understanding.
试试看
$ curl -i http://localhost:8000/users
同样,创建响应 POST,PUT,PATCH 和 DELETE 请求的第二个路由。
继续创建一个新用户并测试它:
$ curl -X POST \
-H "Content-Type: application/json" \
-d '{"name":"JohnDoe","username":"jdoe"}' \
http://localhost:8000/users
到目前为止,我们成功部署了 Kong&Konga 并设法通过我们的网关访问 jsonplaceholder API。
三、Kong- 路由规则
参考
https://docs.konghq.com/insta…
https://docs.konghq.com/0.14….
https://pantsel.github.io/konga/
https://ajaysreedhar.github.i…
https://discuss.konghq.com/t/…
https://zhuanlan.zhihu.com/p/…
https://www.lijiaocn.com/%E9%…
https://keyla.vip/kong/route/
https://www.li-rui.top/2019/0…
https://www.linzepeng.com/201…
https://medium.com/@tselentis…
https://www.cnkirito.moe/kong…