前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >应该如何正确理解BFF架构设计?

应该如何正确理解BFF架构设计?

作者头像
架构精进之路
发布于 2023-10-28 08:17:55
发布于 2023-10-28 08:17:55
2.3K00
代码可运行
举报
文章被收录于专栏:架构精进之路架构精进之路
运行总次数:0
代码可运行

一、什么是BFF

BFF:Backends For Frontends(服务于前端的后端)。

BFF是一种Web架构,微服务设计系列丛书的作者 Sam Newman曾在他的博客中写了一篇相关文章《Pattern: Backends For Frontends》。

BFF 的概念最初就是来源于此

服务端设计API时会考虑到不同设备的需求,即为不同设备提供不同API接口,虽然它们可能实现相同功能,但因不同设备的特殊性,它们对服务端的API访问也各有其特点,需区别处理。在计算机科学中,所有问题都可以通过加一层来解决,于是 BFF 架构设计应运而生。

二、BFF的由来

随着移动设备的快速发展以及产品对用户交互体验的关注度增强,前后端分离的架构模式也逐渐被大多数企业所采用。在这种模式下,统一的后端API很难满足在不同场景下对用户体验的不同需求。

BFF模式应运而生,一方面 BFF 隔离了前端UI展示对后端API的需求,企业可以专注在后端构建核心业务能力,另一方面,BFF根据已有的后端API,快速满足前端在UI展示上的需求,来不断提升用户体验;

从知识管理的角度,BFF模式让知识边界定义得更清晰,后端专注于构建业务能力,不需要考虑前端各种场景适配的问题;而前端更关注用户体验,可以随时独立发布更新。

三、BFF到底解决哪些问题?

在用户体验至关重要的今天,程序功能展示界面丰富多样。比如同一个界面可能同时存在社区版、极速版、专业版,一个界面要展示多种数据,要连接的设备也层出不穷如小程序、APP、网页、客户端等等。

归纳起来有这几类:

  • 多端功能差异 App端往往只能展示少量信息,浏览器网页则需要全部信息,因此需要适配各端而裁减字段
  • 不同业务场景展示差异 PC端的屏幕较大,展示内容较多且全面。但是移动端屏幕小,展示内容较少。一个页面要展示多个服务端的数据,因此需要聚合多个API的数据(串行或并行编排多个API)
  • 历史版本数据维护成本过高 服务功能不断迭代,面对服务端不同的数据格式,甚至有历史遗留系统,需要适配成前端展示更友好的格式
  • 不同业务试验效果 试验不同的展示方案效果,需要快速支持新业务方案上线

四、BFF的分类

增加一层永远是解耦的大招,但BFF本身仅仅是一个概念,实现方式有多种,在实际中我们要根据不同的场景选取不同的方案。

按照大类分,主要有单一BFF和多端BFF。

4.1 单一共用 BFF

此方式主要对接服务端,根据展示服务的需求组装数据提供给每个端或者每种业务进行展示。

针对多端共用服务接口的场景,我们将后端基础服务与服务调用方中间通过BFF进行分离。

  • Service:基础服务仅提供数据的增删改查,并不过多涉及业务的判断处理;
  • BFF:收揽把控所有业务判断处理,同时将一些业务逻辑异常也由BFF格式化处理后展示给访问端点。

这种设计方式虽然基础服务与BFF进行了分离,但同样存在一定的问题。

我们只需要在BFF层面进行业务判断处理,但是多个端共用一个BFF,也会导致代码编写复杂度增高、代码可阅读性降低、多端业务耦合。

4.2 多端独立 BFF

此方式是指每种业务或者每种客户端采用自己独立的BFF层,这样每种客户端的服务更加灵活,不同的BFF端对于展示服务解耦性更高。

我们为每一个端点都提供一个对应的 BFF,每个端点的BFF处理自身的业务逻辑,需要数据时从基础服务内获取,然后在接口返回之前进行组装数据用于实例化返回对象。

这样基础服务如果有新功能添加,BFF几乎不会受到影响,而我们如果后期对端点进行拆处理时,我们只需要对应调整(新增、删减)BFF 即可,基础服务同样也不会受到影响。

五、BFF 的优缺点

5.1 BFF 优

通过上面的各种问题和场景,相信我们已经知道了BFF可以解决很多场景的问题,这里总结一下BFF的优势:

  1. 服务端对数据展示服务进行解耦,展示服务由独立的BFF端提供,服务端可以聚焦于业务处理;
  2. 多端展示或者多业务展示时,对于数据获取有更好的灵活性,避免数据冗余造成消耗服务端资源;
  3. 对于复杂的前端展示,将数据获取和组装的负责逻辑在BFF端执行,降低前端处理的复杂度,提高前端页面响应效率;
  4. 部分展示业务,可以抽象出来利用BFF实现,对于服务端实现接口复用;
  5. 降低多端业务的耦合性,避免不同端业务开发互相影响;
  6. 其他优势,包括数据缓存,接口安全校验等。
5.2 BFF 缺陷

BFF 在解决了多业务场景职责划分问题,也同样带来了一些问题,主要如下所示:

  • 模块和接口职责的划分与分工
  • 业务模块在什么时机需要独立拆分出BFF?看起来只能凭经验,应根据实际需求开发过程中数据编排和加工的逻辑占比看
  • 需要明确前端、BFF、后端微服务三者的定位、职责、界限,以及相应的保障措施比如设计和编码规范
  • 警惕业务逻辑往BFF服务蔓延,前后端在责任划分时容易偷懒,不进行深入思考,往BFF写不必要的代码逻辑
  • 响应时间延迟(服务如果是内网之间访问,延迟时间较低)
  • 编写起来较为浪费时间(因为在基础服务上添加的一层转发,所以会多写一部分代码)
  • 业务异常处理(统一格式化业务异常的返回内容)
  • 分布式事务(微服务的通病)

六、结语

微服务化后需要尽可能地保持领域模型和领域接口的纯洁性和稳定性,如何应对多样化且高频的前端展示需求是一大挑战。

架构设计是通过合理的组件拆分以及定义组件之间的关系,将系统整体的复杂性分散到不同的组件中,在更低的维度上解决问题,分而治之。

引入BFF是一个解法,但架构需要权衡,BFF服务的存在本身有利有弊,BFF的不同落地实现也有利有弊。

  • BFF在前后端分离的架构模式下隔离了前端和后端的关注点,特别是在多个前端或第三方的情况下,BFF都是非常好的选择。
  • 然而,在实施过程中,仍然要时刻警惕,明确BFF设计的初衷,避免因引入BFF而带来了更多的问题。实践能出真知,但对所支撑业务的理解也很关键,很多时候还得回到业务和团队中去看。

·END·

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
相关阅读:私藏多年的系统性能优化十大绝招(万字干货)
面对复杂业务系统,通用架构设计法则
高可用高性能核心原理探究,Kafka 核心全面总结
服务接口优化的常见方案实战总结聊聊分布式服务下的八种异步实现方式
有没有那么一瞬间,你也曾有过“失业焦虑”?浅析分布式系统中的补偿机制设计问题聊聊分布式日志系统的设计与实践
执行个 DEL 竟然也会阻塞 Redis?深挖一下果然不简单
PHP 中数组是如何灵活支持多数据类型的?
一文带你看通透,MySQL事务ACID四大特性实现原理
通过alter table 来实现重建表,同事大呼开眼界了实习生疑问:为什么要在需要排序的字段上加索引呢?代码多版改造,应用责任链设计模式
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2023-10-26,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 架构精进之路 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
C# 的事件,一般你不需要担心它的线程安全问题!
时不时会有小伙伴跟我提到在 C# 写事件 += -= 以及 Invoke 时可能遇到线程安全问题。然而实际上这些操作并不会有线程安全问题,所以我特别写一篇博客来说明一下,从原理层面说说为什么不会有线程安全问题。
walterlv
2023/10/22
4410
.Neter所应该彻底了解的委托
本文将通过引出几个问题来,并且通过例子来剖析C#中的委托以及用法,做抛砖引玉的作用
ryzenWzd
2020/04/29
4220
.NET基础拾遗(4)委托、事件、反射与特性
  委托这个概念对C++程序员来说并不陌生,因为它和C++中的函数指针非常类似,很多码农也喜欢称委托为安全的函数指针。无论这一说法是否正确,委托的的确确实现了和函数指针类似的功能,那就是提供了程序回调指定方法的机制。
Edison Zhou
2018/08/20
1K0
.NET基础拾遗(4)委托、事件、反射与特性
C#中的委托和事件 - Part.1
文中代码在VS2005下通过,由于VS2003(.Net Framework 1.1)不支持隐式的委托变量,所以如果在一个接受委托类型的位置直接赋予方法名,在VS2003下会报错,解决办法是显式的创建一个委托类型的实例(委托变量)。例如:委托类型 委托实例 = new 委托类型(方法名);
张子阳
2018/09/30
1.1K0
C#中的委托和事件 - Part.1
C#委托与事件
Delegate ----   C# 中的委托(Delegate)类似于 C 或 C++ 中函数的指针。委托 是存有对某个方法的引用的一种引用类型变量。引用可在运行时被改变。委托特别用于实现事件和回调方法。所有的委托(Delegate)都派生自 System.Delegate 类。 声明委托   声明委托的语法如下: delegate return-type delegate-name (parameter-list);   其中:return-type是返回类型,delegate-name是委托名字,pa
拾点阳光
2018/05/10
1K0
C# 事件
一、前言:前面的随笔中说完了委托,现在看看事件到底可以干什么,在前面的随笔中,使用委托的过程中,有一个很别扭,也很显然易见的问题,就是委托第一次必须初始化用"=",绑定二次事件用"+="这个是非常的,
郑小超.
2018/01/24
6420
C#  事件
C# 中的委托和事件
文中代码在VS2005下通过,由于VS2003(.Net Framework 1.1)不支持隐式的委托变量,所以如果在一个接受委托类型的位置直接赋予方法名,在VS2003下会报错,解决办法是显式的创建一个委托类型的实例(委托变量)。例如:委托类型 委托实例 = new 委托类型(方法名); 欢迎浏览本文的后续文章: C#中的委托和事件(续)
Edison Zhou
2018/08/20
9430
C# 中的委托和事件
.Net中观察者模式(Observer):C#事件
奥运会参加百米的田径运动员听到枪声,比赛立即进行。其中枪声是事件,而运动员比赛就是这个事件发生后的动作。不参加该项比赛的人对枪声没有反应。
小蜜蜂
2019/07/15
7690
.Net中观察者模式(Observer):C#事件
C# 学习笔记(7)—— 事件
事件是基于委托之上的新特性,自然也是 C# 独有的概念。事件理解起来不难,意思就是他的字面意思,就是我们日常理解的事件
Karl Du
2023/10/20
2350
[C#1] 9-委托
委托揭秘 编译器和CLR在后台做了很多工作来隐藏委托本身的复杂性,如下一句委托声明: //编译器为我们产生了一个同名的类 public delegate void MyDelegate(int i);
blackheart
2018/01/19
8070
[C#1] 9-委托
C#委托与事件学习笔记
      今天跟随视频学习了一下C#中最重要的一些概念之委托与事件。老杨的视频讲的还是挺深入浅出,不过刚接触C#.NET的人还是朦朦胧胧,就像张子阳先生说的“每次见到委托和事件就觉得心里别(biè)得慌,混身不自在”。跨过这道坎的人就有种一览众山小的感觉了。我又浏览了皱华栋老师JamesZou的博文《深入理解C#委托及原理》(地址:http://www.cnblogs.com/jameszou/archive/2011/07/21/2112497.html),以及张子阳Jimmy Zhang的博文《C# 中的委托和事件》(地址:http://www.cnblogs.com/jimmyzhang/archive/2007/09/23/903360.html)总算对委托有了一点理性的感觉了,在此谢谢ITCAST,JamesZou以及Jimmmy Zhang的博文,谢谢。
Edison Zhou
2018/08/20
4730
C#委托与事件学习笔记
庖丁解牛——深入解析委托和事件
这篇博文我不讲委托和事件的概念,因为大段的文字概念没有任何意义。 具体想了解,委托和事件的概念可以MSDN查阅。 我这篇文章的主题思路是委托如何一步步进化成事件: 何为委托--->委托来实现事件--->用方法对委托的封装--->Event的 add,remove方法的引入--->标准事件写法--->反编译探究竟。 用几个例子以及Reflector反编译探究委托和事件的关系。不足之处,还望多多指教... 何为委托: 首先,委托是一种类型,是一种定义了方法签名的类型。 委托可以理解为函数指针(安全
用户1161731
2018/03/12
1K0
庖丁解牛——深入解析委托和事件
.NET面试题系列[7] - 委托与事件
C#中的委托可以说俯拾即是,从LINQ中的lambda表达式到(包括但不限于)winform,wpf中的各种事件都有着委托的身影。C#中如果没有了事件,那绝对是一场灾难,令开发者寸步难行。而委托又是事件的基础,可以说是C#的精髓,个人认为,其地位如同指针之于C语言。
s055523
2018/09/14
1.2K0
.NET面试题系列[7] - 委托与事件
事件与委托的区别就是“+=”和“-="?
事件的作用与委托变量一样,只是功能上比委托变量有更多的限制。(比如:1.只能通过+=或 -= 来绑定方法(事件处理程序)2.只能在类内部调用(触发)事件。)
静心物语313
2020/03/24
1.3K0
事件与委托的区别就是“+=”和“-="?
理解委托类型
delegate 是一种可用于封装命名或匿名方法的引用类型。(并不是所有的引用类型都是class)
lulianqi
2018/09/07
7390
理解委托类型
C#基础篇 - 理解委托和事件
委托类似于C++中的函数指针(一个指向内存位置的指针)。委托是C#中类型安全的,可以订阅一个或多个具有相同签名方法的函数指针。简单理解,委托是一种可以把函数当做参数传递的类型。很多情况下,某个函数需要动态地去调用某一类函数,这时候我们就在参数列表放一个委托当做函数的占位符。在某些场景下,使用委托来调用方法能达到减少代码量,实现某种功能的用途。
Esofar
2018/09/05
5420
C#基础篇 - 理解委托和事件
深入分析委托与事件—C#综合揭秘——细说多线程
本篇文章将为你介绍一下 Delegate 的使用方式,逐渐揭开 C# 当中事件(Event)的由来,它能使处理委托类型的过程变得更加简单。 还将为您解释委托的协变与逆变,以及如何使用 Delegate 使 Observer(观察者)模式的使用变得更加简单。 在事件的介绍上,会讲述事件的使用方式,并以ASP.NET的用户控件为例子,介绍一下自定义事件的使用。 最后一节,将介绍Predicate<T>、Action<T>、Func<T,TResult>多种泛型委托的使用和Lambda的发展过程与其使用方式。 因为时间仓促,文中有错误的地方敬请点评。
vv彭
2021/01/06
2.2K0
[读书笔记]C#学习笔记二: 委托和事件的用法及不同.
前言:  C#委托是什么     c#中的委托可以理解为函数的一个包装, 它使得C#中的函数可以作为参数来被传递, 这在作用上相当于C++中的函数指针. C++用函数指针获取函数的入口地址, 然后通过这个指针来实现对函数的操作. 委托的定义和方法的定义类似, 只是在定义的前面多了一个delegate关键字. 正文: 委托可以被视为一个更高级的指针,它不仅仅能把地址传指向另一个函数,而且还能传递参数,返回值等多个信息。 系统还为委托对象自动生成了同步,异步的调用方式,开发人员使用BeginInvok
一枝花算不算浪漫
2018/05/18
6540
java多线程的常用方法(以及注意事项)
1 /* 2 * 线程的常用方法 3 * 1.start(); 4 * 2.run(); 5 * 3.sleep(int millsecond); 6 * 4.isAlive(); -->判断线程是否还在运行 7 * 5.currentThread(); -->返回当前正在使用CPU资源的线程 8 * 6.interrupt();
Gxjun
2018/03/22
7350
java多线程的常用方法(以及注意事项)
C#编写简单的聊天程序
这是一篇基于Socket进行网络编程的入门文章,我对于网络编程的学习并不够深入,这篇文章是对于自己知识的一个巩固,同时希望能为初学的朋友提供一点参考。文章大体分为四个部分:程序的分析与设计、C#网络编程基础(篇外篇)、聊天程序的实现模式、程序实现。
张子阳
2018/09/30
1.6K0
C#编写简单的聊天程序
相关推荐
C# 的事件,一般你不需要担心它的线程安全问题!
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验