Kong:一个开源的API网关 | 作者:Aryak Deshpande - Medium

作者:API传播员 · 2025-11-23 · 阅读时间:4分钟
Kong 是一款轻量级、快速且灵活的开源 API 网关和反向代理工具,支持多种部署模式如本地、云端和混合模式,并提供路由、限流、身份验证等核心功能。它允许使用 Golang 或 Lua 编写自定义插件,并可通过 Docker 部署,帮助降低云网关成本,适用于现代 API 管理场景。

Kong:一个开源的 API 网关

Kong 是一款轻量级、快速且灵活的开源 API 请求。它支持多种部署模式,包括本地、云端和混合模式,适用于各种场景。


Kong 的主要功能

Kong 提供了丰富的功能,以下是其核心特性:

  • 路由:支持灵活的请求路由。
  • 限流:提供请求速率限制功能。
  • 身份验证:支持多种身份验证方式。
  • IP 白名单/黑名单:增强安全性。
  • 请求转换:支持传入和传出的请求转换。
  • 日志记录:记录请求日志,便于追踪和分析。
  • 指标监控:提供详细的性能指标。

Kong 的一大亮点是支持使用 Golang 或 Lua 编写自定义插件,满足企业的特定需求。此外,Kong 还内置了大量插件,能够处理第三方 API 请求或对请求进行转换和预处理,例如解密有效负载数据。


Kong 的优势

如果您的组织正在使用 AWS Lambda 或其他付费云网关解决方案,Kong 可以帮助您显著降低成本,每月节省高达 1000 美元。它支持声明式 YAML 配置,并可运行在独立模式或集群模式下。

Kong 提供两种运行模式:

  • 无数据库模式:适用于轻量级场景。
  • 数据库模式:支持 Postgres 数据库(较新版本已移除对 Apache Cassandra 的支持)。

此外,Kong 是 Kubernetes 原生工具,支持容器化部署,能够无缝集成到现代云原生架构中。


使用 Docker 部署 Kong

以下是通过 Docker 部署 Kong 的步骤:

1. 创建 Docker 网络和容器

docker network create kong-net

docker run --rm --network=kong-net 
 -e "KONG_DATABASE=postgres" 
 -e "KONG_PG_HOST=127.0.0.1" 
 -e "KONG_PG_PASSWORD=kong" 
 -e "KONG_PASSWORD=kong" 
 kong/kong-gateway:2.8.1.0-alpine kong migrations bootstrapdocker run -d --name kong-gateway 
 --network=kong-net 
 -e "KONG_DATABASE=postgres" 
 -e "KONG_PG_HOST=127.0.0.1" 
 -e "KONG_PG_USER=kong" 
 -e "KONG_PG_PASSWORD=kong" 
 -e "KONG_PG_DATABASE=kong" 
 -e "KONG_PG_PORT=5432" 
 -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 8449:8443 
 -p 8001:8001 
 -p 8444:8444 
 -p 8002:8002 
 -p 8445:8445 
 -p 8003:8003 
 -p 8004:8004 
 kong/kong-gateway:2.8.1.1-alpine

2. 添加服务

curl -i -X POST 
 --url http://localhost:8001/services/ 
 --data 'name=service-a' 
 --data 'url=http://127.0.0.1:9091'

curl -i -X POST 
 --url http://localhost:8001/services/ 
 --data 'name=service-b' 
 --data 'url=http://127.0.0.1:9082'

3. 添加路由

curl -X POST 
 --url "http://localhost:8001/services/service-a/routes" 
 --data 'paths[]=/a'

curl -X POST 
 --url "http://localhost:8001/services/service-b/routes" 
 --data 'paths[]=/b'

4. 创建消费者

curl -X POST 
 --url "http://localhost:8001/consumers/" 
 --data "username=aryak"

5. 添加 OAuth 2.0 插件

curl -X POST 
 --url http://localhost:8001/plugins/ 
 --data "name=oauth2" 
 --data "config.scopes[]=email" 
 --data "config.scopes[]=phone" 
 --data "config.scopes[]=address" 
 --data "config.mandatory_scope=true" 
 --data "config.enable_authorization_code=true" 
 --data "config.enable_client_credentials=true" 
 --data "config.enable_implicit_grant=true" 
 --data "config.enable_password_grant=true"

6. 生成消费者凭据

curl -X POST 
 --url "http://localhost:8001/consumers/aryak/oauth2/" 
 --data "name=service-a" 
 --data "redirect_uris[]=http://localhost:8000"

7. 生成访问令牌

curl -X POST 
 --url "https://localhost:8449/a/oauth2/token" 
 --data "grant_type=client_credentials" 
 --data "scope=email address" 
 --data "client_id=rXVj9YffHl4OhE5UNOOrX19DgQc3ULhu" 
 --data "client_secret=ufYBBVWFtlSXcJ9Fdf6UNvppMvv3VDF0" 
 --insecure

返回结果示例:

{"expires_in":7200,"access_token":"xMlIkw4b1hvPShf8v8sINrwkkXLA9FTn","token_type":"bearer"}

默认情况下,访问令牌的有效期为 2 小时,您可以根据需求进行配置。


自定义插件开发

Kong 提供了强大的插件开发工具包,支持用户根据需求对请求和响应进行转换。如果需要插件的源代码,请随时与作者联系。


通过本文的介绍,您可以快速上手 Kong 的基本功能和部署流程。Kong 的灵活性和强大的插件支持,使其成为现代 API 管理的理想选择。

原文链接: https://medium.com/@aryak.deshpande0512/kong-an-open-source-api-gateway-ffc91f474216