侧边栏壁纸
博主头像
拾荒的小海螺博主等级

只有想不到的,没有做不到的

  • 累计撰写 140 篇文章
  • 累计创建 15 个标签
  • 累计收到 0 条评论

目 录CONTENT

文章目录
OPS

Docker:深入探讨Kong开源API 网关的力量

拾荒的小海螺
2024-06-14 / 0 评论 / 0 点赞 / 6 阅读 / 9835 字

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直接访问:

1718377295205.jpg

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

1718377335726.jpg

8、Upstreams

Upstreams是Kong网关将流量转发到的多个target的集合,target可以是域名、ip,不同target可以有不同的port,且可分配不同的权重。通过使用upstream,Kong网关提供如下功能:

  • 健康检查:Kong网关以特定策略,对target进行探活探死,若target不可用,Kong会将流量转发至其它健康的target;
  • 熔断:根据健康检查的状态,对客户端请求进行熔断,防止后端级联服务雪崩;
  • 负载均衡:使用ring-blancer将客户端流量均衡负载到健康的target上。

1718377356914.jpg

首先我们创建一个名为localfly的upstream:

添加target目标域名和端口,添加本地服务端口192.168.2.224:8000, 并分配权重:

1718377373922.jpg

9、SERVICES

抽象层面的服务,他可以直接映射到一个物理服务 (host 指向 ip + port),也可以指向一个 upstream 来做到负载均衡。通俗说,这个service就是后台访问接口配置。

1718377389244.jpg

然后添加当前路由规则Route路径:

1718377405261.jpg

可以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);
}

1718377422910.jpg

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:

1718377442159.jpg也可以通过指令命令行来创建:

curl -X POST http://localhost:8001/plugins/ --data "name=key-auth" --data "config.key_names=token"

10.4 请求

未使用token请求postman:

1718377467538.jpg

添加token请求postman:

1718377484446.jpg

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的首选工具。

0

评论区