Kong 是由 Kong Inc.(原 Mashape)开源的高性能云原生 API 网关与微服务管理层。它构建在 Nginx 与 OpenResty 之上,基于 LuaJIT 提供高吞吐、低延迟的流量代理与可扩展的插件体系。

概述与核心定位

在微服务架构和云原生体系中,API 网关位于客户端与后端服务之间,扮演着统一入口与流量看门人的角色。Kong Gateway 提供了如下核心能力:


核心架构与运行机制

架构全景:控制面与数据面

Kong 的架构在设计上解耦了控制面(Control Plane, CP)数据面(Data Plane, DP)

两种部署模式:DB 模式 vs DB-less 模式

模式存储介质配置生效方式适用场景
传统 DB 模式PostgreSQL / Cassandra运行时通过 Admin API 写入数据库,节点通过轮询机制同步到本地共享内存传统虚拟机/容器环境、需要动态通过 REST API 增删改路由的场景
DB-less 模式无外置数据库(内存存储)通过 kong.yml 声明式文件加载,或结合 decK / Kubernetes Ingress Controller (KIC) 动态同步GitOps 流程、Kubernetes 云原生集群、极简高可用架构

底层机制:OpenResty 与共享内存

Kong 基于 OpenResty(Nginx + LuaJIT) 构建,充分利用了 Nginx 的 Master-Worker 多进程非阻塞事件驱动模型:


核心实体与流量模型

Kong 的路由系统围绕一组核心实体构建,各实体之间的关联与流量流向如下:

[ 客户端请求 Client ]
   [ Route (路由匹配规则) ]
   [ Service (后端服务抽象) ]
   [ Upstream (负载均衡集群) ] ── (按权重/轮询分发) ──► [ Target: Backend IP:Port ]

核心实体解析


核心操作与配置方式

使用 Admin API 管理实体

Admin API 默认监听在 8001(HTTP)或 8444(HTTPS)端口,提供标准的 RESTful 接口。

1. 创建 Service

curl -i -X POST http://localhost:8001/services \
  --data name=user-service \
  --data url=http://upstream-user-backend:8080/api/v1

2. 创建 Route

user-service 创建路由,将匹配 /users 路径的请求转发过去:

curl -i -X POST http://localhost:8001/services/user-service/routes \
  --data name=user-route \
  --data "paths[]=/users" \
  --data "strip_path=false"

3. 配置 Upstream 与 Target

实现动态负载均衡与健康检查:

# 创建 Upstream
curl -i -X POST http://localhost:8001/upstreams \
  --data name=user-backend-pool

# 添加 Target 实例
curl -i -X POST http://localhost:8001/upstreams/user-backend-pool/targets \
  --data target="10.0.1.10:8080" \
  --data weight=100

curl -i -X POST http://localhost:8001/upstreams/user-backend-pool/targets \
  --data target="10.0.1.11:8080" \
  --data weight=100

随后将 user-servicehost 字段更新为 user-backend-pool 即可将流量接入负载均衡池。

声明式配置与 decK

在 DB-less 或 GitOps 模式下,使用 kong.yaml 集中声明所有网关配置:

_format_version: "3.0"

services:
  - name: order-service
    url: http://order-api:8080
    routes:
      - name: order-route
        paths:
          - /orders
        strip_path: false
        plugins:
          - name: rate-limiting
            config:
              minute: 100
              policy: local

consumers:
  - username: app-client-01
    keyauth_credentials:
      - key: secret-api-key-123456

通过官方工具 decK 执行差异比对(diff)与平滑同步(sync):

# 验证配置合法性
deck validate -s kong.yaml

# 比较当前网关运行态与配置文件的差异
deck diff -s kong.yaml

# 将配置同步推送到网关
deck sync -s kong.yaml

常用插件体系

Kong 官方与社区提供了数十种插件,覆盖 API 全生命周期的治理需求:

认证与安全(Authentication & Security)

流量控制与可靠性(Traffic Control)

监控与可观测性(Observability)


插件执行生命周期

Kong 插件的执行流程与 OpenResty(Nginx)的处理阶段深度绑定。开发者或使用者理解执行生命周期,对于分析请求流程和编写自定义 Lua 插件至关重要。

生命周期阶段对照表

OpenResty 阶段Kong 插件 Hook 接口执行时机与职责典型操作
init_workerinit_worker()Nginx Worker 进程启动时触发初始化定时器、后台拉取数据、创建连接池
ssl_certificatecertificate()SSL/TLS 握手阶段动态读取证书、根据 SNI 匹配自定义证书
rewriterewrite()接收到请求头部,路由匹配前执行全局重定向、修改原始 URL、早期流量切分
accessaccess()路由匹配完成,转发上游之前执行(最核心阶段)身份认证(JWT/Key-Auth)、鉴权、黑白名单、限流拦截
header_filterheader_filter()接收到上游返回的所有响应头增删改 Response Header(如 CORS、安全头注入)
body_filterbody_filter()接收到上游返回的响应体数据块(流式 chunk)响应体内容脱敏、修改、追加数据
loglog()请求完全响应客户端后异步执行统计耗时、记录日志、上报 Prometheus 指标

插件执行优先级(Priority)

每个插件定义中都包含一个整型数值 PRIORITY。在同一执行阶段(例如 access 阶段):


生产实践与性能调优

1. 数据库缓存与 Worker 同步调优

在 DB 模式下,合理设置配置缓存时间可有效降低数据库负载:

2. 上游 Keepalive 连接池复用

如果未启用长连接池,Kong 对上游后端的每次反向代理都会经历 TCP 三次握手与四次挥手,在高并发场景下会导致大量 TIME_WAIT 连接与端口耗尽:

# 调整 kong.conf 配置参数
upstream_keepalive_pool_size = 512
upstream_keepalive_max_requests = 10000
upstream_keepalive_idle_timeout = 60s

同时确保上游后端服务配置了合理的 keepalive_timeout

3. DNS 解析与负载均衡缓存

Kong 默认使用内置的异步 DNS 解析器:

4. 日志异步化与非阻塞 I/O