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…
发表回复