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

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)
┌───────────────────────────▼────────────────────────────┐
│              底层微服务 / 数据库 / 区块链                │
└────────────────────────────────────────────────────────┘

核心分层职责:

  1. 路由与接入层 :定义暴露给前端的 API。如果是复杂系统,现在很流行使用 GraphQL 代替 RESTful API,让前端自己决定要什么字段,BFF 动态解析。
  2. 业务适配层(最核心) :这里不做深度的数据库写操作或复杂的领域业务逻辑(那些属于底层微服务)。它只做编排(Orchestration) 。比如:同时调用用户服务和订单服务,把两个结果拼成一个大 JSON。
  3. 外部调用客户端 :BFF 经常需要和底层微服务通信。为了追求极致的性能,BFF 与底层微服务之间通常不走慢速的 HTTP/REST,而是走内部高吞吐的 gRPCRPC 框架

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 项目,它是非常标准且高效的架构选择。

相关推荐
ZC跨境爬虫1 小时前
跟着 MDN 学 HTML day_50:(深入理解 DOM 中的 Text 节点)
前端·javascript·microsoft·ui·html·媒体
ZC跨境爬虫1 小时前
跟着 MDN 学 HTML day_51:(深入理解 XPathEvaluator 接口)
前端·javascript·ui·html·音视频
wjykp1 小时前
5.cypher语句组合与复杂操作
linux·前端·javascript
梦无矶1 小时前
nrm自动设置npm镜像源
前端·npm·node.js
鲤鱼_5991 小时前
记录——前端开发IDEA需要的插件
前端
摘星编程1 小时前
基于 JiuwenSwarm AgentTeam 构建混沌工程自动化实战
前端·chrome
nashane1 小时前
HarmonyOS 6学习:Web组件与JavaScript交互的三大高频问题与终极解决方案
前端·学习·harmonyos
顾随2 小时前
(2)达梦数据库--SQl基础实践
前端·数据库·sql
键盘飞行员2 小时前
Windsurf + Claude 4.7 前端开发:用 ui-ux-pro-max 根治 “AI 味”、实现全站 UI 统一
前端·ui·ai编程