BFF(Backend For Frontend)在项目架构中充当的是一个"承上启下"的粘合层(或适配层)。它打破了传统"前端通用后端"的两层结构,演变为"前端 <math xmlns="http://www.w3.org/1998/Math/MathML"> → \rightarrow </math>→ BFF 层 <math xmlns="http://www.w3.org/1998/Math/MathML"> → \rightarrow </math>→ 微服务/区块链"的三层结构。
为了让你清晰地理解,我们从整体架构图 、内部职责分层 以及部署拓扑三个维度来剖析 BFF 的项目架构。
1. 整体演进架构
在架构设计中,BFF 的引入改变了数据的流向。
传统微服务架构
前端(Web/App)需要直接面对繁多的底层微服务。由于终端设备的屏幕大小、网络带宽、甚至安全要求不同,前端需要处理大量的接口聚合和数据裁剪逻辑,导致客户端代码臃肿。
BFF 架构
在前端与后端微服务之间引入了 BFF 层。
- 面向前端:BFF 为特定的客户端(如 iOS、Android、小程序)提供定制化的极简接口。
- 面向后端:BFF 充当微服务客户端,负责高并发地调用底层各种微服务(或区块链 RPC),将结果组装后返回。
2. BFF 项目的内部核心架构
一个标准、健壮的 BFF 项目(例如基于 Node.js/TypeScript 或 Go 编写)内部通常分为以下几层:
Plaintext
scss
┌────────────────────────────────────────────────────────┐
│ Client (前端应用) │
└───────────────────────────┬────────────────────────────┘
│ (HTTP / GraphQL / WebSocket)
┌───────────────────────────▼────────────────────────────┐
│ BFF 项目内部架构 │
│ │
│ 1. 路由与接入层 (Routing & Controller) │
│ - 接收请求、路由分发、参数校验 │
│ │
│ 2. 业务适配层 (Adaptation / Orchestration) │
│ - 核心:并发请求聚合 (Promise.all / Goroutine) │
│ - 数据裁剪 (Filter) 与 格式化 (Format) │
│ │
│ 3. 缓存与公共服务层 (Cache & Shared Services) │
│ - Redis 缓存(对不常变数据减压) │
│ - 认证/鉴权 (JWT Verify)、日志管理、限流 │
│ │
│ 4. 外部调用客户端 (Clients / RPC / SDK) │
│ - HTTP Client (调用微服务 A) │
│ - gRPC / Dubbo Client (调用核心后端 B) │
│ - Web3 RPC Provider (调用区块链节点) │
└───────────────────────────┬────────────────────────────┘
│ (gRPC / Internal HTTP / RPC)
┌───────────────────────────▼────────────────────────────┐
│ 底层微服务 / 数据库 / 区块链 │
└────────────────────────────────────────────────────────┘
核心分层职责:
- 路由与接入层 :定义暴露给前端的 API。如果是复杂系统,现在很流行使用 GraphQL 代替 RESTful API,让前端自己决定要什么字段,BFF 动态解析。
- 业务适配层(最核心) :这里不做深度的数据库写操作或复杂的领域业务逻辑(那些属于底层微服务)。它只做编排(Orchestration) 。比如:同时调用用户服务和订单服务,把两个结果拼成一个大 JSON。
- 外部调用客户端 :BFF 经常需要和底层微服务通信。为了追求极致的性能,BFF 与底层微服务之间通常不走慢速的 HTTP/REST,而是走内部高吞吐的 gRPC 或 RPC 框架。
3. 多端 BFF 架构形态
BFF 架构最忌讳 演变成一个"大一统"的、把所有端逻辑写在一起的"新单体后端"。标准的 BFF 架构是按端自治的:
- Web BFF:专门服务于 PC 端浏览器,由于屏幕大,可能需要返回大量列表数据和复杂的嵌套结构。
- Mobile BFF:专门服务于 iOS/Android App,注重数据裁剪、省流量、合并请求,并且可能需要适配弱网环境。
- Open API BFF:专门服务于第三方开放平台,注重安全、签名校验、和频率限制。
各个 BFF 项目之间互不干扰,分别由对应的前端团队或全栈团队独立开发、独立部署。
4. BFF 架构带来的典型痛点与解决(架构师视角)
虽然 BFF 架构很美妙,但引入它也会引入新的架构挑战:
| 挑战 | 导致后果 | 架构解决手段 |
|---|---|---|
| 链路变长(多一层网络) | 增加了请求的延迟(Latency) | 1. BFF 与底层微服务采用 gRPC 进行高速内网通信。 2. 强依赖 Promise.all 或协程进行异步并发调用,禁止串行阻塞。 |
| 单点故障(SPOF) | BFF 如果挂了,整个前端界面直接瘫痪 | 1. BFF 必须做到无状态(Stateless) ,方便利用 K8s 动态横向扩容。 2. 引入熔断、降级机制(如底层某个微服务挂了,BFF 裁剪掉该模块,依然返回页面的其他部分)。 |
| 职责边界模糊 | 底层后端偷懒,把本该属于核心业务的逻辑甩锅给 BFF 写 | 严格制定规范:涉及数据一致性、数据库事务、核心领域逻辑的,必须写在底层后端。BFF 只做数据的"搬运、组装和清洗"。 |
总的来说,BFF 项目架构的本质是"用服务端的算力和内网带宽,去换取客户端的极致体验和开发团队的敏捷迭代"。对于业务频繁变动、多端并存的现代互联网或 Web3 项目,它是非常标准且高效的架构选择。