1. BFF 模式概述
1.1 什么是 BFF(Backend For Frontend)
BFF(Backend For Frontend,服务于前端的后端)是一种架构模式,由 Sam Newman 在 2015 年提出。其核心思想是:为每一种前端客户端(Web、iOS、Android、小程序等)分别构建一个专属的后端服务,该服务负责聚合下游微服务的数据、裁剪响应字段、适配客户端协议,从而让前端不再直接面对复杂的微服务网络。
一句话理解 BFF:BFF 是前端的“专属翻译官”和“数据管家”,它把后端微服务的通用能力翻译成前端最需要的格式,并一次性交付。
BFF 并非一个通用的 API 网关,而是一个有业务逻辑的中间层。它通常由前端团队维护,与前端应用的生命周期和迭代节奏保持一致。
1.2 BFF 在微服务架构中的位置
在典型的微服务架构中,BFF 位于客户端与下游微服务之间,充当“门面”角色。下图展示了 BFF 在整体架构中的位置与交互关系:
从上图可以看出:
- 客户端层:Web、iOS、Android 等不同终端,各自有不同的屏幕尺寸、网络状况和交互范式。
- BFF 层:每个客户端对应一个专属 BFF,负责数据聚合、字段裁剪、协议适配(如 REST、GraphQL、gRPC-Web)。
- 微服务层:通用的业务微服务(用户、订单、商品、支付等),不感知前端差异,只提供标准 API。
1.3 BFF 与传统网关的区别
很多开发者容易将 BFF 与 API 网关混淆。虽然两者都位于客户端与后端之间,但它们的职责边界、归属团队、演进方式有本质区别。下表从多个维度进行对比:
| 对比维度 | BFF(Backend For Frontend) | 传统 API 网关 |
|---|---|---|
| 核心职责 | 数据聚合、字段裁剪、UI 适配 | 路由转发、限流、认证、日志 |
| 归属团队 | 前端团队(或全栈团队) | 中间件/基础设施团队 |
| 业务逻辑 | 包含业务编排和展示逻辑 | 无业务逻辑,纯基础设施 |
| 客户端绑定 | 一对一绑定(一个 BFF 只服务一种客户端) | 一对多(所有客户端共用同一个网关) |
| 版本演进 | 与前端版本同步迭代 | 独立于前端,向后兼容 |
| 部署粒度 | 每个 BFF 独立部署 | 通常集中部署 |
| 典型技术 | Node.js、Go、Kotlin(Ktor) | Kong、Zuul、Spring Cloud Gateway |
关键区别总结:传统网关是“基础设施层”的通用组件,负责安全与流量管控;BFF 是“应用层”的专属适配器,负责数据编排与前端体验优化。两者可以共存——BFF 部署在网关之后,由网关统一管理入口流量和认证。
1.4 为什么微服务架构需要 BFF
在微服务架构中,如果没有 BFF,前端直接调用多个微服务会面临以下问题:
- 多次网络请求:一个页面可能需要调用 5~10 个微服务,导致首屏加载缓慢。
- 数据过载:微服务返回的通用数据结构包含大量前端不需要的字段,浪费带宽。
- 协议不统一:部分微服务使用 REST,部分使用 gRPC,前端需要处理多种协议。
- 安全暴露面过大:前端直接暴露多个微服务端点,增加攻击面。
- 前端迭代受后端牵制:微服务接口变更需要协调多个前端团队。
BFF 通过聚合、裁剪、适配三个动作,有效解决了上述痛点。在 Go 语言生态中,BFF 通常使用 net/http、gin、echo 或 fiber 等框架实现,并配合 protobuf 与下游微服务通信。
注意:BFF 不是银弹。如果团队规模较小、微服务数量少于 5 个,引入 BFF 可能增加不必要的复杂度。建议在微服务数量超过 10 个、前端客户端超过 2 种时,才考虑引入 BFF 模式。
1.5 BFF 的典型工作流程
下面用一张流程图展示 BFF 处理一次前端请求的完整生命周期:
从流程图中可以看到,BFF 在接收到客户端请求后,依次执行认证 → 权限校验 → 数据聚合 → 并行调用微服务 → 响应组装。其中领域边界权限验证(步骤 3)是本课程的核心主题,后续章节将深入讲解如何在 Go BFF 中实现细粒度的权限控制。
1.6 本章小结
- BFF 是一种为特定前端客户端量身定制的后端服务模式,解决微服务架构下的数据聚合、协议适配和前端体验问题。
- BFF 位于客户端与微服务之间,每个客户端拥有独立的 BFF,实现关注点分离。
- BFF 与传统 API 网关在职责、归属、业务逻辑和演进方式上有本质区别,两者可以互补共存。
- 在 Go 语言中实现 BFF,通常使用轻量级 HTTP 框架,并结合
protobuf、gRPC与下游微服务通信。