微服务 BFF 架构设计

news2024/11/15 9:14:31

在现代软件开发中,由于程序、团队、数据规模太大,需要把企业的业务能力进行复用,将领域服务剥离,提供通用能力,避免重复建设和代码;另外服务功能的弹性能力不一样,比如定时任务、数据同步明确的技术诉求,甚至一些“政治”因素,微服务架构成为了势不可挡的趋势席卷而来。随着微服务架构和前后端分离思想的流行,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站在上帝视角所拥有的权利,各司其职

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1078979.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

mysql面试题39:什么是触发器?触发器的使用场景有哪些?MySQL中都有哪些触发器?

该文章专注于面试,面试只要回答关键点即可,不需要对框架有非常深入的回答,如果你想应付面试,是足够了,抓住关键点 面试官:什么是触发器?触发器的使用场景有哪些? 触发器(Trigger)是数据库中一种特殊类型的存储过程,它在特定的数据库事件(例如插入、更新、删除操作…

软考高级架构师下篇-18大数据架构理论设计与实践

目录 1. 引言2. 传统数据处理系统的问题1.传统数据库的数据过载问题2.大数据的特点3.大数据利用过程4.大数据处理系统架构分析3.典型的大数据架构1. Lambda架构2.Kappa架构3. Lambda架构与Kappa架构的对比4.大数据架构的实践1.大规模视频网络2.广告平台3.公司智能决策大数据系统…

Redis-集群

Redis-集群 主从复制和哨兵只能在主节点进行写数据,从节点读取数据,因此本质上,是进行了读写的分离,每个节点都保存了所有的数据,并不能实现一个很好的分布式效果。 1.哈希求余算法 假设有N台主机,对每台…

对比纯软开与嵌入式硬件开发谁更好呢?

对比纯软开与嵌入式硬件开发谁更好呢? 你的纠结和犹豫是理解的,职业选择确实是一个重要的决策。我明白你在嵌入式和软件开发之间犹豫不决的原因。让我给你提供一些建议,帮助你做出更明智的决定。最近很多小伙伴找我,说想要一些嵌入…

日期时间参数,格式配置(SpringBoot)

介绍 在SpringBoot项目中,接口中的日期和时间类型的参数,配置格式。 日期格式 接口中常用的日期时间格式有两种: 字符串(比如:yyyy-MM-dd HH:mm:ss)时间戳(比如:1696839876955&a…

【云计算网络安全】僵尸网络详解:工作原理、控制和保护方法

文章目录 一、什么是僵尸网络?二、僵尸网络因为什么原因而诞生?三、僵尸网络主要用途四、僵尸网络如何工作?五、如何控制僵尸网络?5.1 客户端/服务器僵尸网络模型5.1.1 星形网络拓扑5.1.2 多服务器网络拓扑5.1.3 分层网络拓扑 5.2…

Maven依赖解决

记一次Maven依赖冲突解决 以zookeeper为例 一、问题描述 当下载zookeeper的2.2.6.RELEASE时,报错 Could not find artifact org.springframework.cloud:spring-cloud-starter-zookeeper-discovery:pom:2.2.6.RELEASE in central (https://repo.maven.apache.org/ma…

3D包容盒子

原理简述 包围体(包容盒)是一个简单的几何空间,里面包含着复杂形状的物体。为物体添加包围体的目的是快速的进行碰撞检测或者进行精确的碰撞检测之前进行过滤(即当包围体碰撞,才进行精确碰撞检测和处理)。包…

Flutter中的StreamBuilder和FutureBuilder有什么区别

流行的跨平台框架 Flutter 为开发人员提供了两个强大的小部件来处理异步操作:StreamBuilder 和 FutureBuilder。尽管它们有相似之处,但了解它们的不同之处,以便为您的特定用例选择合适的一个是至关重要的。在这篇博文中,我们将深入…

matlab相机标定实验

实验原理 1. 相机标定坐标系 相机的参数对目标的识别、定位精度有很大的影响,相机标定就是为了求出相机的内外参数。标定中有3个不同层次的坐标系:世界坐标系、相机坐标系和图像坐标系(图像物理坐标系和图像像素坐标系)。世界坐…

HTML-注册页面

<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>注册页面</title> </head> <body><from action"#" method"get"><table border"1" align&q…

智能井盖传感器:提升城市安全与便利的利器

在智能化城市建设的浪潮中&#xff0c;WITBEE万宾智能井盖传感器&#xff0c;正以其卓越的性能和创新的科技&#xff0c;吸引着越来越多的关注。本文小编将为大家详细介绍这款产品的独特优势和广阔应用前景。 在我们生活的城市中&#xff0c;井盖可能是一个最不起眼的存在。然而…

代码随想录算法训练营第六十天 | 单调栈 part 1 | 739. 每日温度、496.下一个更大元素 I

目录 739. 每日温度思路代码 496.下一个更大元素 I思路代码 739. 每日温度 Leetcode 思路 维持一个单调递增的栈&#xff0c;向栈逐一pushtemperatures里的index。 如果当前遍历的元素大于栈顶元素&#xff0c;这意味着 栈顶元素的 右边的最大的元素就是 当前遍历的元素&…

基于安卓android微信小程序的旅游系统

项目介绍 随着人民生活水平的提高,旅游业已经越来越大众化,而旅游业的核心是信息,不论是对旅游管理部门、对旅游企业,或是对旅游者而言,有效的获取旅游信息,都显得特别重要.自助定制游将使旅游相关信息管理工作规范化、信息化、程序化,提供旅游景点、旅游线路,旅游新闻等服务本…

PG学习笔记(PostgreSQL)

PG学习笔记&#xff08;PostgreSQL&#xff09; 1、PG特点 项目极限值最大单个数据库大小不限最大最大数据单表大小32 TB单条记录最大1.6TB单字段最大允许1GB单表允许最大记录数不限单表最大字段数250~1600&#xff08;取决于字段类型&#xff09;单表最大索引数不限 2、PG安…

在 Amazon SageMaker 上使用 ESMFold 语言模型加速蛋白质结构预测

蛋白质驱动着许多生物过程&#xff0c;如酶活性、分子输运和细胞支持。通过蛋白质的三维结构&#xff0c;可以深入了解蛋白质的功能以及蛋白质如何与其他生物分子相互作用。测定蛋白质结构的实验方法&#xff08;如 X 射线晶体学和核磁共振波谱学&#xff09;既昂贵又耗时。相比…

深度学习DAY3:FFNNLM前馈神经网络语言模型

1 神经网络语言模型NNLM的提出 文章&#xff1a;自然语言处理中的语言模型预训练方法&#xff08;ELMo、GPT和BERT&#xff09; https://www.cnblogs.com/robert-dlut/p/9824346.html 语言模型不需要人工标注语料&#xff08;属于自监督模型&#xff09;&#xff0c;所以语言…

VRRP 虚拟路由器冗余协议的解析和配置

VRRP的解析 个人简介 原理和HSRP的差不多&#xff0c;少了一些状态就只有了三种状态 还有不同的就是VRRP严格按照抢占要求 一个VRRP组中具有最高优先级的设备成为Master路由器缺省优先级为100若优先级相同&#xff0c;具有最高接口IP地址最大的路由器成为Master路由器抢占(Pr…

uniapp 首页制作

uniapp拨打固定的电话 function Hotline() {// 拨打电话uni.makePhoneCall({phoneNumber: 19969547693})}页面跳转 //普通跳转function homepage() {uni.navigateTo({url: /pages/homepage/homepage});}//二、uni.redirectTo关闭当前页面&#xff0c;跳转到应用内的某个页面。…

Qt源码调试

在实际Qt开发中如果遇到Qt内部的问题&#xff0c;往往只能通过调试源代码解决。可是从Qt5.9.9版本开始安装包中就不提供pdb文件。我安装的Qt5.12.12版本目录路径D:\Qt\Qt5.12.12\5.12.12\msvc2017_64\bin下面并没有dll配套的pdb文件。但是如果自己编译源码又太费时间。 今天在观…