跳到主要内容

API 网关与 BFF

API 网关如何把内部服务变成统一入口?​

  • API 网关: 位于客户端与后端服务之间,隐藏内部拓扑并提供面向客户端的接口入口;
  • 粒度问题: 微服务接口可能比页面需求细,一个页面直接调用多个服务会增加客户端复杂度;
  • 接口组合: 网关可以聚合需要的数据,但应控制同步依赖数量与总体超时;
  • 职责边界: 网关承担入口策略,核心业务规则仍应由相应服务负责,避免网关演变成另一个巨型单体;

网关通常集中哪些横切能力?​

类别典型能力
身份与访问认证、授权、IP 访问控制
路由反向代理、服务发现、负载分配、版本选择
流量保护限流、节流、超时、重试、熔断
性能缓存、请求聚合
运维日志、指标、追踪
  • 产品边界: 并非所有网关都原生支持所有协议与功能,HTTP、WebSocket 或其他流量需要逐项确认;
  • 重试边界: 网关自动重试写入可能重复执行,应结合请求幂等与后端状态语义;
  • 授权边界: 网关识别用户不代表每个后端对象访问都已获准,资源级授权仍需校验;

网关怎样避免拖累整个系统?​

  • 容量: 所有入口流量集中后需要独立扩容,限制昂贵聚合并观察尾延迟;
  • 可用性: 多实例和明确接管机制避免单点,配置错误也应能快速回滚;
  • 配置成本: 路由、版本和策略随服务增加而复杂,应保持规则可审查;
  • 收益评估: 用客户端调用简化与治理收益对照新增延迟和运维开销;

BFF 如何为不同客户端提供合适的数据?​

  • BFF: Backend For Frontend,为特定前端建立专用后端适配层,例如移动端和桌面端分别聚合所需数据;
  • 处理路径: 从领域服务取数,筛选、格式化并组合成前端需要的形状;
  • 适用条件: 单一通用 API 为多个界面反复定制,已经带来明显复杂度或带宽浪费;
  • 权衡: 每种客户端更容易独立演进,但增加适配服务数量并可能重复逻辑;
  • GraphQL: 可作为 BFF 的接口表达方式,但 BFF 并不要求使用 GraphQL;

网关与 BFF 怎样分工?​

  • 网关: 优先处理整个系统共享的入口路由和保护策略;
  • BFF: 优先处理某类客户端特有的数据组合与交互适配;
  • 原文示例: Amazon API Gateway、Apigee、Azure API Management、Kong,选型以所需边界为准;