BFF架构笔记

了解BFF架构

微服务架构:BFF和网关是符合演化出来的?

  1. 在微服务架构中,BFF(Backend for Frontend)也称聚合层或者适配层,它主要承接一个适配角色:将内部复杂的微服务,适配成对各种不同用户体验(无线/Web/H5/第三方等)友好和统一的API。聚合裁剪适配是BFF的主要职责
  2. 在微服务架构中,网关专注解决跨横切面逻辑,包括路由、安全、监控和限流熔断等。网关一方面是拆分解耦的利器,同时让开发人员可以专注业务逻辑的实现,达成架构上的关注分离。
  3. 端用户体验层->网关层->BFF层->微服务层,是现代微服务架构的典型分层方式,这个架构能够灵活应对业务需求的变化,是一种支持创新的演化式架构。

BFF全称是Backends For Frontends(服务于前端的后端),Sam Newman曾在他的博客中写了一篇相关的文章——Pattern: Backends For Frontends,在文章中Sam Newman详细地说明了BFF。本文参考了几篇不同博客和文章,简单阐述一下自己对BFF的认识。

简而言之,BFF就是服务器设计API时会考虑到不同设备的需求,也就是为不同的设备提供不同的API接口,虽然它们可能是实现相同的功能,但因为不同设备的特殊性,它们对服务端的API访问也各有其特点,需要区别处理。

客户端都不是直接访问服务器的公共接口,而是调用BFF层提供的接口,BFF层再调用基层的公共服务,不同的客户端拥有不同的BFF层,它们定制客户端需要的API。是否需要为相似的设备人,如IOS和android分别提供一个BFF,这个需要根据现实情况决定,不同的项目环境解决手段不一样。

 

那么采用BFF架构与多端公用、单一的API有什么优点了?最重要的一点在上文中已经提到了,它能够满足因不同客户端特殊的交互引起的对新接口的要求,所以一开始就会针对相应的设备设计好对应的接口。如果使用单一、通用的API,我们一开始并没有考虑到特殊需求,那么有新的请求需要出现时,可能会出现以下问题:

1. 添加新的接口,容易造成接口的不稳定性;

2. 在原来的接口上改,容易造成耦合,破坏单一职责。

 

考虑这样一个简单例子,因为移动APP的屏幕限制,在某一个列表页我们只需要展示一些关键的信息,但是由于调用的是服务端提供统一的API,服务端在设计的时候只考虑到了web端,返回所有的字段信息,但这些对于移动端而言都是无用的。在优化性能时处理这样的问题时,服务器端就需要新增接口或者通过引入相关耦合来解决这样的问题。而使用BFF在很大程度能避免这样的问题。  
使用BFF的另一个优点就是当由于某一客户端需要调用调用多个不同的服务端接口来实现某一功能时,可以直接在对应的BFF层编写相应的API,而不会影响到基层的公共服务,且客户端不用直接向多个后台发起调用,可以优化性能。


当然,凡事有利有弊,BFF带来便利好处的同时也会引起一些问题,如代码重复,加大开发工作量等。所以在使用时需要结合现实情况仔细斟酌,符合项目的应用开发背景。例如蚂蚁财富使用BFF的场景如下。(没有具体分析,有兴趣的可以通过上面提供的链接和查阅相关资料进行研究)

 

使用 BFF 的正确姿势

  • 多端应用
    我们在设计 API 时会考虑到不同设备的需求,也就是为不同的设备提供不同的 API,虽然它们可能是实现相同的功能,但因为不同设备的特殊性,它们对服务端的 API 访问也各有其特点,需要区别处理。

  • 服务聚合
    随着微服务的兴起,原本在同一个进程内运行的业务流程被拆分到了不同的服务中。这在增加业务灵活性的同时,也让前端的调用变得更复杂。BFF 的出现为前端应用提供了一个对业务服务调用的聚合点,它屏蔽了复杂的服务调用链,让前端可以聚焦在所需要的数据上,而不用关注底层提供这些数据的服务。

  • 非必要,莫新增
    我们在看到 BFF 带来的各种好处的同时,也要注意到它所带来的代码重复和工作量增加方面的问题。如果与已有 BFF 功能类似,且展现数据的要求也相近的话,一定要谨慎对待新增 BFF 的行为。因此,建议非必要,莫新增

实战中的玩法

  • 访问控制
    例如,服务中的权限控制,将所有服务中的权限控制集中在 BFF 层,使下层服务更加纯粹和独立。

  • 应用缓存
    项目中时常存在一些需要缓存的临时数据,此时 BFF 作为业务的汇聚点,距离用户请求最近,遂将该缓存操作放在 BFF 层。

  • 第三方入口
    在业务中需要与第三交互时,将该交互放在 BFF 层,这样可以只暴露必要信息给第三方,从而便于控制第三方的访问。

<think>我们正在讨论BFF(Backend for Frontend)架构。根据引用[1]和引用[2],BFF是一种设计模式,旨在为不同的前端(如Web、移动端等)提供定制化的后端服务。它位于前端和后端微服务之间,负责聚合多个微服务的数据,并按照前端的需求进行适配。 引用[1]提到了一种基于RPC和TypeScript的BFF实现(RPC-BFF),利用前后端使用同一种语言(TypeScript)的优势,提升了数据交互的性能、效率和类型安全。 引用[2]则指出,在微服务架构中,API网关是BFF模式的关键组件,它提供统一入口,处理身份验证、授权、负载均衡等跨切面关注点。 此外,引用[5]也提到了BFF模式作为微服务设计中的常用模式之一,即“后端为前端(BFF)模式:为特定前端优化的API层”。 因此,我们可以这样组织回答: 1. BFF架构的概念:解释BFF是什么,为什么需要它(解决什么问题)。 2. BFF的应用场景:在哪些情况下使用BFF,特别是与微服务结合的场景。 3. BFF的设计与实现:包括技术选型(如引用[1]中的TypeScript)、核心组件(如API网关)以及设计原则。 4. BFF的优势与挑战。 同时,根据用户要求,我们需要在回答中自然地添加引用标识,并在最后生成相关问题。 注意:由于用户要求使用中文回答,且数学表达式使用$...$格式,但本问题中可能不涉及数学表达式,因此我们主要关注文字描述。 下面开始回答:</think>### BFF架构设计及其在软件开发中的应用 #### 一、BFF架构核心概念 BFF(Backend for Frontend,服务于前端的后端)是一种架构模式,**在前端应用与后端微服务之间建立专属适配层**。其核心价值在于解决多端适配问题:当系统存在Web、移动端、IoT设备等多种前端时,BFF为每种前端提供定制化的API接口,避免让通用后端服务承担界面适配的负担[^2]。 关键设计原则: 1. **前端导向性**:每个BFF服务专为特定前端定制(如`Web-BFF`、`Mobile-BFF`) 2. **聚合与转换**:将多个微服务的数据聚合并转换为前端所需结构 3. **轻量无状态**:不存储业务数据,仅处理请求转发和格式转换 4. **隔离性**:前端变更不会影响后端服务,后端升级可通过BFF缓冲影响 #### 二、典型应用场景 1. **多终端适配** 当同一业务需支持Web、iOS、Android等不同平台时,通过独立BFF服务为各平台提供差异化数据格式。例如电商场景: ```mermaid graph LR A[Web前端] --> B[Web-BFF] C[iOS App] --> D[iOS-BFF] E[Android App] --> F[Android-BFF] B & D & F --> G[商品微服务] B & D & F --> H[订单微服务] ``` 2. **性能优化** 合并高频次微服务调用,减少网络开销。例如用户主页需同时获取: - 用户基本信息(用户服务) - 最新订单(订单服务) - 推荐商品(推荐服务) BFF通过**单次请求聚合**三个服务响应,降低前端复杂度[^1]。 3. **渐进式迁移** 在单体架构拆分为微服务过程中,BFF可作为过渡层,逐步将接口从单体迁移到新服务。 #### 三、技术实现方案 1. **通信协议** - RPC(如gRPC):用于BFF与后端微服务间高效通信[^1] - GraphQL:灵活应对前端数据需求变化 ```typescript // TypeScript实现的BFF层数据聚合示例 async function getUserDashboard(userId: string) { const [user, orders, recs] = await Promise.all([ userService.getProfile(userId), // RPC调用用户服务 orderService.getLatestOrders(userId, 5), recommendationService.getForUser(userId) ]); return { ...user, orders, recommendations: recs }; // 格式转换 } ``` 2. **关键组件** ```mermaid graph TD A[客户端] --> B[API网关] B --> C{路由决策} C -->|Web请求| D[Web-BFF] C -->|Mobile请求| E[Mobile-BFF] D --> F[微服务集群] E --> F ``` - **API网关**:统一入口,处理认证、限流等横切关注点[^2] - **BFF服务**:执行业务聚合逻辑 - **服务发现**:动态定位微服务实例 #### 四、优势与挑战 **✓ 核心优势** - 前端迭代加速:界面需求变更只需修改BFF,无需协调后端团队 - 网络效率提升:减少客户端到服务器的请求次数(典型优化50%+延迟[^1]) - 故障隔离:单个BFF故障不影响其他终端 **⚠️ 实施挑战** 1. 代码重复风险:不同BFF间可能出现相似逻辑 → 解决方案:建立共享中间件库 2. 运维复杂度增加:需监控多个BFF实例 → 解决方案:统一日志采集+链路追踪 3. 团队协作要求高:需要前端深度参与BFF开发 #### 五、最佳实践建议 1. **按业务边界划分**:例如`订单BFF`、`用户中心BFF`,而非按技术层划分 2. **类型安全优先**:采用TypeScript等强类型语言,确保前后端数据契约[^1] 3. **轻量化原则**:避免在BFF中实现核心业务逻辑 4. **自动化测试**:针对API契约建立契约测试(Pact等) > **架构演进提示**:在微服务架构中,BFF常与API网关协同工作——网关处理系统级跨领域功能(认证/限流),BFF专注业务数据适配[^2][^5]。当系统终端类型超过3种时,BFF的收益将显著超过维护成本[^4]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值