1. BFF 架构概述

1.1 BFF 模式的定义

BFF(Backend For Frontend,服务于前端的后端) 是一种架构模式,由 Sam Newman 与 Phil Calçado 在 2015 年前后提出。其核心思想是:为每一种前端客户端(Web、iOS、Android、小程序等)分别构建一个专属的后端服务,该服务负责聚合下游微服务的数据、裁剪响应字段、适配客户端协议,从而让前端不再直接面对复杂的微服务网络。

关键认知: BFF 不是一种新技术栈,而是一种职责分离的组织方式。它把“前端需要什么数据”的编排逻辑从通用后端中剥离,交给离前端最近的中间层处理。

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

在典型的微服务架构中,BFF 位于客户端网关与下游业务微服务之间,充当“中间协调层”。下图展示了 BFF 在整体架构中的位置与交互关系:

BFF 在微服务架构中的位置 Web 客户端 iOS 客户端 Android 客户端 Web BFF iOS BFF Android BFF API Gateway(统一入口) 用户服务 订单服务 商品服务 BFF 层:每个客户端专属,聚合裁剪数据;API Gateway:统一路由、认证、限流

从图中可以看出:

  • 客户端层:Web、iOS、Android 各自拥有不同的屏幕尺寸、交互逻辑和数据需求。
  • BFF 层:每个客户端对应一个专属 BFF,负责调用下游服务并组装响应。
  • API Gateway:作为统一入口,处理跨切面关注点(认证、限流、日志),再将请求路由到对应的 BFF。
  • 微服务层:业务能力提供者,不感知前端差异。

1.3 BFF 与 API Gateway 的区别

BFF 和 API Gateway 经常被混淆,但它们在职责、粒度、数量和组织方式上有本质区别。下表从多个维度进行对比:

对比维度 BFF(Backend For Frontend) API Gateway
核心职责 数据聚合、字段裁剪、协议适配、UI 编排 统一入口、路由转发、认证鉴权、限流熔断
服务粒度 细粒度,面向特定客户端(Web / iOS / Android) 粗粒度,面向所有客户端或外部系统
部署数量 通常与前端客户端数量一致(2~5 个) 通常全局 1~2 个(主备或分区)
变更频率 高,随前端 UI 迭代频繁调整 低,基础设施层变更需谨慎
团队归属 前端团队或全栈团队维护 中间件或基础设施团队维护
是否包含业务逻辑 包含编排逻辑,但不包含核心业务规则 不包含业务逻辑,纯基础设施能力
典型技术 Node.js(Express / Koa)、Java(Spring Cloud Gateway 作为 BFF) Kong、Zuul、Spring Cloud Gateway、Envoy
实践要点: 在大型微服务架构中,API Gateway 和 BFF 通常分层共存。API Gateway 处理全局横切关注点,BFF 处理前端专属编排。不要试图让 API Gateway 承担 BFF 的职责,否则会导致 Gateway 变得臃肿且难以维护。

1.4 为什么需要 BFF?—— 典型痛点场景

在没有 BFF 的架构中,前端直接调用多个微服务会面临以下问题:

  1. 网络开销大:一个页面需要 5~8 次 HTTP 调用才能获取完整数据。
  2. 数据过载:微服务返回的通用模型包含大量前端不需要的字段。
  3. 协议不匹配:后端使用 gRPC/Thrift,前端需要 REST/GraphQL。
  4. 认证逻辑分散:每个前端都要重复实现 token 刷新、签名逻辑。
  5. 变更影响面大:后端接口重构会同时影响所有前端。

引入 BFF 后,上述问题得到有效解决:

  • BFF 将多次调用合并为一次,减少网络往返。
  • BFF 只返回前端需要的字段,降低传输量。
  • BFF 在内部调用 gRPC,对外暴露 REST/JSON。
  • BFF 统一处理认证逻辑,前端只需传递 token。
  • 后端接口变更时,只需修改 BFF 的适配层,前端无感知。
注意: BFF 不是银弹。引入 BFF 会增加运维节点数量、引入额外的网络延迟(一跳),并且要求团队具备全栈能力。在小型项目或单体应用中,BFF 的收益可能不足以抵消其复杂度。

1.5 BFF 的常见实现模式

根据团队技术栈和场景需求,BFF 通常有以下三种实现模式:

模式 描述 适用场景 示例技术
纯聚合层 BFF 只做数据聚合与转发,不包含任何业务逻辑 前端团队技术栈以 Node.js 为主,后端微服务成熟 Node.js + http-proxy-middleware
轻编排层 BFF 包含简单的条件判断、数据转换、字段裁剪 需要为不同客户端定制响应格式 Express / Koa + axios
GraphQL BFF BFF 暴露 GraphQL 端点,由前端按需查询 前端数据需求变化频繁,希望减少接口版本管理 Apollo Server / Yoga