什么情形下应该使用BFF?带你了解BFF的优势,即服务于前端的后端

news2024/11/28 19:06:06

BFF简介

BFF是一种Web架构,全名为Backends For Frontends,即为服务于前端的后端。这个词来源于Sam Newman的一篇文章:Pattern: Backends For Frontends。BFF一般指的是在前端与后端之间加增加一个中间层。为什么要在前端和后端之间增加一个BFF层呢?

计算机科学家David Wheeler曾经说过一句话:All problems in computer science can be solved by another level of indirection.计算机科学中的所有问题都可以通过加一层来解决。因此,需要使用BFF的场景,肯定是普通的前后端开发模式遇到了部分问题。例如在Sam Newman的文章中就描述了BFF解决多个展示端的场景。

多端展示问题

在系统一开始开发的时候只考虑了PC网页端的设计,服务器端API是为了PC网页端而服务的。但是后来随着移动互联网的兴起,移动端开始流行,决定在原有服务端的基础上开发移动端App,复用之前的API,但是原有API是为了PC端设计的,并不符合移动端的需求。

  1. PC端的需求与移动端并不一定完全相同,现有接口无法满足所有移动端的新需求。
  2. PC端电脑性能强,可以并发请求多个接口或进行部分较复杂的数据处理,但是移动端性能低,如果使用同样的多个接口,由前端组装数据,页面展示可能会出现延迟和卡顿现象。
  3. PC端的屏幕较大,展示内容较多且全面。但是移动端屏幕小,展示内容较少。而且部分数据的获取并不容易,需要后端调用许多服务。如果移动端复用PC端接口,会获取和传输部分无用数据,不仅消耗服务端资源,还浪费网络带宽。

在这里插入图片描述

而且随着科技的发展和用户的需求,不同的展示端越来越多,在不仅在手机上会区分Android端,IOS端,而且还会有平板电脑端,手机网页端,PC网页端,PC的APP端等等。这些端的页面设计各不相同,对于数据的需求也不相同。假设我们复用同一个服务端和API接口,如果出现不满足需求的场景就加接口加字段,那么随着这些不同客户端的开发和迭代,服务端会变的大而臃肿,效率低下。而且同一个接口提供给太多前端调用,涉及到太多的逻辑,复杂性越来越高。

因此,更好的方式是服务端对展示进行解耦,服务端只负责提供数据,有专门的展示端负责前端的展示业务。这里的展示端就是BFF层。

不同业务场景的展示模式差异

在某些业务中,客户端的类型只有一种,但是在不同的场景下,展示的模式有差异。比如在美团的BFF实践中,不同行业的团购货架展示模块不同,是两套独立定义的产品逻辑,并且会各自迭代。

在这里插入图片描述

在这种业务场景下,虽然是同一个客户端,但是业务不同,需求的数据格式和类型也不同,因此遇到与上面多端展示类似的接口问题。

短生命周期的需求

还有一种情形,是闲鱼团队遇到的短生命周期的需求。在普通的业务场景下,服务端正常稳定迭代开发。但是偶尔会有一些特殊的运营活动,这种活动时间较短,可能仅仅持续几天时间。

如果仅仅为了这些几天的活动,每次都要开新API,联调,甚至修改原有服务端的逻辑,成本较大,而且较为低效。如果加一层BFF,让前端可以直接获取数据,那么开发和联调会变的简单很多。

业务整合需要

在某些情形下,业务后端和需求比较复杂,例如这篇文章涉及到的场景,有一个Moments App,包含了像用户管理,关系管理,信息,头像,点赞等多种多种后端微服务。这些服务在前端展示的逻辑耦合性较强。比如有些需要串行处理,例如得到服务1的结果才可以调用服务2;有些则可以并行处理。而数据合并和整理的逻辑额较为复杂。

在这里插入图片描述

图片来源:跨平台架构:如何设计 BFF 架构系统?

网易云音乐也使用BFF进行微服务的调度以及数据的组装和适配。

在这里插入图片描述

图片来源:基于 GraphQL 的云音乐 BFF 建设实践

这时候可以设立一个BFF层,作为一个数据整合服务,将调用不同微服务接口,与数据处理的复杂逻辑都在BFF端中实现,降低了前端的复杂度,也提高了响应效率。

处理部分展示相关的业务

在使用了BFF之后,部分页面展示相关的业务逻辑可以抽象出来,交由BFF端处理。

例如数据导出Excel下载服务,输入导入Excel上传服务。BFF层可以接收用导入的Excel,解析并处理表格数据,然后提供给服务端。在导出时,也可以调用服务端API获取数据,由BFF端整合提供给前端下载。在这种情形下,服务端只需要提供一个展示接口,就可以满足页面展示和导出两种不同格式的展示需求。导入也是同理。而且假设表格与页面展示要求的数据格式不同,例如导入时部分字段值需要作转换,那么也可以由BFF端处理这种差异。

BFF的类型

BFF本身仅仅是一个概念,实现方式有多种,在实际中我们要根据不同的场景选取不同的方案。按照大类分,主要有单一BFF和多端BFF。

在这里插入图片描述

单一BFF

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

很多单一BFF都会用到GraphGL,他是由Facebook开发的数据查询工具。通过该工具,可以将不稳定的数据组装部分从稳定的业务数据逻辑中剥离,使数据控制逻辑前移,开发模式由“下发数据”转变成“取数据”的过程。

例如美团,闲鱼,网易云音乐等的BFF,都提供了按需查询能力,一个BFF对接多种客户端或者多种业务的需求。下图是美团使用的BFF架构设计。

在这里插入图片描述

图片来源:GraphQL及元数据驱动架构在后端BFF中的实践

多端BFF

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

前端BFF与后端BFF

从技术上分,BFF又可以分为前端BFF和后端BFF。即BFF层由前端团队主导或者后端团队主导。前端团队的BFF一般使用Node.js,后端团队则会使用Java或者其他服务端语言。

如果使用前端BFF,可以实现谁使用谁开发,一定程序生避免了前后端实现的上不必要的沟通成本。但需要前端团队有一服务端开发经验,对前端团队的技术建设有较高需求。但是前端也能更深入的接触业务逻辑,对于重展示的业务需求有一定优势。例如淘宝的实践:大淘宝技术行业FaaS化实战经验分享。

传统接口与按需查询

传统接口模式即正常开发接口,固定入参和返回数据格式,供前端调用。按需查询模式即前端调用接口时指定需要哪些数据,前端自主进行按需查询。GraphQL即是使用按需查询的模式。

BFF的其他特点

与ServerLess集成

使用前端BFF时,前端开发可能缺乏运维经验,而且在高可用,并发性等问题上可能会遇到挑战。如果结合Serverless实现自动扩容,弹性伸缩等功能,可以解决一些BFF的问题。

在这里插入图片描述

阿里云的云原生团队介绍了这一方法:基于函数计算的 BFF 架构(图片来源)

BFF与网关

网关可以提供路由,认证,监控,日志等服务。网关可以与BFF集成在一起,也可以作为独立的一层来实现。如果业务复杂,还可以在不同的BFF上层配置不同的网关。

在这里插入图片描述

这篇文章介绍了在不同场景下,BFF层与网关的应用。
微服务架构:BFF和网关是如何演化出来的?(图片来源)

BFF的优势

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

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

参考

  • Pattern: Backends For Frontends
    https://samnewman.io/patterns/architectural/bff/
  • GraphQL及元数据驱动架构在后端BFF中的实践 美团技术团队
    https://mp.weixin.qq.com/s/mhM9tfWBlIuMVkZQ-6C0Tw
  • 高效研发-闲鱼在数据聚合上的探索与实践 闲鱼技术
    https://mp.weixin.qq.com/s/9P_16cNEF0puHg75fVL1xA
  • 跨平台架构:如何设计 BFF 架构系统?
    https://www.jianshu.com/p/bfc652baccf7
  • 什么是 GraphQL? 知乎
    https://www.zhihu.com/question/264629587
  • DDD系列文章第10篇:BFF架构
    https://www.cnblogs.com/arrowolf/articles/16708302.html
  • 基于函数计算的 BFF 架构 阿里云云原生
    https://juejin.cn/post/6844904113033969672
  • 微服务架构:BFF和网关是如何演化出来的?
    https://juejin.cn/post/6844903806208049159
  • 基于 GraphQL 的云音乐 BFF 建设实践 网易云音乐技术团队
    https://juejin.cn/post/7182019663004434488
  • 大淘宝技术行业FaaS化实战经验分享
    https://juejin.cn/post/7143520902913720327

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

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

相关文章

Python潮流周刊#5:并发一百万个任务要用多少内存?

△点击上方“Python猫”关注 ,回复“1”领取电子书 你好,我是猫哥。这里记录每周值得分享的 Python 及通用技术内容,部分为英文,已在小标题注明。(标题取自其中一则分享,不代表全部内容都是该主题&#xff…

oc 安装 demo 版本

版本 demo 版本用于学习;推荐订阅版本,个人商用,3.0 以下有破解,4.0 据说没有破解版本企业版,企业商用版本。 demo 版本用于学习 demo 安装需要 下载地址 oc安装 官方文档 https://docs.otoy.com/cinema4d/Instal…

Java并发体系-第四阶段-AQS源码解读(有时间就了解一下)

可重入锁 /*** 可重入锁:* 1、可重复可递归调用的锁,在外层使用锁之后,在内层仍然可以使用,并且不发生死锁,这样的锁就叫做可重入锁。* 2、是指在同一个线程在外层方法获取锁的时候,再进入该线程的内层方法会自动获取锁…

【Java多线程进阶】死锁

前言 死锁(Deadlock)是指两个或多个线程在执行过程中,因争夺资源而造成的一种互相等待的现象,如果不提前预防或外界干扰,这些线程将无法执行下去。因此,本篇博文讲解造成死锁的原因以及解决方案。 目录 1.…

7.条件渲染

目录 1 wx:if 2 wx:elif 3 wx:else 4 block标签配合条件渲染 5 hidden 1 wx:if wx:if 与 v-if 的运行方式相同,都是 删除与创建元素(不是display:none) 2 wx:elif 3 wx:else 4 block标签配合条件渲染 我们现在有一个view套view的页面 现在我不想有外…

Executor框架的两级调度模型

Executor框架的两级调度模型 在HotSpot VM的线程模型中Java线程(java.lang.Thread)被一对一映射为本地操作系统线程。Java线程启动时会创建一个本地操作系统线程;当该Java线程终止时,这个操作系统线程也会被回收。操作系统会调度…

网络io、io多路复用select/poll/epoll、基于事件驱动的reactor

一、网络IO请求 网络I/O请求是指在计算机网络中,向其他主机或服务器发送请求或接收响应的操作。这些请求可以包括获取网页、下载文件、发送电子邮件等。网络I/O请求需要使用合适的协议和通信方式来进行数据传输,例如HTTP、FTP、SMTP等。 要完成一个完整…

【SSH】在VScode远程开发 使用SSH远程连接服务器

文章目录 前言视频教程1、安装OpenSSH2、vscode配置ssh3. 局域网测试连接远程服务器4. 公网远程连接4.1 ubuntu安装cpolar内网穿透4.2 创建隧道映射4.3 测试公网远程连接 5. 配置固定TCP端口地址5.1 保留一个固定TCP端口地址5.2 配置固定TCP端口地址5.3 测试固定公网地址远程 转…

实训小总结

1. Web概述 1.1 Web和JavaWeb的概念 Web是全球广域网,也成为万维网,能够通过浏览器访问网站。 在我们日常的生活中,经常会使用浏览器去访问 百度 、 京东 、等这些网站,这些网站统称为Web网站。我们知道了什么是Web,…

超详细的HTML学习笔记:语法特点、骨架结构、基本标签及其属性(附代码示例)

作者想先说一点废话:这篇文章是作者通过学习动力节点、黑马程序员的两套不同的THML课程整理出的学习笔记,融合了两套课程的知识点,耗费了372行代码(加代码注释),希望能帮到大家。HTML只是前端学习的开端&am…

【Redis】聊一下Redis切片集群的原理

背景 在分布式领域中,为了提高系统的稳定性,一般会采用数据复制/镜像的方式,同时部署多个相同功能的节点提供服务,也就是A B C存储的相同的数据。有一个主节点提供读写服务,另外两个节点进行数据的复制,在…

chatgpt赋能python:Python去重-如何高效地处理重复数据

Python去重 - 如何高效地处理重复数据 在数据处理过程中,重复数据可能会导致很多问题,如降低计算效率、影响数据质量等。因此,数据去重是一个非常重要的任务,特别是在大数据处理中更是如此。Python作为一种流行的编程语言&#x…

make xxx_deconfig过程

在uboot中,所写的shell脚本:mx6ull_alientek_emmc.sh的内容如下: #!/bin/bash2 make ARCHarm CROSS_COMPILEarm-linux-gnueabihf- distclean3 make ARCHarm CROSS_COMPILEarm-linux-gnueabihf- mx6ull_14x14_ddr512_emmc_defconfig4 make V1…

[数据结构习题]队列——用栈实现队列

[数据结构习题]队列——用栈实现队列 👉知识点导航💎:【数据结构】栈和队列 👉[王道数据结构]习题导航💎: p a g e 85.3 page85.3 page85.3 本节为栈和队列的综合练习题 题目描述: &#x1f…

chatgpt赋能python:Python实现CSV文件只取某两列的方法详解

Python实现CSV文件只取某两列的方法详解 介绍 CSV是一种常见的数据格式,通常使用逗号或分号分隔不同的字段。在处理CSV文件时,我们经常需要只提取其中的某些列,以便进行进一步的分析或处理。使用Python语言,可以很方便地实现这一…

MTK 相机功耗分析流程

和你一起终身学习,这里是程序员Android 经典好文推荐,通过阅读本文,您将收获以下知识点: 一、硬件功耗二、相机软件功耗三、参考文档 一、硬件功耗 1.1 硬件信息 以下硬件信息最好提前获取到 模块备注平台MTK or Qcom or sprdCPU频率大中小核…

【Python】Python系列教程-- Python3 列表(十二)

文章目录 前言访问列表中的值更新列表删除列表元素Python列表截取与拼接嵌套列表列表比较Python列表函数&方法 前言 往期回顾: Python系列教程–Python3介绍(一)Python系列教程–Python3 环境搭建(二)Python系列…

第一次使用Arduino IDE(mac os) 配置合宙ESP32C3(9.9包邮)且烧录代码的历程

目录 Arduino 配置ESP32 1. Arduino 请更新至最新版 2.科学上网 3.添加开发板管理URL 配置 1.连接开发板 2.Arduino IDE 的配置 3.烧录代码 Arduino 配置ESP32 1. Arduino 请更新至最新版 2.科学上网 3.添加开发板管理URL 首选项,编辑并添加 https://…

医疗实施-DRG基本知识

医疗实施-DRG基本知识 DRG常见名词定义: DRG(Diagnosis Related Groups):疾病诊断相关分组,是用于衡量医疗服务质量效率以及进行医保支付的一个重要工具。DRG 实质上是一种病例组合分类方案,即根据年龄、疾病诊断、合…

网络安全学术顶会——NDSS 2023 议题清单、摘要与总结(下)

51、Let Me Unwind That For You: Exceptions to Backward-Edge Protection 通过堆栈缓冲区溢出进行反向边控制流劫持是软件利用的终极目标。直接控制关键的堆栈数据和劫持目标使得攻击者特别喜欢这种利用策略。因此,社区已经部署了强大的反向边保护,如影…