1.1 BFF 模式概述
1.1.1 BFF 概念
BFF(Backend For Frontend,服务于前端的后端) 是一种由 SoundCloud 提出的微服务架构模式。其核心思想是:为每一种前端客户端(Web、iOS、Android、小程序等)单独构建一个专属的后端服务,该服务负责聚合下游微服务的数据、适配前端特定的交互逻辑,并输出恰好满足该客户端需求的数据结构。
BFF 不是简单的 API 代理,而是一个有业务逻辑的中间层。它解决了传统微服务架构中“一个后端 API 试图适配所有前端”导致的接口臃肿、字段冗余、多次请求等问题。
核心原则:“你的前端需要什么,BFF 就给你什么。” —— 每个 BFF 只对一种客户端负责,输出该客户端最舒适的数据格式。
1.1.2 BFF 在微服务中的角色
在微服务架构中,BFF 处于客户端与下游微服务之间,扮演着以下关键角色:
- 聚合器(Aggregator):将多个微服务的响应合并为一个响应,减少客户端请求次数。
- 适配器(Adapter):将后端通用数据模型转换为前端特定视图模型(ViewModel)。
- 编排器(Orchestrator):根据前端业务流程,编排多个微服务的调用顺序。
- 安全网关(Security Gateway):集中处理身份认证、权限校验、会话管理。
- 协议转换器(Protocol Translator):将后端 gRPC/Thrift 协议转换为前端友好的 HTTP/REST 或 GraphQL。
下图展示了 BFF 在微服务架构中的典型位置与交互关系:
1.1.3 BFF 与 API Gateway 的区别
很多开发者容易将 BFF 与 API Gateway 混淆。虽然两者都位于客户端与后端之间,但它们的职责边界、粒度、业务参与度有本质区别。下表从多个维度进行对比:
| 对比维度 | API Gateway | BFF |
|---|---|---|
| 核心职责 | 统一入口、路由转发、限流、熔断、认证 | 数据聚合、视图适配、业务编排、权限校验 |
| 业务逻辑 | 无业务逻辑,纯基础设施层 | 包含前端专属业务逻辑 |
| 粒度 | 粗粒度,所有客户端共享一个网关 | 细粒度,每种客户端独立部署 |
| 数据输出 | 透传后端数据,不做裁剪 | 按需裁剪、聚合、格式化 |
| 协议转换 | 支持 HTTP/gRPC/WebSocket 多协议 | 通常只输出 HTTP/REST 或 GraphQL |
| 变更影响 | 变更可能影响所有客户端 | 变更只影响对应客户端 |
| 部署方式 | 集中式部署 | 按客户端维度独立部署 |
| 典型技术 | Kong、Zuul、Spring Cloud Gateway | Node.js、Go、Java 轻量服务 |
实践建议:在大型微服务架构中,API Gateway 和 BFF 通常共存。API Gateway 作为全局入口处理横切关注点(限流、认证、日志),BFF 作为业务聚合层处理前端定制逻辑。两者形成“Gateway → BFF → Microservices”的三层调用链。
下图直观展示了 API Gateway 与 BFF 在架构中的不同位置与职责边界:
1.1.4 为什么 BFF 需要独立的权限验证
在 BFF 模式中,权限验证不再是简单的“透传 Token 到后端”。BFF 需要根据前端客户端的类型(Web、Mobile、小程序)执行差异化的权限策略:
- Web 端:通常使用 Cookie + Session 或 OAuth2 Authorization Code 流程。
- 移动端:使用 JWT + Refresh Token,支持离线 Token 刷新。
- 小程序端:依赖平台登录态( code 换取 session_key)。
BFF 作为权限校验的第一道防线,需要完成以下工作:
- Token 解析与验证:从请求头、Cookie 或 Query 参数中提取 Token,验证签名和有效期。
- 上下文注入:将解析后的用户身份、角色、权限范围注入到请求上下文。
- 细粒度权限校验:根据 API 路径、HTTP 方法、资源 ID 判断当前用户是否有操作权限。
- 错误响应:权限不足时返回 401/403,并携带清晰的错误码。
常见误区:不要在 BFF 中重复实现完整的用户管理或角色管理。BFF 应依赖下游的 Auth Service 或 IAM 系统 完成用户认证和角色查询,BFF 只做校验与决策,不做身份存储。