引言

晚上公司开了一个技术分享会,主要内容就是公司的项目架构,会中讲解了项目整体架构是BFF架构,就是在微服务之上多加了一层。

除此之外,还讲解了DDD设计思想,主要用于各个业务中台,如订单中台、用户中台等。

这是我的架构第一课,听得有些似懂非懂,于是浅浅地整理一下。

BFF

是什么

BFF是服务于前端的后端,全称Backend For Frontend。BFF的位置在与客户端与服务端中间,起到一个中间件的作用,我在听的过程中更觉得像是一个前端与后端之间的网关。

为什么使用

BFF是近些年新衍生出来的一种开发模式,或者说是一种适配模式的系统,为了适配微服务模式下前端后端系统接口调用混乱而出现的。

在如今微服务盛行的趋势下,大型系统中划分出了数十个服务模块,例如商品,门店,运费,红包,订单,优惠券,CMS,用户,搜索,推荐,广告等等系统,前端也有小程序,APP,网页等端。由此产生了很多问题:

  • 前端问题:每次需求开发前端要对接多个系统来确认接口信息,不同的数据要找不同的系统,各个接口散落一地,开发调试的效率极低。
  • 后端问题:后端同样也需要各自包装数据信息来提供前端处理,重心变成如何为前端提供数据,因为需要根据不同的版本、客户端、用户、定位等特征来判别,很多时间浪费在展示层,而不能专注于业务逻辑处理,每个后端系统各自为战,都有自己的接口规则,各种历史版本问题都不能完全统一,所有系统都严重耦合了版本问题。
  • 变更不灵活:当产品想要更新需求时,更是牵一发而动全身,某一块的小改动需要在各个系统之间找接口来回沟通,大部分系统都要重新上线一次。

如下图所示,未启用BFF架构之前,前后端的沟通链路过多。

BFF的网关定位

鉴于以上痛点,需要一个中间层来适配前后端服务,BFF由此而生,它负责将所有下游后端接口进行统一调用,下游接口只需要提供RPC接口供网关使用,BFF网关提供Web接口来让前端调用,最后将数据进行组装拼接,根据前端的需求来返回数据。

所以BFF的核心定位就是:“统一下游接口,为前端提供服务”。

只有把握好服务这个概念,才能做好BFF网关系统,其他系统可以扯皮甩锅,但BFF网关不可以,它与生俱来的使命就是把这两边拉扯起来,所有不合理不合适,繁琐无用的逻辑都需要BFF网关去处理,后端只要做好业务逻辑,前端做好展示,其他的都可以交给BFF网关。

BFF网关特点

BFF作为一种特殊网关,还有以下特点:

琐碎

BFF网关主要为前端进行服务,前端不关心版本、客户端、定位、用户身份等情况,只接收渲染数据即可,而这些逻辑都需要耦合到BFF网关中,以版本、客户端、定位、用户等特征作为纬度,其中版本最为最复杂的分支,可能贯彻整个系统生涯几十个版本类型都需要做兼容,由此还需要兼顾不同客户端的展示要求和用户特征,所以BFF网关中必然需要做大量判断分支,根据上百种情况组合判断来生成-唯一版本-唯一端-唯一用户的数据结构。

数据琐碎

BFF不需要数据库,这点会在下面说明,所以有很多数据需要以静态变量的形式存放在代码里,或者是使用配置中心来动态配置,例如图片地址、各种色值、模块固定文字、处理标识等,这些琐碎的数据都会存放在BFF网关中进行维护,如果放在前端,修改时必须要进行发版,时间周期太长,而存放在后端的话,又会打散数据,不能从一个地方作为主要数据窗口进行管理。

逻辑琐碎

衍生第一点说到的,BFF网关作为下游接口的聚合,每次流程需要调用数十个后端接口,再根据版本、端、用户进行逻辑处理,历史逻辑与新需求杂糅在一起,实现新功能的同时要不断兼顾历史逻辑,只能是加入大量的分支判断,最后变成了if大爆炸,或者使用策略模式进行优化,但无论如何怎么包装都无法掩盖琐碎的逻辑。

性能

BFF网关的耗时主要有两部分:

  • 内部处理耗时
  • 下游RPC接口耗时

BFF作为最直接和前端交互的接口,BFF的耗时将直接影响用户浏览体验,所以BFF性能一定要最优,不断压缩耗时来提高接口响应性能,内部逻辑优化时,首先观察下游接口耗时情况,各个模块之间难免重复调用接口,可以使用编排框架将下游接口调用进行优化。然后使用线程池进行并发处理,能够并发处理的一定要并发执行,这样可以极大降低下游接口耗时,提供接口处理能力。

缓存

切勿在BFF网关中使用缓存

此处指的缓存主要是Redis等中间件缓存,BFF网关主要数据来源都是通过调用下游接口获取,这里是最耗时的,如果想要减少下游接口耗时,应该使用并发或者编排能力,而不可以通过缓存下游接口数据来实现。

  • 成本问题:下游接口数据会根据传入的定位、用户等信息查询,当系统用户量大、覆盖城市多时,需要缓存的数据量将剧增,而数据缓存后再次访问概率很低,造成严重的缓存空间浪费。
  • 一致性问题:BFF网关的引入主要是为了统一后端接口,性能是网关的一大指标,但不能为了性能将所有下游接口数据进行缓存,从而牺牲数据一致性,后续展示时一旦出现问题,将增加排查难度。

降级

任何时候都不要将错误直接返回给用户,不论是下游的错误还是系统内部的错误,这一点完全可以交给BFF网关来做,这里降级可以分为两类型处理。

  • 下游接口降级:当下游接口出现超时或数据异常时,一定要做好降级措施,例如增加接口超时时间判断,及时中断调用,不要因为某个下游接口而影响整体性能,当下游接口报错时,也要做好异常捕获,整体页面可以直接丢弃这部分数据不做展示,而不能完全不展示。
  • 异常整体降级:在BFF网关内部处理逻辑中难免会有错误发生,或者下游核心的定位、商品等接口异常,这里就需要做整体降级,例如模拟一个友情提示页面等,提示用户稍等重新刷新,或者在未开通城市里可以引导用户切换地址,整体页面的降级尽量交给BFF网关来做,而不要分散到不同的前端来做。

BFF网关划分

接口粒度

如上图,BFF网关的下游接口较多,如何聚合下游接口进行划分是一个需要考虑的问题,这里提供的建议是按照页面来划分,例如在首页可以提供首页接口返回整体展示效果,购物车页面提供购物车接口,以页面为单位划分可以方便前后端的统一处理,当然如果页面内容太多时,BFF网关接口可能耗时较多,可以同页面拆分开来,让前端并行加载接口,这样既能降低整体页面加载时间,也能让BFF网关减少下游接口调用。

数据安全

BFF网关虽然也叫网关,但数据安全方面例如安全攻防等主要还是外层去做,BFF只负责数据的调用组装,不要再赋予其他太多功能,但BFF网关一定要有限流逻辑,可以采用Sentinel等框架实现,防止某个前端异常进行大量请求,打垮BFF网关导致所有前端异常。

上线注意

BFF网关较为单薄,没有依赖的数据库等大型中间件,可能只是用到比较轻量的配置中心和消息队列,所以上线时初始化参数较少,但因为BFF网关需要做版本、定位、客户端等特征的数据处理,所以一定要做好灰度上线,防止新功能影响到历史版本、不同定位下的用户浏览。

优势总结

  • 降低后端开发联调成本:直接提供RPC接口将基础数据返回即可;
  • 降低前端开发联调成本:直接对接一两个接口就可以拿到全部数据,并且可以将很多前端写死的逻辑交给BFF网关做下发,提高前端展示的灵活性;
  • 方便需求迭代升级:当大量前端逻辑移植到BFF网关,很多需求的上线不再依赖前后端发版,直接让BFF快速上线更新即可;
  • 提高用户体验:BFF网关可以较低成本的做异常降级处理,为前后端包装错误提示,统一异常捕获类型;
  • 提高系统性能:虽然引入BFF网关相当于多加了一层,但BFF网关可以通过并发调用下游接口,或者线程池的形式提高接口处理性能,而不需要像之前前端去逐个调用接口,规范了整体接口调用执行逻辑。

架构-初识BFF的更多相关文章

  1. SDP架构初识

    实现零信任的框架主要有SDP和Google Beyondcorp模型,前者出现在乙方的安全解决方案中,后者多作为甲方落地零信任的参考.本文主要记录对SDP技术的一些初步认识. 一.SDP简介 SDP是 ...

  2. SDN与OpenFlow架构--初识

    一,为什么需要SDN 1,传统网络的缺点: a,传统网络及其设备的只可配置,不可编程,只能按照已定义好的协议处理或转发数据,不能适应需求新变化,不能自主开发新功能. 如购买一个电饭煲,可以煮饭,煲汤. ...

  3. day 33

    目录 数据库是什么 为什么使用数据库 数据库的分类 关系型(把数据保存在硬盘里) 非关系型(把数据保存在内存里) mysql的架构 初识mysql 操作数据库 增 删 改 查 数据库是什么 数据库即存 ...

  4. 微服务架构~BFF和网关是如何演化出来的

    介绍 BFF(Backend for Frontend)和网关Gateway是微服务架构中的两个重要概念,这两个概念相对比较新,有些开发人员甚至是架构师都不甚理解. 本文用假想的公司案例+图示的方式, ...

  5. django上课笔记6-MVC,MTV架构-中间件-初识Form组件

    一.MVC,MTV架构 models(数据库,模型) views(html模板) controllers(业务逻辑处理) --> MVC models(数据库,模型) templates(htm ...

  6. 架构设计系列-前端模式的后端(BFF)翻译PhilCalçado

    本文翻译自PhilCalçado的官网:https://philcalcado.com/2015/09/18/the_back_end_for_front_end_pattern_bff.html 对 ...

  7. 架构模式: 服务前端的后端(BFF模式)

    架构模式: 服务前端的后端(BFF模式) 上下文 让我们假设您正在构建一个使用Microservice体系结构模式的在线商店,并且您正在实现产品详细信息页面.您需要开发产品详细信息用户界面的多个版本: ...

  8. 微服务架构中的BFF到底是啥?

    在<技术中台与业务中台都是啥玩意>一文中留下一个问题:BFF是啥?为啥在API网关和业务中台之间加入了一层BFF?考虑到在实际工作中,我的大部分同事都问过这个问题,这里我也总结一下进行答复 ...

  9. 【NopCommerce源码架构学习-一】--初识高性能的开源商城系统cms

    很多人都说通过阅读.学习大神们高质量的代码是提高自己技术能力最快的方式之一.我觉得通过阅读NopCommerce的源码,可以从中学习很多企业系统.软件开发的规范和一些新的技术.技巧,可以快速地提高我们 ...

  10. dubbo初识(一)Dubbo架构设计详解

    参见http://shiyanjun.cn/archives/325.html Dubbo是Alibaba开源的分布式服务框架,它最大的特点是按照分层的方式来架构,使用这种方式可以使各个层之间解耦合( ...

随机推荐

  1. Python-提高-2

    阅读目录 1.多继承以及MRO顺序 2.再论静态方法和类方法 3.property属性-讲解 4.property属性-应用 5.魔法属性 6.面向对象设计 7.with与"上下文管理器&q ...

  2. C++ 迪利克雷(Dirichlet)分布

    遇到一个要使用 dirichlet 分布的情形,发现 C++ 标准库中没有现成的.查阅维基百科发现,虽然它挺复杂,但是它跟 Gamma 分布有如下关系: 设有 K 个相互独立且分别满足 Gamma 分 ...

  3. Uniswap V2 核心 合约代码

    Uniswap V2 核心 UniswapV2Factory UniswapV2Pair UniswapV2ERC20 IUniswapV2Router02 1. UniswapV2Factory 合 ...

  4. Redis可视化管理工具之Redislive

    RedisLive是一款用Python编写基于WEB的Redis图形监控工具,也是一款实时监控Redis数据的开源软件,以WEB的形式展现出redis中的key的情况,实例数据等信息. RedisLi ...

  5. 什么是.NET的强类型字符串(Strongly typed string)?

    在.NET中,强类型字符串(Strongly typed string)并不是一个官方的概念,是指使用特定的结构来表示某种类型字符串数据的编码实践.类似于枚举,可以提供编译时检查类型,减少运行时错误, ...

  6. PythonDay5Advance

    PythonDay5Advance 函数和模块 main函数要有,用户自己选择要做的功能,根据选择调用不同的函数 用户注册的信息需要使用一个文件存储,登录需要判断用户是否存在,密码是否正确 注册的时候 ...

  7. 基于 .NET 开发的多功能流媒体管理控制平台

    前言 今天大姚给大家分享一个基于 .NET 开发且开源(MIT License)的多功能流媒体管理控制平台:AKStream. 项目介绍 AKStream是一个基于.NET开发且开源(MIT Lice ...

  8. ZCMU-1156

    思路: 要改变的是一个范围的情况,所以正常情况下会超时. 查阅后知道应该用一个叫做树状数组的结构. 查阅和树状数组的后续情况 这个也不错 注意: 我没怎么看懂,可能没太仔细看. 树状数组当中存在的是前 ...

  9. 精橙FPGA,一个承接FPGA代码设计的资深工程师团队。

    一.我们是谁 精橙FPGA,一个承接FPGA代码设计的资深工程师团队. 二.服务内容 面向在校学生.职场工程师等人员,提供FPGA入门指导和FPGA代码设计外包服务. 三.业务范围 主要提供Xilin ...

  10. Mac文件拷贝Win后的._文件清理

    前言 我们在从mac向win拷贝文件后总会多出来 部分 ._ 开头的文件或名为.DS_Store的文件 根据上图在苹果官方社区的回答来看,这些文件存储了主文件的一些资料,图表等数据,如果说未来这些文件 ...