1. BFF 模式概述

1.1 起源:当“一刀切”的后端不再够用

BFF(Backend For Frontend)模式由 Sam Newman 和 Phil Calçado 在 2015 年前后提出,源于微服务架构在移动端与 Web 端共存场景下的真实痛点:

  • 移动端(iOS/Android) 需要轻量、聚合、低带宽的 JSON 响应,且对屏幕适配、分页、图片尺寸有特殊要求。
  • 桌面 Web 端 可以承载更丰富的字段、更复杂的交互,但需要更快的首屏渲染和更少的 API 调用次数。
  • 传统单体后端 或 通用 API Gateway 只能提供一套“中间值”响应,两端都不满意。
关键触发点:SoundCloud 在实践微服务时发现,为移动端和 Web 端维护同一个 API 层导致两端互相妥协、迭代效率下降。BFF 正是为解决这种“前端多样性”与“后端通用性”之间的冲突而诞生。

1.2 核心思想:为每个前端消费端定制一个专属后端

BFF 的核心原则可以概括为 “一个前端,一个 BFF”:

  1. 按客户端类型拆分 —— Mobile BFF、Web BFF、IoT BFF 各自独立部署和演进。
  2. 聚合与裁剪 —— BFF 负责调用下游微服务,将数据组装成前端恰好需要的结构,不多不少。
  3. 协议适配 —— 将后端 gRPC/Thrift/内部协议转换为前端友好的 REST/GraphQL。
  4. 前端团队自治 —— 前端团队可以拥有并维护自己的 BFF,减少跨团队协调成本。
一句话总结:BFF 是前端的“专属翻译官”和“数据管家”,而不是通用的“API 网关”。

1.3 与传统后端架构的区别

下表从多个维度对比 传统单体后端、通用 API Gateway 和 BFF 模式:

对比维度 传统单体后端 通用 API Gateway BFF 模式
服务粒度 一个应用服务所有前端 统一入口,路由转发 每个前端独立部署
数据裁剪 返回全量字段,前端自行过滤 有限字段过滤(如 GraphQL) 精确按需聚合,零冗余
协议转换 通常只暴露 HTTP/REST 支持多协议转换 按前端需求定制协议
团队归属 后端团队维护 平台/中间件团队维护 前端团队拥有并维护
变更影响 修改影响所有客户端 网关规则变更影响全局 仅影响对应前端
部署频率 低(周/月) 中(天/周) 高(可随前端发版)
典型场景 PC 管理后台 多端统一鉴权/限流 移动 App + Web 双端差异化

1.4 BFF 在微服务架构中的位置

下图展示了 BFF 在典型微服务架构中的边界与职责:

BFF 在微服务架构中的位置 iOS App Android App Web SPA Mobile BFF Web BFF 用户服务 订单服务 商品服务 支付服务 用户 DB 订单 DB 商品 DB 每个 BFF 只服务于一个前端类型,聚合下游微服务数据,按需裁剪后返回

1.5 BFF 的典型适用场景

  • 多端差异化严重 —— 移动端需要分页+缩略图,Web 端需要完整富文本+评论列表。
  • 前端团队独立迭代 —— 每个前端团队可以独立修改自己的 BFF,不阻塞其他端。
  • 后端微服务数量多 —— 前端需要聚合 3~5 个微服务的数据,BFF 承担编排职责。
  • 协议/数据格式不统一 —— 后端部分服务使用 gRPC,部分使用 REST,BFF 统一转换为前端格式。
注意:BFF 不是银弹。如果前端类型单一(仅 Web 端),或后端已经是 GraphQL 统一层,引入 BFF 可能增加不必要的复杂度。BFF 的核心价值在于“差异化”,而非“统一”。

1.6 本章小结

知识点 关键结论
起源 为解决移动端与 Web 端对后端 API 的差异化需求而诞生
核心思想 一个前端类型对应一个专属后端,按需聚合与裁剪数据
与传统架构区别 BFF 按前端拆分、前端团队自治、变更影响范围小
适用场景 多端共存、微服务数量多、前端团队独立迭代