← Back to Blog

网关不是转发器:把 API 网关做成三层能力的完整方法

24 阅读 点赞

很多团队第一次引入 API 网关,都是被同一个问题逼出来的:前端要调十几个微服务,域名散落各处,鉴权逻辑在每个服务里各写一遍,改一次规则要发十次版。于是有人提议”加个网关吧”——所有流量先过一个统一入口,问题似乎就解决了。可半年后再看,这个网关往往变成了两种东西:要么是一个臃肿的”万能中间层”,什么逻辑都往里塞,改一行配置全站提心吊胆;要么是一个脆弱的转发器,一挂全挂,成了整个系统里最不敢动的那个组件。

API 网关作为统一流量入口的抽象结构示意图
网关的第一层职责:把外部流量收拢到唯一入口,再决定它去向哪里

问题不在网关本身,而在于大多数人把网关当成”一个要装的东西”,而不是”一层要设计的能力”。真正做得好的网关,是在三个层次上分别回答了三个不同的问题。这篇文章就把这三层拆开讲清楚。

第一层:流量入口——把”谁进来、怎么进来”讲清楚

网关最直观的职责是”门卫”。所有外部请求先到网关,由网关决定:这个请求能不能进来、进来后转给谁、以什么方式转。这一层看起来最简单,但恰恰是最容易埋雷的地方。

先看路由。很多团队的路由规则是”加一个服务就加一条规则”,时间一长,几百条规则层层叠加,谁也不敢删——因为没人知道哪条还在被用。更好的做法是把路由规则本身当成代码来管理:用声明式配置(YAML 或 API)描述,进版本库,走评审流程,并且定期做”未命中路由”的统计。哪些规则一个月内零命中,就该被标记为待清理。路由不是”配一次就永久生效”,它是一份需要持续维护的契约。

再看鉴权。鉴权的关键不是”在哪里验”,而是”验完之后信息怎么传递”。一个常见的坏味道是:网关验完 JWT,把整个 token 原样透传给下游,每个服务再自己解析一遍。结果是解析逻辑、过期策略、白名单在十几个服务里各有一份,改一个 claim 语义要改十几处。正确的做法是:网关是唯一验签的地方,验完之后把身份信息转换成标准化的内部头(比如 X-User-Id、X-Tenant-Id、X-Scope),下游只信任这些头,完全不再碰 token。这样下游服务既简单又安全——它们甚至不需要知道 JWT 的存在。

还有限流和熔断的位置。这一层做的是”粗粒度保护”:按 IP、按租户、按接口维度限制总入口流量,防止某个调用方把整个系统打垮。它的目标不是精确控制,而是”兜住底线”。真正细粒度的业务级限流(比如”每个用户每分钟最多下单 5 次”)应该放在业务服务里,因为只有业务自己知道什么算一次有效操作。把业务规则写进网关,等于让网关承担了它不该承担的知识,这是网关变臃肿最常见的起点。

第二层:协议适配——让前后端不必互相将就

网关的第二层价值,往往被低估:它是协议和形态的转换器。外部世界用 HTTP/JSON、REST、GraphQL、gRPC-Web 等各种方式说话,内部服务可能用的是 gRPC、Thrift,或者干脆是老旧系统只认 XML。如果没有网关做转换,每个前端都得适配后端的每一种脾气。

网关三层能力由外到内层层收敛的数据可视化概念图
入口、转换、观测——三层能力层层收敛,各自回答不同的问题

举个具体的例子。移动端最怕的是”一次页面请求要串行调五个接口”,网络往返叠加起来,首屏就慢得没法看。如果网关具备响应聚合能力,就可以暴露一个 /mobile/home 这样的聚合接口,由网关在内部并发调用用户、订单、消息三个服务,合并成一份裁剪过的 JSON 返回。移动端只发一次请求,流量小了,速度也上去了。

但这里有个明确的边界:聚合可以做,业务判断不能做。网关可以决定”并发调三个接口再合并结果”,但不能决定”用户是 VIP 所以折扣打八折”——后者是业务规则,放进网关就成了隐形的业务逻辑黑洞,测试、排查、回滚都会变得极其痛苦。一条实用的判断标准是:如果这段逻辑需要知道领域名词(订单、库存、优惠券),它就不属于网关。

另外,协议转换还有一个隐性收益:它让内部服务获得了自由。因为对外统一由网关暴露,内部服务可以放心地从 REST 迁到 gRPC,可以拆可以合,可以换语言重写,只要网关的对内接口不变,外部调用方完全无感。这也是网关最被低估的价值之一——它为内部架构演进提供了缓冲垫。

第三层:可观测与治理——让网关自己成为”可解释的”

最后一层,是把网关从一个”黑盒转发器”变成”整个系统的观测窗”。所有流量都经过网关,意味着网关天然掌握了全局视角:哪个接口最慢、哪个租户最费资源、哪次上线后错误率突增。这些信息如果不采集、不暴露,网关就只承担了成本,没有产生洞察。

要做的事有三件。第一,统一打标。在每个请求进入网关时生成或透传一个 trace id,写进下游所有调用的头里。这样一次用户投诉,你可以从网关日志一路追到具体某个服务的某条 SQL,而不是在十几个服务的日志里大海捞针。第二,记录关键指标:按路由维度的 QPS、P99 延迟、错误码分布、上游/下游耗时拆分。特别要区分”网关自身耗时”和”后端耗时”,否则一旦变慢,你连先怀疑谁都不知道。第三,让配置变更是可审计的。网关配置改动的影响面是整个系统,必须记录”谁、什么时候、改了什么、为什么”,并且能做到秒级回滚。

深夜运维工程师桌面上的网关流量拓扑全息屏幕
可观测的网关,才是整个系统的观测窗,而非黑盒转发器

这三件事听起来都是”基础设施”的事,但它们决定了一个网关能不能长期活下去。一个没有可观测性的网关,运维只能靠重启和猜测;一个有可观测性的网关,才敢承接改配置、做灰度、做容量治理这些真正有价值的动作。

结语

回到开头那个问题:为什么很多网关最后都变成了不敢动的大泥球?因为大家只想着”把流量收进来”,却没有在入口、转换、观测这三个层次上分别划清职责边界。职责一旦模糊,新需求就总能找到理由塞进网关——因为它”就在那儿,改起来最快”。而每一次这样的”顺手”,都是往泥球上又糊了一层。

所以设计网关时不妨反复问三个问题:这个逻辑需不需要知道业务领域名词?把它放在这里,会不会让网关承担不属于它的知识?如果网关挂了,这个能力有没有降级的余地?想清楚这三个问题,网关才能既守住入口,又不变成负担。工具从来不是问题,边界才是。

💬 发表评论