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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

拾荒的小海螺

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值