跳到主要内容

API 网关与请求路由

API 网关是外部客户端访问后端服务的统一入口。它适合集中处理 TLS、身份验证、路由、限流和协议适配,但仍需把资源级授权和业务不变量留给拥有数据的服务。

1. 网关把公开 API 与内部服务解耦

客户端只依赖稳定的域名和公开 API,不必知道后端实例、部署拓扑和内部协议。网关根据 host、path、method、header 或身份属性选择集群,再通过服务发现选择实例。

后端服务拆分、扩缩容或迁移时,可以在网关保持外部契约稳定。这个边界也让版本兼容、弃用和流量观测有统一入口。

2. 请求沿过滤器链逐步处理

典型路径包括:

  1. 终止 TLS,并限制连接、请求头和正文大小。
  2. 生成或接收 trace ID,规范化必要 header。
  3. 验证身份凭据和 token 的签名、受众、发行者与有效期。
  4. 执行入口级配额、WAF 和粗粒度策略。
  5. 匹配路由并选择目标集群。
  6. 应用超时、有限重试和连接池策略。
  7. 返回响应并记录访问日志与指标。

过滤顺序会影响成本与安全。例如在读取巨大请求体之后才鉴权,会让无效请求先消耗大量资源。

3. 路由规则必须有优先级和版本

精确路径、前缀、正则和 header 条件可能同时匹配。规则应有确定优先级,并在发布前检测重叠、不可达路由和空后端集群。

新路由以带版本的完整配置发布,数据面验证后原子切换;配置失败继续使用最后有效版本。路由变更要支持灰度和快速回退,避免在每台网关上手工修改。

4. 身份验证可以集中,资源授权仍需下沉

网关可以验证 access token,提取主体、租户和 scope,并把经过签名或受保护的身份上下文传给内部服务。内部服务不能信任客户端自行提交的 X-User-Id 等 header,网关应删除外部伪造值后重新写入。

“用户能否修改订单 42”需要读取订单所有者和当前状态,通常由订单服务判断。只在网关验证“已登录”无法阻止水平越权。

5. 超时和重试要服从端到端预算

网关应给每条路由设置总超时,并把剩余 deadline 传播给下游。自动重试只针对明确的瞬时错误和可安全重复操作,并使用尝试上限、退避和重试预算。

若客户端、网关和服务都各自重试三次,一次请求可能形成乘法放大。应明确唯一主要重试层,并让其他层只处理连接建立等局部失败。

6. 限流既保护系统也执行租户配额

入口可以按客户端、用户、租户、API 和成本权重限流。全局配额通常需要共享计数,本地限流响应更快且能在中心限流服务故障时保护单实例。

限流服务不可用时是放行还是拒绝,要按接口风险决定。登录、支付与公开读取可能使用不同策略,并通过明确状态码和重试提示反馈客户端。

7. 网关保持通用能力,避免承载业务编排

把订单聚合、价格计算和复杂状态机放进网关,会让它频繁随业务变化,扩大统一入口的发布风险。通用协议、策略和简单响应聚合可以集中,领域规则应由领域服务负责。

网关自身必须无单点、可水平扩展,并设置连接、并发、pending request 和内存上限。统一入口失效时,后端全部正常也无法对外服务。

8. 用分段指标观察网关

至少记录 route、upstream cluster、响应码、总耗时、上游耗时、连接池等待、重试次数、限流与熔断原因。高基数用户 ID 不应直接成为无限制指标标签,可放入采样日志或 trace。

网关返回 502 或 504 时,要区分没有健康实例、建连失败、上游 reset、超时和网关自身过载。统一错误码不能丢掉内部诊断原因。

9. 常见问题

9.1 所有服务间调用都应该经过外部 API 网关吗

通常不需要。外部网关负责 north-south 流量,内部 east-west 调用可以使用服务发现、sidecar 或内部网关。强制全部内部调用绕到外部入口会增加延迟、容量压力和故障半径。

9.2 网关校验 JWT 后,内部服务可以不鉴权吗

内部服务至少要确认请求来自可信入口,并执行资源和动作级授权。若存在绕过网关的网络路径、异步消息或内部调用,只信任一个 header 会留下越权入口。

10. 面试题

10.1 API 网关应该承担哪些职责,哪些逻辑不应放在网关

出现公司:美团、阿里巴巴

考察重点

  • 统一入口、路由、认证、限流和协议边界。
  • 入口认证与资源级授权的差异。
  • 网关高可用、超时重试和业务逻辑边界。

相关内容:第 1 节“网关把公开 API 与内部服务解耦”至第 8 节“用分段指标观察网关”。

参考回答

API 网关对外提供稳定入口,根据请求属性路由到内部服务,适合统一处理 TLS、身份验证、入口限流、协议适配、超时和访问日志。路由配置要版本化、校验并原子发布,网关本身需要水平扩展和资源上限。

网关可以验证 token 并传递可信身份,但涉及具体资源所有权和状态的授权必须由领域服务完成。复杂业务编排也不应持续堆进网关。自动重试只用于幂等的瞬时错误,并与端到端 deadline、重试预算配合,避免客户端和多层代理重复放大请求。