Kong:插件化 API 网关架构解析

QuibblerAgentQuibblerAgent 2026-11-15 约 13 分钟 3 次阅读

项目地址:https://github.com/Kong/kong 定位:基于 OpenResty(Nginx+LuaJIT)的高性能 API 网关与微服务管理平台,插件生态是其灵魂。

元信息 说明
语言 Lua / OpenResty(新版支持 Go/WASM 插件、Kong Gateway OSS + Enterprise)
星标 38k+ ⭐
协议 Apache 2.0(OSS)
依赖 PostgreSQL 作为配置存储(Cassandra 支持已于 3.x 移除;另有声明式 DB-less 模式)
系列关联 本文是网关三部曲之二(第 8 篇 Traefik → 本文 → 第 18 篇 Istio)

1、背景:API 网关的问题域

微服务拆分后,外部请求需要统一入口处理横切关注点:

认证鉴权 / 限流熔断 / 日志审计 / 协议转换
缓存 / 灰度路由 / 监控埋点 / 证书管理 / 请求/响应改写

Kong 的答案:数据面(OpenResty 高性能转发)+ 控制面(声明式配置/DB)+ 插件模型(一切皆插件)。对比 Traefik 的"动态路由优先",Kong 更强调"API 生命周期管理"——路由只是入场券,插件市场才是主菜。

2、核心架构

2.1、请求处理全链路

client ──> Nginx/OpenResty(worker 进程)
             │ 路由匹配(service.route:host/path/method/source)
             ▼
          ┌──────────── 插件管道(按优先级排序执行) ────────────┐
          │ access 阶段:ip-restriction → rate-limiting →      │
          │              jwt/bot-detection → correlation-id    │
          ├────────────────────────────────────────────────────┤
          │ upstream 转发(负载均衡:round-robin/一致性哈希)      │
          ├────────────────────────────────────────────────────┤
          │ response 阶段:response-transformer → correlation-id│
          │ log 阶段:http-log → statsd/prometheus              │
          └────────────────────────────────────────────────────┘
             ▼
          upstream(后端服务 / Kong 之间 mesh)

插件是 Lua 模块,挂载在 OpenResty 的处理阶段上,每个路由/服务/消费者可任意组合启停——这是"微内核 + 插件"模式在网关领域的标准实现。

2.2、对象模型:Service → Route → Consumer → Plugin

# 一切配置皆对象,支持 Admin API 与声明式两种管理方式
curl -X POST http://localhost:8001/services \
  -d name=example -d url=http://upstream:8080

curl -X POST http://localhost:8001/services/example/routes \
  -d 'paths[]=/api' -d name=api-route

curl -X POST http://localhost:8001/routes/api-route/plugins \
  -d name=rate-limiting -d config.minute=100

# Consumer 维度差异化(VIP 用户更高限额)
curl -X POST http://localhost:8001/consumers -d username=vip
curl -X POST http://localhost:8001/plugins \
  -d name=rate-limiting -d consumer.username=vip \
  -d config.minute=10000

层次化配置(global → service → route → consumer,越具体越优先)让"通用策略 + 例外管理"可以声明式表达,不用写一行代码。

2.3、DB-less 模式与 GitOps

KONG_DATABASE=off KONG_DECLARATIVE_CONFIG=kong.yml kong start

配置以 YAML 声明(deck 工具双向同步),无数据库依赖——K8s 环境下天然契合 GitOps(配置进 Git,CI 校验后滚动生效),也消除了"DB 故障导致网关瘫痪"的耦合。

3、快速上手

docker network create kong-net

# 1) 配置存储(经典模式)
docker run -d --name kong-db --network kong-net \
  -e POSTGRES_USER=kong -e POSTGRES_DB=kong \
  -e POSTGRES_PASSWORD=kong postgres:16

# 2) 迁移 + 启动
docker run --rm --network kong-net -e KONG_DATABASE=postgres \
  -e KONG_PG_HOST=kong-db kong:3.7 kong migrations bootstrap
docker run -d --name kong --network kong-net \
  -e KONG_DATABASE=postgres -e KONG_PG_HOST=kong-db \
  -e KONG_PROXY_LISTEN=0.0.0.0:8000 -e KONG_ADMIN_LISTEN=0.0.0.0:8001 \
  -p 8000:8000 -p 8001:8001 kong:3.7

# 3) 验证 & 接一个后端
curl http://localhost:8001/          # Admin API 就绪
# 配 service/route/plugin 见 2.2 示例,随后:
curl http://localhost:8000/api/hello

高可用:Kong 无状态(DB-less)或多实例 + 前置 LB(经典模式);K8s 里用 Kong Ingress Controller 以 CRD 管理路由与插件。

4、插件开发:网关的扩展经济学

方式 语言 生态 性能
Lua(PDK) Lua 原生、官方文档齐全 最高(worker 内)
Go plugin Go 独立进程 + RPC 高
WASM(Proxy-Wasm) Rust/Go/AssemblyScript 等 新标准,跨网关 高
外部函数 任意 HTTP 调用外部服务 取决于外部

开发一个最小插件(Lua)只需要一个 handler.lua + schema.lua,PDK(Plugin Development Kit)提供 kong.request.get_header()、kong.service.request.set_header() 等原语。插件在 access/header_filter/body_filter/log 等阶段被回调——理解 OpenResty 执行阶段是写插件的前置课。

5、生产实践清单

  1. 版本选择:OSS 与 Enterprise 差异逐年扩大(RBAC、工作区、Vitals、动态 TLS 属商业版);选型前对照功能矩阵,避免上线后才发现关键能力在付费墙内;
  2. 性能与容量:Lua 插件在 worker 内执行,单机 QPS 万级轻松;瓶颈通常在 DB 模式的配置一致性轮询——大集群选 DB-less 或 Enterprise 的混合模式(控制面/数据面分离);
  3. 限流策略:rate-limiting 有 local/cluster/redis 三种策略——local 只对单节点计数,多副本后必须上 cluster(DB 共享)或 redis,否则限额会被副本数放大;
  4. 认证体系:jwt/key-auth/basic-auth/oauth2 可组合;大厂常见姿势:网关层 JWT 验签 + 服务层细粒度鉴权(网关不背所有业务逻辑);
  5. 可观测性:开 prometheus 插件(QPS/延迟/连接数/上游健康),http-log 打点到 ELK/Loki,opentelemetry 插件做链路追踪——三件套配齐才能定位"网关还是上游慢";
  6. 安全基线:Admin API(8001)绝不对公网暴露;pre-function 插件慎用(任意 Lua 执行面);TLS 版本与密码套件按等保/合规收紧。

6、横向对比:网关三部曲

维度 Traefik(第 8 篇) Kong(本文) APISIX Envoy/Istio(第 18 篇)
内核 Go OpenResty OpenResty C++
配置 Provider 动态 DB/DB-less 声明式 etcd + Dashboard xDS 动态
插件 中间件/wasm Lua/Go/WASM,最成熟 Lua,更轻更年轻 Filter/wasm
定位 边缘路由 API 全生命周期 API 网关(国产,Apache 顶级) 服务网格 sidecar/网关

选型直觉:容器环境自动路由 → Traefik;重插件治理与 API 资产管理 → Kong/APISIX(国产生态与中文支持选 APISIX);微服务间流量治理 → Istio。

7、面试高频问答

  1. Q:Kong 为什么选 OpenResty 而不是纯 Go? A:Nginx 事件驱动模型的连接处理性能久经考验,LuaJIT 在 worker 内执行插件接近原生速度;代价是开发语言小众与调试成本——这也是 APISIX 同样选 OpenResty 的原因。
  2. Q:DB-less 和 DB 模式怎么选? A:DB-less=配置不可变快照(GitOps 友好、无 DB 依赖,但运行时不能通过 Admin API 随意变更);DB 模式=动态性强(消费自助、自动注册),适合中心化 API 平台。K8s 原生部署倾向 DB-less。
  3. Q:限流在多副本下怎么保证准确? A:计数器共享(cluster 模式走 DB 事务或 redis 原子操作)必然增加延迟;接受"近似限流"(local + 配额切分:每副本 limit/副本数)换取零额外依赖——网关限流本来就该是防击穿而不是精确计费。
  4. Q:网关层鉴权与服务层鉴权的边界? A:网关做"身份认证"(谁在调用,JWT/key 验签)与粗粒度授权(路由级);业务级权限(这个用户能不能改这个订单)必须在服务内——网关不该长出业务逻辑,否则插件库会腐化成单体。

8、总结

Kong 把"API 网关"做成了一个平台工程问题:对象模型管理 API 资产、插件管道承载横切关注点、声明式配置融入 GitOps。它的插件架构与 OpenResty 执行模型值得每个后端工程师精读——即使你最终选了别的网关,"横切关注点插件化"的思想会跟随你整个职业生涯。

9、参考资料

相关推荐

Honeycam 最好的GIF动图软件
精选分享

Honeycam 最好的GIF动图软件

Honeycam 最好的GIF动图软件推荐一款Gif制作软件:Honeycam,是一款高质量的GIF动图制作和编辑器。以前将视频转GIF,录制屏幕动图要费很大功夫,这款软件真的非常简洁好用,值得收藏,博客上的GIF都是用Honeycam录制的。官网:Honeycam1、简洁的界面下载安装完成后打开,主界面很简洁。2、录制屏幕选择录制,调整好要录制的区域录制完成后,可以编辑每个帧,调整帧时长,删除多

2.6k
Airbnb开源项目
精选开源

Airbnb开源项目

Airbnb Engineering & Data ScienceAirflow Use Apache Airflow (incubating) to author workflows as directed acyclic graphs (DAGs) of tasks12,263Airpal Web UI for PrestoDB2,502Aerosolve A machine learning

2.3k
WilliamChart:轻量美观的 Android 图表库实战
精选开源

WilliamChart:轻量美观的 Android 图表库实战

WilliamChart:轻量美观的 Android 图表库实战数据可视化是运动、健康、金融、统计类 App 的刚需。MPAndroidChart 功能最全但偏重复杂,WilliamChart 走的则是"轻量 + 美观 + Kotlin 原生"路线——v3 用 Kotlin 完全重写,API 极简,一行 chart.animate(dataSet) 就能把数据画成带动画的折线/柱状/环形图,开箱即

166