微服务 BFF 架构设计
在现代软件开发中,由于程序、团队、数据规模太大,需要把企业的业务能力进行复用,将领域服务剥离,提供通用能力,避免重复建设和代码;另外服务功能的弹性能力不一样,比如定时任务、数据同步明确的技术诉求,甚至一些“政治”因素,微服务架构成为了势不可挡的趋势席卷而来。随着微服务架构和前后端分离思想的流行,BFF 也是微服务架构必须考虑的一个设计组件。
一、Why BFF:承前启后
BFF即 Backends For Frontends (服务于前端的后端),由于微服务众多,需要一个统一入口根据不同的业务场景作为前端集成使用。
面向后端:BFF 隔离了因不同渠道前端 UI 展示对后端 API 的需求,企业可以在后端构建核心业务领域能力
面向前端:BFF 可以根据已有的后端 API,快速满足不同渠道的前端在 UI 展示上的需求,来不断提升用户体验
同时,BFF 可以帮助企业进行微服务架构的迁移或者演进。如下图所示,如果我们需要将一个大单体的架构迁移或演进成一个微服务的架构,可以先在前端和单体应用间加一个 BFF 层,通过 BFF 把单体的服务能力暴露给前端;然后我们可以把大单体拆分成领域服务或者中台,通过 BFF 或者前台(相对于中台的概念)把中台和领域服务组合和编排成前端需要的 API,这样中台和领域服务的变动也不会影响前端的用户体验。由此可见,后台架构的演进可以通过 BFF 来进行隔离;微服务架构内部的演进,微服务的拆分,也可以借助 BFF 来减少对前端的影响。

另外,由于进程间存在不同的资源类型,业务上存在不同的变化频度,我们会对进程间进行分层来获得最优的拓展方法。通常越靠近用户的层,它的需求和变化频度就越大,所以我们图中前后端的进程间架构采用了漏斗的形式。如果你的系统架构设计是反漏斗的,那么就需要反思架构设计是否合理。
二、典型的进程间微服务架构
我们以外卖系统为例,它的用户有订餐用户、餐饮商家、后台管理人员。它的渠道有手机 APP、微信小程序和 WEB 页面。在刚开始的时候,为了加快上线抢占市场,我们把它构建成了大单体但是前后端分离的形式。下图是初始的进程间架构。

随着业务的发展,接入的商家越来越多,订餐用户的个性化需求也复杂了起来,后台管理和一些报表功能也复杂起来了,研发团队的规模也从十几人变成了几百人了。因此高层决定把传统的单体架构转变为微服务架构,提高需求的上线效率。他们决定引入 BFF 来做架构的演进,但是有两种微服务架构,让决策团队出现了为难情绪。
薄 BFF
薄 BFF 的意思就是 BFF 的职责较少,也叫网关,主要负责将前端的路由转发后端的领域服务。当然一些通用的功能如鉴权、限流、熔断、服务降级、灰度路由等也可以放到其中。

厚 BFF
相对于薄 BFF,厚 BFF 算是真正意义上的 BFF,除了具有薄 BFF 的所有职能外,它可以接入不同的协议如 MQ 服务,WebSocket等;类似 DDD 领域驱动设计中的应用层,可以组合和编排不同的领域服务,避免了服务间的相互依赖。

微服务模式对比
下面的表格是薄厚两种 BFF 的对比。
| 模式 | 渠道独立多样性 | 聚焦领域服务 | 前端数据组装难易性 | 端到端交付 | 重复代码 |
| 薄BFF | 差 | 差 | 差 | 好 | 少 |
| 厚BFF | 好 | 好 | 好 | 差 | 多 |
对于薄 BFF,适合接入差异较小的应用,如企业内部使用的应用系统。用户群非常固定、交互方式统一、数据权限能找到规律,避免了重复代码。
对于厚 BFF,对不同的来源请求都使用了各自的入口服务承接,此结构成本较大,但对于接入渠道多样或业务场景复杂的系统来说较适合。另外Open API(可以看做是一种 BFF) 作为系统防腐层,有必要设计为有编排能力的 BFF。
三、BFF 的问题
前面说了引入 BFF 给我们微服务架构带来了诸多好处。但是引进了一个组件势必会带来不少问题。
1. 由于多个前端渠道会有不同的 BFF,往往会导致同样一个功能需要在不同 BFF 中来实现,会有大量的重复代码。
2. BFF承载了过多的业务。当新的业务需求产生时,具体要在哪个后端领域服务中实现有时候不是一个很容易回答的问题,特别是不同的服务有不同的团队归属时,如果每个服务的归属团队都认为新的业务需求不是自己服务的业务范畴,特别是如果是前端或者BFF团队来牵头需求时,最可能的结果就是让 BFF 负责帮忙组合各个服务的功能,完成这个新的业务需求。渐渐地,BFF 朝着 ESB 的方向发展,变成了集成各个微服务,对外提供新能力的中间件。
3. 一个接口完成多次写操作,很难保证数据一致性。如果一个业务场景需要调用多个后端领域服务来更新或插入数据,那么数据的同步就是个问题。
4. 性能。既然有了 BFF,前端的设计是否可以放飞自我了,可以把想展示的信息一股脑都放在一起展示,极端情况下 BFF 可以获取到任意服务的数据进行组合,那么一个 BFF 接口需要调用了N个后端服务来拼凑前端需要的数据,那么这个接口的性能一定不会好。
四、BFF 的治理方向
针对这些问题,我们需要明确该如何治理 BFF。要治理就要有原则:
1. BFF 为前端和业务场景而生,关注点在提升前端用户体验和对后端业务能力的编排上
2. BFF 不承载业务能力,业务逻辑要下沉到合适的后端领域服务中。
3. BFF 不承载特定技术能力,必要时可以建立专门的服务承载,如文档打印、Excel生成、算法逻辑等。
4. BFF 不做后端服务的集成层,某个后端服务的数据变更需要同步到其他服务,不能通过BFF 实现。
有了原则,就有方向。BFF 的治理方向如下:
1. 优先解决后端服务的设计问题
2. 从业务上分析BFF接口的职责,保证接口职责单一
3. 将BFF中业务能力下沉到后端领域服务
4. 将BFF中需要复用的技术能力抽取成共享库或下沉建立后端服务
5. 避免一个BFF接口依赖过多的后端服务,根据系统复杂度来看,最多依赖不超过5个后端服务为宜
6. 避免一个BFF接口多次写操作,不滥用BFF站在上帝视角所拥有的权利,各司其职
相关文章:
微服务 BFF 架构设计
在现代软件开发中,由于程序、团队、数据规模太大,需要把企业的业务能力进行复用,将领域服务剥离,提供通用能力,避免重复建设和代码;另外服务功能的弹性能力不一样,比如定时任务、数据同步明确的…...
零基础学python之元组
文章目录 元组1、元组的应用场景2、定义元组3、元组的常见操作4、总结 元组 目标 元组的应用场景定义元组元组常见操作 1、元组的应用场景 思考:如果想要存储多个数据,但是这些数据是不能修改的数据,怎么做? 答:列…...
11. SpringBoot项目中参数获取与响应
SpringBoot项目中参数获取与响应 1. 程序结构&通信方式 程序结构: C/S : 客户端/服务器端 -Main方法。 -效果炫目、数据相对安全。 -公司成本高,因为要分别开发客户端和服务器端。 B/S: 浏览器端/服务器端 -效果依赖于浏览…...
4+1视图与UML
目录 逻辑视图过程视图开发视图物理视图(部署视图)用例视图 41视图,即逻辑视图,过程视图,实现视图,部署视图,用例视图。 为什么不用一个视图? 针对多个用户,即终端用户&a…...
没用的知识增加了,尝试用文心实现褒义词贬义词快速分类
尝试用文心实现褒义词贬义词快速分类 一、我的需求二、项目环境搭建千帆SDK安装及使用流程 三、项目实现过程创建应用获取签名调用接口计算向量积总结 百度世界大会将于10月17日在北京首钢园举办,今天进入倒计时五天了。通过官方渠道的信息了解到,这次是…...
AWS SAP-C02教程3--网络资源
架构设计中网络也是少不了的一个环节,而AWS有自身的网络结构和网络产品。本章中将带你看看AWS中不同网络产品,以及计算资源、存储资源等产品在网络架构中处于哪个位置,如何才能让它们与互联网互通、与其它产品互通。下图视图将SAP涉及到网络相关组件在一张图表示出来,图中可…...
【TensorFlow2 之012】TF2.0 中的 TF 迁移学习
#012 TensorFlow 2.0 中的 TF 迁移学习 一、说明 在这篇文章中,我们将展示如何在不从头开始构建计算机视觉模型的情况下构建它。迁移学习背后的想法是,在大型数据集上训练的神经网络可以将其知识应用于以前从未见过的数据集。也就是说,为什么…...
mysql面试题46:MySQL中datetime和timestamp的区别
该文章专注于面试,面试只要回答关键点即可,不需要对框架有非常深入的回答,如果你想应付面试,是足够了,抓住关键点 面试官:MySQL中DATETIME和TIMESTAMP的区别 在MySQL中,DATETIME和TIMESTAMP是两种用于存储日期和时间的数据类型。虽然它们都可以用于存储日期和时间信息…...
【Spring Boot】RabbitMQ消息队列 — RabbitMQ入门
💠一名热衷于分享知识的程序员 💠乐于在CSDN上与广大开发者交流学习。 💠希望通过每一次学习,让更多读者了解我 💠也希望能结识更多志同道合的朋友。 💠将继续努力,不断提升自己的专业技能,创造更多价值。🌿欢迎来到@"衍生星球"的CSDN博文🌿 🍁本…...
Navicat定时任务
Navicat定时任务 1、启动Navicat for MySQL工具,连接数据库。 2、查询定时任务选项是否开启 查询命令:SHOW VARIABLES LIKE ‘%event_scheduler%’; ON表示打开,OFF表示关闭。 打开定时任务命令 SET GLOBAL event_scheduler 0; 或者 SET G…...
小白必备:简单几步, 使用Cpolar+Emlog在Ubuntu上搭建个人博客网站
文章目录 前言1. 网站搭建1.1 Emolog网页下载和安装1.2 网页测试1.3 cpolar的安装和注册 2. 本地网页发布2.1 Cpolar临时数据隧道2.2.Cpolar稳定隧道(云端设置)2.3.Cpolar稳定隧道(本地设置) 3. 公网访问测试总结 前言 博客作为使…...
封装 Token
什么是token? 作为计算机术语,是“令牌”的意思 。 Token 是服务端生成的一串字符串,以作客户端进行请求的一个令牌,当第一次登录后,服务器生成一个Token便将此Token返回给客户端,以后客户端只需带上这个Token前来请…...
CloudCompare 二次开发(17)——点云添加均匀分布的随机噪声
目录 一、概述二、代码集成三、结果展示一、概述 不依赖任何第三方点云相关库,使用CloudCompare编程实现点云添加随机噪声。添加随机噪声的算法原理见:PCL 点云添加均匀分布的随机噪声。 二、代码集成 1、mainwindow.h文件public中添加: void doActionAddRandomNoise(); …...
研发必会-异步编程利器之CompletableFuture(含源码 中)
近期热推文章: 1、springBoot对接kafka,批量、并发、异步获取消息,并动态、批量插入库表; 2、SpringBoot用线程池ThreadPoolTaskExecutor异步处理百万级数据; 3、基于Redis的Geo实现附近商铺搜索(含源码) 4、基于Redis实现关注、取关、共同关注及消息推送(含源码) 5…...
上海亚商投顾:沪指高开高走 锂电等新能源赛道大反攻
上海亚商投顾前言:无惧大盘涨跌,解密龙虎榜资金,跟踪一线游资和机构资金动向,识别短期热点和强势个股。 一.市场情绪 沪指昨日高开后强势震荡,创业板指盘中一度翻绿,随后探底回升再度走高。碳酸锂期货合约…...
力扣第235题 二又搜索树的最近公共祖先 c++
题目 235. 二叉搜索树的最近公共祖先 中等 (简单) 相关标签 树 深度优先搜索 二叉搜索树 二叉树 给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。 百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q&…...
时代风口中的Web3.0基建平台,重新定义Web3.0!
近年来,Web3.0概念的广泛兴起,给加密行业带来了崭新的叙事方式,同时也为加密行业提供了更加具有想象力的应用场景与商业空间,并让越来越多的行业从业者们意识到只有更大众化的市场共性需求才能推动加密市场的持续繁荣。当前围绕这…...
React学习笔记 001
什么是React 1.发送请求获取数据 处理数据(过滤、整理格式等) 3.操作DOM呈现页面 react 主要是负责第三部 操作dom 处理页面 数据渲染为HTML视图的开源js库。 好处 避免dom繁琐 组件化 提升复用率 特点 声明式编程: 简单 组件化编程…...
2023 | github无法访问或速度慢的问题解决方案
github无法访问或速度慢的问题解决方案 前言: 最近经常遇到github无法访问, 或者访问特别慢的问题, 在搜索了一圈解决方案后, 有些不再有效了, 但是其中有几个还特别好用, 总结一下. 首选方案 直接在github.com的域名上加一个fast > githubfast.com, 访问的是与github完全相…...
unity各种插件集合(自用)
2D Animation——2D序列帧/骨骼动画相关 2D PSD Importer——psb骨骼动画(unity官方建议使用psb而非psd) (Advanced —show preview package 勾选)出现 2D IK——反向动力学IK Universal RP——升级项目到Urp(通用渲…...
STM32状态机按键驱动设计:支持多事件触发与动态配置
1. 为什么需要状态机按键驱动? 在嵌入式开发中,按键处理看似简单却暗藏玄机。传统while循环扫描方式就像让主程序不断询问"按键按下了吗?",不仅效率低下,还会导致系统响应迟钝。我曾在一个工业控制器项目中发…...
256K上下文颠覆智能编程:Qwen3-Coder重构全栈开发效率范式
256K上下文颠覆智能编程:Qwen3-Coder重构全栈开发效率范式 【免费下载链接】Qwen3-Coder-30B-A3B-Instruct 项目地址: https://ai.gitcode.com/hf_mirrors/unsloth/Qwen3-Coder-30B-A3B-Instruct 问题发现:传统AI编程助手的三大痛点 2025年Stac…...
OpenStack Train版三节点部署全攻略:从CentOS 7.6配置到Dashboard上线
OpenStack Train版三节点部署实战:从CentOS 7.6到Dashboard的完整指南 当企业需要构建私有云平台时,OpenStack作为最成熟的开源IaaS解决方案之一,其灵活性和可扩展性备受青睐。本文将带您完成一个生产级的三节点OpenStack Train版部署&#x…...
3步实现Web界面设计标注高效交付:面向全栈团队的Sketch Measure应用指南
3步实现Web界面设计标注高效交付:面向全栈团队的Sketch Measure应用指南 【免费下载链接】sketch-measure Make it a fun to create spec for developers and teammates 项目地址: https://gitcode.com/gh_mirrors/sk/sketch-measure 在Web开发项目中&#x…...
OpenCV实战:图像亮度、对比度与锐化的智能调节与优化
1. 图像处理基础概念解析 在开始动手实践之前,我们需要先理解几个关键概念。亮度、对比度和锐化这三个参数就像调节电视画面的三个旋钮,每个旋钮都会对图像产生独特的影响。 亮度(Brightness)就像房间里的灯光开关。调高亮度&…...
eSearch一站式屏幕效率工具安装指南
eSearch一站式屏幕效率工具安装指南 【免费下载链接】eSearch 截屏 离线OCR 搜索翻译 以图搜图 贴图 录屏 万向滚动截屏 屏幕翻译 Screenshot Offline OCR Search Translate Search for picture Paste the picture on the screen Screen recorder Omnidirectional scrolling sc…...
让通用 URL 准确落到目标 Page Builder:SAP Fiori 页面管理中的重定向实践
在很多 SAP Fiori 项目里,大家更容易把注意力放在 SAPUI5 组件、OData 服务、Launchpad 编排,或者 Fiori Elements 的元数据驱动开发上,却很少有人愿意花时间审视一条看似普通的访问路径。当系统进入页面管理阶段,尤其是管理员通过 Page Administration UI 去打开、维护、跳…...
4步完整指南:如何用OpenCore Legacy Patcher让旧Mac重获新生
4步完整指南:如何用OpenCore Legacy Patcher让旧Mac重获新生 【免费下载链接】OpenCore-Legacy-Patcher Experience macOS just like before 项目地址: https://gitcode.com/GitHub_Trending/op/OpenCore-Legacy-Patcher 想让被苹果抛弃的旧Mac电脑重新运行最…...
ANSYS模态分析后,如何用MATLAB把导出的HB格式刚度矩阵变回普通矩阵?(附完整命令流)
ANSYS模态分析后HB格式刚度矩阵的MATLAB转换全流程解析 在结构动力学和有限元分析领域,ANSYS与MATLAB的协同工作已经成为科研人员和工程师的标配工作流。模态分析作为结构动态特性研究的基础,其刚度矩阵的导出与后续处理尤为关键。然而,当您从…...
Pencil原型工具全攻略:从环境搭建到高级配置
Pencil原型工具全攻略:从环境搭建到高级配置 【免费下载链接】pencil DEPRECATED: Multiplatform GUI Prototyping/Wireframing 项目地址: https://gitcode.com/gh_mirrors/pen/pencil Pencil原型工具:开源价值定位与核心特性解析 核心价值&…...
