使用Kong和Konga管理微服务和API

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…

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

这个站点使用 Akismet 来减少垃圾评论。了解你的评论数据如何被处理