跳转到内容

KrakenD — 把多个后端聚合成一次响应的高性能 API 网关

是什么

KrakenD 是一个用 Go 写的 API 网关,主打”把多个后端的响应聚合成一次响应返给前端”。日常类比:像餐厅大堂的总服务员——你点了三道菜,他自己跑去找三个厨房,把三盘菜端上来时已经摆好成一桌,你只交一次单。

你写一份 krakend.json 声明:

{
"endpoints": [{
"endpoint": "/home",
"backend": [
{ "url_pattern": "/users/{id}", "host": ["http://user-svc"] },
{ "url_pattern": "/orders/{id}", "host": ["http://order-svc"] }
]
}]
}

KrakenD 收到 /home 请求就并发调 user-svc + order-svc,把两个 JSON 合并成一份返回。整个过程无状态——重启即丢历史,可以横向扩到一百台。

为什么重要

不理解 KrakenD(或同类聚合网关),下面这些事都没法解释:

  • 为什么 BFF(Backend For Frontend)这么火——它就是把”聚合 + 裁剪”从 Node.js 业务代码搬到了网关层
  • 为什么微服务一多必须有网关——客户端不可能挨个去发现 50 个服务,鉴权也只想做一次
  • 为什么 KrakenD 配置一改就生效却号称”高性能”——Go 编译器把 JSON 配置在启动时静态化成内部路由表
  • 为什么开源项目要分 CE 和 Enterprise——社区版做基础聚合,企业版做集群 / WAF / 多租户

核心要点

KrakenD 的能力可以拆成 三层

  1. 声明式 endpoint:你只描述”输入 URL → 调哪些后端 → 字段怎么挑”,不写 if/else。类比:HTML 的 <form action>,你写位置不写网络代码。

  2. 并发聚合(aggregation):一个外部请求扇出成 N 个内部请求,KrakenD 用 goroutine 并发等齐再合并。类比:你叫外卖同时点麦当劳和星巴克,骑手等齐再一起上门。

  3. 中间件链(middleware):鉴权 / 限流 / 缓存 / 转换都是声明里加一段配置,按顺序串起来。类比:相机的滤镜链——同一张图依次过黑白、模糊、加水印。

三层叠起来 = 一份 JSON 配置 → 一台跑得飞快的网关。

实践案例

案例 1:BFF 聚合首页数据

移动端首页要展示”用户 + 订单 + 推荐”三段,原本要发 3 个 HTTP 请求:

{
"endpoint": "/v1/home",
"backend": [
{ "url_pattern": "/u/{user_id}", "host": ["http://user"] },
{ "url_pattern": "/o/{user_id}", "host": ["http://order"] },
{ "url_pattern": "/r/{user_id}", "host": ["http://reco"] }
]
}

逐部分解释

  • KrakenD 收到 /v1/home?user_id=42 → 自动把 {user_id} 替换成 42
  • 三个后端并发被调用,最慢那个决定整体延迟
  • 默认行为:把三个 JSON 用各自前缀合并成一份返回给客户端

案例 2:把老 XML 服务对外暴露成 JSON

{
"endpoint": "/products",
"backend": [{
"url_pattern": "/legacy.xml",
"host": ["http://legacy"],
"encoding": "xml"
}]
}

KrakenD 自动把 XML 解析成 map,再以 JSON 输出。前端不用动,老服务也不用改——这种透明协议转换是网关层最值钱的能力之一。

案例 3:在网关层加 JWT 鉴权 + 限流

{
"endpoint": "/private/me",
"extra_config": {
"auth/validator": { "alg": "RS256", "jwk_url": "..." },
"qos/ratelimit/router": { "max_rate": 100 }
}
}

JWT 解出来 ok 才往后转,每秒最多 100 次。鉴权一次解所有后端都信任——后端服务不再各自校验 token,省心。

踩过的坑

  1. 配置文件爆炸:endpoint 多起来 krakend.json 几千行难维护,必须用 flexible-config 模板或拆 partials,否则改一行得 review 全文。

  2. 慢后端拖慢整体:聚合时任一后端超时整个响应都被拖慢,每个 backend 必须单独配 timeout + 降级返回(用 static response 兜底)。

  3. CE 与企业版差距大:高级限流 / 集群配置 / WAF / 多租户都只在 Enterprise,CE 在生产跑大流量前先确认你需要的功能没被砍。

  4. 字段映射写错没人发现:用 mapping / target / whitelist 操作 JSON 字段是字符串路径,写错只会”返回字段为空”不会报错,必须 krakend check -t -d 在 CI 里跑。

适用 vs 不适用场景

适用

  • BFF 模式:一个页面要拼 3+ 个后端
  • 老服务协议转换(XML / SOAP → JSON)
  • 微服务统一鉴权 / 限流 / 缓存入口
  • 流量小到中等(单实例万级 QPS 够用)的 API 网关

不适用

  • 超大规模 L4/L7 流量(数十万 QPS)→ 用 Envoy / nginx
  • 需要复杂动态路由 / canary 灰度 / service mesh → 用 Istio / Linkerd
  • 强事务 / 长连接(WebSocket 推送中心)→ 不是网关该管的
  • 团队需要 GUI 界面管理(声明式 JSON 上手有门槛)→ 看 kong

历史小故事(可跳过)

  • 2016 年:西班牙工程师 Albert Lombarte 在 Devops Faith 工作时为内部用造了 KrakenD,开源到 GitHub
  • 2018 年:项目热度起来,团队成立独立公司 KrakenD(C.A.),全职维护
  • 2020 年:拆出 krakend-ce(社区版 Apache 2.0)和 KrakenD Enterprise(商业版),分流维护
  • 2022-2025:进 CNCF Landscape API Gateway 类目,跟 Kong / Tyk / Traefik 一起被列为主流选项

学到什么

  1. 聚合是网关最差异化的能力——鉴权 / 限流大家都做,“一次调多个后端合成一份响应”才是 BFF 的核心
  2. 声明式 > 命令式:配置文件能跑就不写代码,配置版本化天然是 GitOps
  3. 无状态是水平扩展的前提——KrakenD 不存 session,挂一台不影响其他实例
  4. CE / EE 双轨是开源商业化常见模式:社区版打口碑、企业版赚钱

延伸阅读

关联

  • kong —— Lua + Nginx 写的 API 网关,插件生态大但配置复杂
  • traefik —— Go 写的反向代理,自动服务发现强,聚合能力弱
  • caddy —— Go 写的 Web 服务器 + 反代,HTTPS 自动化是亮点
  • nginx —— C 写的元老级反代,性能天花板但配置语法老
  • haproxy —— C 写的 L4/L7 负载均衡器,企业级稳定
  • gin —— Go 流行 web 框架,KrakenD 内部部分组件用类似思路
  • fiber —— Go web 框架(Express 风格),高性能候选

反向链接

  • caddy —— Caddy — 自动 HTTPS Web 服务器
  • envoy —— Envoy — 把网络通信从业务代码里抠出来的代理进程
  • fiber —— Fiber — 把 Express 写法搬到 Go 上的高性能 web 框架
  • gin —— Gin — Go 写 web API 的事实标准框架
  • haproxy —— HAProxy — 高性能 LB,TCP/HTTP 双层负载均衡
  • kong —— Kong — 基于 nginx + Lua 的云原生 API 网关
  • nginx —— nginx — 高性能 Web 服务器
  • tyk —— tyk — Go 实现的开源 API 网关,自带门户和多协议转换