BFF 架构浅析:再也不用求后端改接口了

BFF(Backend For Frontend)在项目架构中充当的是一个"承上启下"的粘合层(或适配层)。它打破了传统"前端通用后端"的两层结构,演变为"前端 → \rightarrow → BFF 层 → \rightarrow → 微服务/区块链"的三层结构。

为了让你清晰地理解,我们从整体架构图 、内部职责分层 以及部署拓扑三个维度来剖析 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)
┌───────────────────────────▼────────────────────────────┐
│              底层微服务 / 数据库 / 区块链                │
└────────────────────────────────────────────────────────┘

核心分层职责:

  1. 路由与接入层 :定义暴露给前端的 API。如果是复杂系统,现在很流行使用 GraphQL 代替 RESTful API,让前端自己决定要什么字段,BFF 动态解析。
  2. 业务适配层(最核心) :这里不做深度的数据库写操作或复杂的领域业务逻辑(那些属于底层微服务)。它只做编排(Orchestration) 。比如:同时调用用户服务和订单服务,把两个结果拼成一个大 JSON。
  3. 外部调用客户端 :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 项目,它是非常标准且高效的架构选择。

相关推荐
恋猫de小郭6 小时前
Flitz ,一个把 Flutter 玩成热插拔 Preview 的有趣项目,不错的思路
android·前端·flutter
闭包不眠6 小时前
Word转HTML后体积不对,裁掉的截图原图还在
前端·图像处理·人工智能·计算机视觉·html·word
言乐66 小时前
PythonLOLM自动生成复盘报告模型
开发语言·前端·数据库·人工智能·python
tryCbest6 小时前
第二篇:CSS3 全部知识点全解 + 项目样式实现
前端·css·css3
一木 之林6 小时前
Agent智能体学习总结:从一次调用到模型自主规划、工具调用与 ReAct 循环的项目实战-6/6
前端·人工智能·学习·react.js
程序员大阳6 小时前
副队长CSS教程(36)–移动布局与响应式
前端·css·响应式·媒体查询·移动布局
程序员Sunday6 小时前
React 的 useEffect 怎么工作?依赖数组、清理函数和重复执行如何理解?
前端·javascript
lank_M6 小时前
Word裁剪图片转HTML走样,该在渲染层修还是入口修
前端·图像处理·人工智能·计算机视觉·html·word
IT_陈寒6 小时前
深入理解Redis:核心原理与最佳实践
前端·人工智能·后端
Zhu7587 小时前
开源项目-Sablewisp-轻量、现代的 Chrome 书签管理扩展(Manifest V3)
前端·chrome