1、简述
在当今数字化的时代,应用程序和服务之间的通信变得愈发复杂。为了简化和增强这种通信,开发者们经常使用API(Application Programming Interface)。API网关是管理、监控和安全维护API通信的关键工具之一。而在众多API网关中,Kong凭借其开源的特性、可扩展性和强大的功能集而备受关注。本文将深入探讨Kong的技术细节,解释其工作原理以及如何使用Kong构建强大的API生态系统。
Kong核心特性:
- 插件系统
Kong的强大之处在于其灵活的插件系统,允许开发者根据具体需求扩展和定制API网关的功能。有关核心功能之外的需求,可以通过官方提供的插件或者自定义插件来实现。 - 负载均衡
Kong通过Nginx的负载均衡功能,确保请求能够被均匀分配到后端服务,提高系统的可用性和性能。 - 认证和授权
Kong支持多种认证方式,包括基本身份验证、OAuth、JWT等,同时提供了细粒度的授权机制,确保只有合法用户能够访问受保护的资源。 - 日志记录
Kong提供了详尽的日志记录功能,可以轻松地监控API的调用情况、性能指标以及错误信息,有助于及时发现和解决问题。 - 分布式部署
Kong支持分布式部署,可以横向扩展以处理大规模的请求流量。这使得Kong成为适用于各种规模的应用和企业的理想选择。
2、原理
Kong的工作原理可以简要概括为接收来自客户端的API请求,经过一系列插件的处理,然后路由到相应的后端服务。以下是Kong的基本工作流程:
- 接收请求: 客户端发送API请求到Kong。
- 插件处理: 请求经过预定义的插件,执行一系列的操作,如认证、鉴权、日志记录等。
- 路由: 根据API请求的路由规则,Kong将请求路由到相应的后端服务。
- 后端服务: 请求最终到达后端服务,服务返回响应。
- 插件处理(响应阶段): 后端服务的响应同样会经过插件处理,进行日志记录、响应转换等操作。
- 返回响应: 经过插件处理后,Kong将响应返回给客户端。
3、安装PostgreSQL
Kong 目前使用 Cassandra 或者 PostgreSQL,可以根据业务需求选择 Database。这边选择的是PostgreSQL:
docker run -d --name kong-database \
-p 5432:5432 \
-e "POSTGRES_USER=kong" \
-e "POSTGRES_DB=kong" \
-e "POSTGRES_PASSWORD=kong" \
--restart always \
postgres:11.10
4、初始化PostgreSQL
使用 docker run --rm 来初始化数据库,该命令执行后会退出容器而保留内部的数据卷(volume)。但是要注意kong的版本和PostgreSQL的版本是否匹配,这边采用的11.1版本来匹配kong最新版本:
docker run --rm \
-e "KONG_DATABASE=postgres" \
-e "KONG_PG_HOST=192.168.254.133" \
-e "KONG_PG_USER=kong" \
-e "KONG_PG_PASSWORD=kong" \
-e "KONG_CASSANDRA_CONTACT_POINTS=kong-database" \
kong:latest kong migrations bootstrap
你可以通过Navicat Premium直接访问:
5、启动kong
完成初始化或者迁移数据库后,我们就可以启动一个连接到数据库容器的 Kong 容器,请务必保证你的数据库容器启动状态,同时检查所有的环境参数 -e 是否是你定义的环境。
docker run -d --name kong \
-e "KONG_DATABASE=postgres" \
-e "KONG_PG_HOST=192.168.254.133" \
-e "KONG_PG_USER=kong" \
-e "KONG_PG_PASSWORD=kong" \
-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 127.0.0.1:8001:8001 \
-p 127.0.0.1:8444:8444 \
--restart always \
kong:latest
Kong 默认绑定 4 个端口:
- 8000:用来接收客户端的 HTTP 请求,并转发到 upstream。
- 8443:用来接收客户端的 HTTPS 请求,并转发到 upstream。
- 8001:HTTP 监听的 API 管理接口。
- 8444:HTTPS 监听的 API 管理接口。
配置映射问题,我们可以通过docker cp [容器ID] 指令来拷贝/etc/kong目录下的配置文件:
docker cp -r a4e1d23d7573:/etc/kong/ ./
然后docker run 添加-v指令映射配置文件:
-v /data/kong/kong.conf:/etc/kong/kong.conf \
备注:8001和8444端口是不对外,所有的流量都是通过8000或者8443端口进来。
6、安装konga
Kong是一款强大的API网关,而Konga则是Kong的可视化管理工具,使得API的配置和管理变得更加直观和便捷。本文将深入探讨Konga的技术细节,介绍它的特性、安装过程以及如何通过Konga管理Kong API网关。
- 管理所有 Kong Admin API 对象。
- 支持从远程源(数据库,文件,API等)导入使用者。
- 管理多个 Kong 节点。使用快照备份,还原和迁移 Kong 节点。
- 使用运行状况检查监视节点和 API 状态。
- 支持电子邮件和闲置通知。
- 支持多用户。
- 易于数据库集成(MySQL,PostgresSQL,MongoDB,SQL Server)。
初始化konga数据库:
docker run --rm pantsel/konga:latest -c prepare -a postgres -u postgresql://kong:kong@192.168.254.133:5432/konga_db
启动konga:
docker run -p 1337:1337 \
-e "KONG_DATABASE=postgres" \
-e "KONG_PG_HOST=192.168.254.133" \
-e "KONG_PG_USER=kong" \
-e "KONG_PG_PASSWORD=kong" \
-e "KONG_CASSANDRA_CONTACT_POINTS=kong-database" \
-e "DB_DATABASE=konga_db" \
-e "KONGA_HOOK_TIMEOUT=120000" \
--name konga \
pantsel/konga
验证是否安装成功:http://192.168.254.133:1337
7、创建连接点
Name: kong
Kong Admin URL: http://192.168.254.133:8001
8、Upstreams
Upstreams是Kong网关将流量转发到的多个target的集合,target可以是域名、ip,不同target可以有不同的port,且可分配不同的权重。通过使用upstream,Kong网关提供如下功能:
- 健康检查:Kong网关以特定策略,对target进行探活探死,若target不可用,Kong会将流量转发至其它健康的target;
- 熔断:根据健康检查的状态,对客户端请求进行熔断,防止后端级联服务雪崩;
- 负载均衡:使用ring-blancer将客户端流量均衡负载到健康的target上。
首先我们创建一个名为localfly的upstream:
添加target目标域名和端口,添加本地服务端口192.168.2.224:8000, 并分配权重:
9、SERVICES
抽象层面的服务,他可以直接映射到一个物理服务 (host 指向 ip + port),也可以指向一个 upstream 来做到负载均衡。通俗说,这个service就是后台访问接口配置。
然后添加当前路由规则Route路径:
可以Postman通过 kong的8000端口来请求本地服务服务:
@GetMapping("/v1/page")
public R page(TagParam param) {
Query query = param.toQuery();
PageInfo<Tag> pageInfo = tagService.page(query);
return R.ok().put("pageInfo", pageInfo);
}
10、Plugins
Kong通过插件Plugins实现日志记录、安全检测、性能监控和负载均衡等功能。下面我将演示一个例子,通过启动 key-auth实现简单网关安全检验。
通过指令来创建对应的key-auth验证:
10.1 创建Consumers
通知curl创建用户kkk:
[root@localhost ~]# curl -i -X POST http://localhost:8001/consumers/ --data username=kkk
HTTP/1.1 201 Created
Date: Fri, 17 Nov 2023 14:57:06 GMT
Content-Type: application/json; charset=utf-8
Connection: keep-alive
Access-Control-Allow-Origin: *
Access-Control-Allow-Credentials: true
Content-Length: 139
X-Kong-Admin-Latency: 19
Server: kong/3.4.2
{"updated_at":1700233026,"username":"kkk","tags":null,"id":"ad700f79-8b98-4288-a001-3a1f0475ee7a","custom_id":null,"created_at":1700233026}
10.2 分配Key
为kkk用户分配一个指定的key:
[root@localhost ~]# curl -i -X POST http://localhost:8001/consumers/kkk/key-auth
HTTP/1.1 201 Created
Date: Fri, 17 Nov 2023 15:00:53 GMT
Content-Type: application/json; charset=utf-8
Connection: keep-alive
Access-Control-Allow-Origin: *
Access-Control-Allow-Credentials: true
Content-Length: 190
X-Kong-Admin-Latency: 89
Server: kong/3.4.2
{"key":"0qY0vXv3g8aH6Rz7gXxrHdtIWO3zrq6e","id":"196d65a5-3495-4a6d-93b6-d1378af62572","ttl":null,"tags":null,"created_at":1700233252,"consumer":{"id":"ad700f79-8b98-4288-a001-3a1f0475ee7a"}}
10.3、创建全局的key-auth
将默认的key标签apikey调整为token:
也可以通过指令命令行来创建:
curl -X POST http://localhost:8001/plugins/ --data "name=key-auth" --data "config.key_names=token"
10.4 请求
未使用token请求postman:
添加token请求postman:
10.5 插件
Kong 网关插件概括为如下:
- 身份认证插件:Kong 提供了 Basic Authentication、Key authentication、OAuth2.0 authentication、HMAC authentication、JWT、LDAP authentication 认证实现。
- 安全控制插件:ACL(访问控制)、CORS(跨域资源共享)、动态 SSL、IP 限制、爬虫检测实现。
- 流量控制插件:请求限流(基于请求计数限流)、上游响应限流(根据 upstream 响应计数限流)、请求大小限制。限流支持本地、Redis 和集群限流模式。
- 分析监控插件:Galileo(记录请求和响应数据,实现 API 分析)、Datadog(记录 API Metric 如请求次数、请求大小、响应状态和延迟,可视化 API Metric)、Runscope(记录请求和响应数据,实现 API 性能测试和监控)。
- 协议转换插件:请求转换(在转发到 upstream 之前修改请求)、响应转换(在 upstream 响应返回给客户端之前修改响应)。
- 日志应用插件:TCP、UDP、HTTP、File、Syslog、StatsD、Loggly 等
11、结论
Kong作为一个开源、灵活且功能强大的API网关,为构建健壮的微服务架构提供了可靠的基础。通过深入理解Kong的核心特性和工作原理,开发者可以更好地利用这一工具来管理和保护其API生态系统。在未来,Kong将继续演进,成为更多企业和开发者构建可靠、高性能API的首选工具。
评论区