目前市场上网关产品有很多选择,常用的有Nginx、OpenResty、Zuul2.0、Spring Cloud Gateway等。最新较为流行有Kong Gateway、Traefik、Envoy和APISIX等。目前没有太多资料对比各个API网关产品市场份额占比,但是Kong的产品Kong Gateway下载量超过2.7亿次,每月活跃实例达到270万,这表明其在API网关市场中是具有较高的使用率和认可度。
一、Kong简介
目前Kong提供了很多产品和特性,除了我们常用的Kong Gateway、还有Kong Connect、Kong Mesh等。本文也主要是讲Kong Gateway的快速安装运行。对其他的产品特性感兴趣的同学,也可以去官网查阅学习。
Kong Gateway不单单是一个低耗能、高性能的API 网关,还具备高度可定制的特性。同时提供了免费和企业版本。免费版本理所当然地提供了强大的社区支持以及开源特性。
高性能
Kong Gateway本身是基于OpenResty的,而OpenResty又是基于Nginx。站在巨人的肩膀上,Kong的起点就很高。Nginx 本身就是一个高性能的 HTTP 服务器和反向代理。Nginx 的事件驱动、异步处理和高效的内存管理使得 Kong 在处理大量请求时表现出色。那OpenResty在Nginx的基础上又做出了哪些亮眼的成绩呢?我觉得的最突出的一点是,拔高了Nginx的定制化功能。OpenResty通过与 LuaJIT 集成,OpenResty 可以在处理 HTTP 请求时动态执行 Lua 代码。而Lua 是一种轻量级且高效的脚本语言,具有简单易学、高效运行等特点。通过 Lua,开发者可以轻松编写复杂的业务逻辑和功能。
扩展性
前面说了Kong Gateway基于OpenResty,而OpenResty本身提供了丰富的模块插件功能。Kong Gateway在OpenResty的基础上也提供了大量的官方插件供选择,比如key-auth,基于API 密钥的身份认证,rate-limite,限制客户端对 API 的访问速率。但是我们也可以根据业务需求自定义插件,借助官方PDK工具,实现我们自己的业务逻辑代码。
二、安装Kong
Kong Gateway最新的版本是3.6。提供了K8S、Docker和Linux等常规安装方式。为了快速体验Kong Gateway的功能特性,我们选择用Docker的方式。
基础准备工作
- 创建docker network
docker network create kong-net
- 启动PostgreSQL 容器
docker run -d --name kong-database \
--network=kong-net \
-p 5432:5432 \
-e "POSTGRES_USER=kong" \
-e "POSTGRES_DB=kong" \
-e "POSTGRES_PASSWORD=kongpass" \
postgres:13
- 准备kong gateway的数据资源
docker run --rm --network=kong-net \
-e "KONG_DATABASE=postgres" \
-e "KONG_PG_HOST=kong-database" \
-e "KONG_PG_PASSWORD=kongpass" \
-e "KONG_PASSWORD=test" \
kong/kong-gateway:3.6.1.3 kong migrations bootstrap
启动Kong Gateway
在上一节基础准备工作完成后,就可以运行kong gateway了。
- 运行以下命令启动kong gateway
docker run -d --name kong-gateway \
--network=kong-net \
-e "KONG_DATABASE=postgres" \
-e "KONG_PG_HOST=kong-database" \
-e "KONG_PG_USER=kong" \
-e "KONG_PG_PASSWORD=kongpass" \
-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" \
-e "KONG_ADMIN_GUI_URL=http://localhost:8002" \
-e KONG_LICENSE_DATA \
-p 8000:8000 \
-p 8443:8443 \
-p 8001:8001 \
-p 8444:8444 \
-p 8002:8002 \
-p 8445:8445 \
-p 8003:8003 \
-p 8004:8004 \
kong/kong-gateway:3.6.1.3
验证运行结果
- 发送请求,使用管理 API 访问 /services 端点。预期成功的话是能返回200的状态码
curl -i -X GET --url http://localhost:8001/services
- 访问kong admin gui,浏览器输入http://localhost:8002