BFF(Backend for Frontend,服务于前端的后端)是一种架构模式,核心思想是:在通用后端 API 和前端界面之间,增加一个专门的中间层,为特定前端(Web、App、小程序、大屏)定制聚合、裁剪和适配接口。
它不是一个具体技术,而是一种分层策略。BFF 属于你自己,不属于通用后端。
一、为什么需要 BFF
传统架构下,前端直接调用通用后端 API,问题很多:
| 问题 | 说明 |
|---|---|
| 接口太细 | 一个页面要调 10 个接口,前端自己拼数据 |
| 接口太粗 | 一个接口返回 200 个字段,前端只用 5 个 |
| 多端差异 | Web 要 A 字段,App 要 B 字段,大屏要 C 字段,通用 API 很难兼顾 |
| 协议不匹配 | 后端 gRPC,前端只认 HTTP/JSON |
| 鉴权分散 | 每个前端都要处理 token、刷新、权限 |
| 变更耦合 | 前端改个展示,后端要跟着发版 |
BFF 就是来解决这些问题的:通用后端只提供稳定的领域能力,BFF 负责“翻译”成前端好用的接口。
二、BFF 的核心职责
接口聚合:把多个后端接口合并成一个,减少前端请求次数。
数据裁剪:只返回前端需要的字段,减少传输量。
格式适配:把后端数据结构转成前端友好的格式。
协议转换:gRPC/Thrift → HTTP/JSON,或 GraphQL。
多端定制:Web BFF、App BFF、大屏 BFF 各自独立。
鉴权与会话:统一处理 token、权限、用户上下文。
缓存与降级:热点数据缓存,后端故障时返回兜底数据。
编排与编排:调用多个服务,做业务编排。
埋点与监控:统一收集前端行为和后端调用指标。
三、典型架构
text
┌─────────┐ ┌─────────┐ ┌─────────┐ │ Web │ │ App │ │ 大屏 │ └────┬────┘ └────┬────┘ └────┬────┘ │ │ │ ▼ ▼ ▼ ┌─────────┐ ┌─────────┐ ┌─────────┐ │ Web BFF │ │ App BFF │ │大屏 BFF │ └────┬────┘ └────┬────┘ └────┬────┘ │ │ │ └────────────┼────────────┘ ▼ ┌─────────────────┐ │ 通用后端服务 │ │ 用户/订单/库存 │ └─────────────────┘
关键点:BFF 按前端形态划分,而不是按业务域划分。Web BFF 和 App BFF 可以调用同一批后端服务,但对外暴露的接口不同。
四、BFF 的实现技术
BFF 没有指定技术栈,常见选择:
| 技术 | 适用场景 | 特点 |
|---|---|---|
| Node.js | 高并发 I/O、快速迭代 | 事件循环适合聚合,JS 与前端同构 |
| Spring Boot | 企业级、强事务 | 生态成熟,但相对重 |
| FastAPI | AI 场景、快速开发 | 异步、自动文档 |
| Go | 高性能网关 | 并发强、部署简单 |
| GraphQL | 前端灵活查询 | 前端按需取数,天然 BFF |
| NestJS | Node 企业级 | 结构化、依赖注入 |
常见组合:Node.js/NestJS 做 BFF,Spring Boot 做领域服务,FastAPI 做 AI 服务。
五、BFF 与 API Gateway 的区别
| 对比维度 | API Gateway | BFF |
|---|---|---|
| 面向对象 | 所有客户端 | 特定前端 |
| 核心职责 | 路由、限流、鉴权、熔断 | 聚合、裁剪、适配 |
| 数量 | 通常一个 | 每个前端一个 |
| 业务逻辑 | 尽量少 | 可以有编排逻辑 |
| 变更频率 | 低 | 高,跟随前端迭代 |
| 归属 | 平台/运维 | 前端/业务团队 |
关系:Gateway 在最外层做统一入口,BFF 在 Gateway 之后、领域服务之前。请求链路:前端 → Gateway → BFF → 领域服务。
六、BFF 的优缺点
优点
前端体验提升:接口少、字段准、响应快。
多端解耦:各端独立迭代,互不影响。
后端稳定:通用后端不因前端变化频繁改版。
职责清晰:前端团队负责 BFF,后端团队负责领域。
安全收敛:鉴权、限流、脱敏集中在 BFF。
技术灵活:BFF 可以用最适合前端的技术栈。
缺点
增加一层:多一跳网络,延迟略增。
重复代码:多个 BFF 可能有相似逻辑。
运维成本:多一个服务要部署、监控。
团队边界:前端团队要维护后端服务,能力要求高。
一致性风险:多个 BFF 可能对同一业务逻辑实现不一致。
调试复杂:链路变长,排查问题更麻烦。
七、BFF 的最佳实践
按端划分,不按业务划分:Web BFF、App BFF、小程序 BFF。
BFF 不碰数据库:只调用领域服务,不直接操作 DB。
BFF 不做核心业务:只做聚合、适配、编排,核心逻辑下沉到领域服务。
统一鉴权:BFF 层集中处理 token、用户上下文。
缓存热点:聚合结果可缓存,减少后端压力。
降级策略:后端故障时返回兜底数据,保证前端可用。
监控全链路:BFF 是观测前端体验的最佳位置。
GraphQL 可选:如果前端查询灵活,GraphQL 是 BFF 的自然实现。
避免 BFF 膨胀:BFF 不应变成新的“万能后端”。
团队 ownership:BFF 由前端团队或全栈团队负责。
八、典型应用场景
| 场景 | BFF 的作用 |
|---|---|
| 电商首页 | 聚合商品、推荐、广告、用户信息 |
| 出行 App | 聚合订单、车辆、地图、支付 |
| 大屏展示 | 聚合多系统数据,定制格式 |
| 小程序 | 裁剪字段,适配小程序限制 |
| AI 应用 | 聚合模型服务、缓存、鉴权 |
| 多租户 SaaS | 按租户定制接口 |
| 微前端 | 每个微前端一个 BFF |
九、BFF 与 GraphQL 的关系
GraphQL 常被用作 BFF 的实现方式:
前端声明需要哪些字段,GraphQL 按需返回。
一个 GraphQL 端点可以替代多个 REST 接口。
但 GraphQL 也有复杂度:缓存、限流、N+1 问题。
选择:如果前端查询需求多变,GraphQL 很适合;如果接口相对固定,REST + BFF 更简单。
十、总结
BFF = 为特定前端定制的中间层。
它聚合、裁剪、适配后端服务,让前端拿到最合适的接口,让后端保持稳定。它是多端架构的标配,是前端团队向后延伸的自然选择。
核心原则:
BFF 按端划分,不按业务划分。
BFF 不碰数据库,不做核心业务。
BFF 是前端的“专属后端”,不是通用网关。
一句话:Gateway 管“进门”,BFF 管“点菜”。通用后端提供食材,BFF 按前端口味做好端上桌。