BFF:优化前后端协作设计模式

BFF:优化前后端协作设计模式

BFF是什么

BFF即 Backends For Frontends (服务于前端的后端)。是一种介于前端和后端之间一种重要的通信设计模式。它旨在解决前端与后端协作中的复杂性问题。

背景

  • 行业背景:传统前端应用(如Web应用、移动应用等)直接与后端API通信,这种情况下,前端往往需要处理大量的数据转换、组合和过滤操作,导致前端代码变得复杂难以维护
  • 企业现状:根据具体情况梳理

解决什么问题

  • 降低前后端耦合,简化前后端开发和代码量,允许前后端团队独立迭代
  • 聚合服务数据,避免前端直接调用过多后端服务接口复杂性
  • 个性化定制,传统服务端业务逻辑处理迭代不堪重负。自定义输出不够灵活
  • 增强服务性能,可通过缓存、预拉取数据等方式减少服务请求
  • 增强系统安全性,收拢统一处理身份验证、权限前端处理逻辑
  • 支持多语言开发,服务发版影响线上业务操作

问题梳理

1. 耦合性问题
  • 前后端耦合较深:存在不能独立发版,相互依赖
  • 清晰功能API:设计API应当遵循一致性和可扩展性原则,简单易懂提供给开发者用来匹配业务需求
  • 灵活定制化需求:增加开发灵活度,简化前后端开发和代码量
2. 性能问题
  • 减少服务请求:可通过缓存、预拉取数据等方式减少服务请求
  • 聚合服务数据:收纳接口,底层数据调用处理。减少前后端交互逻辑处理
  • 无热更新:不同于传统后端服务发版过程中导致服务不可用的时间内影响业务使用
3. 安全问题
  • 统一鉴权和验证:BFF层统一处理安全逻辑,保护数据安全,简化前端应用的安全处理。
  • 拦截脚本攻击:统一拦截处理输入的接口内容的合法性,实现脚本拦截和异常数据处理
4. 扩展性问题
  • 支持多语言扩展:现存后端接口基本上主要以java为主,但BFF支持Node.js、Java、Python等,一些低频、复杂场景需求可以交付前段来维护开发
  • 统一监控日志处理:预置监控和日志记录,帮助发现和解决问题,同时提供有用的性能数据和统计信息
  • 持续扩展优化投入大:保持BFF高效和可维护性,通过监视性能、定期更新技术栈、重构代码和修复缺陷等方式来实现

如果当系统中存在这些的情况,依赖传统开发对接模式,只会造成对业务业务逻辑越来越繁重,历史技术债更加突出。解耦部分服务端业务处理,让底层服务能力更纯粹单一。BFF解决逻辑处理各种自定义业务需求,简化各个流程,提升系统稳定性。

怎么解决

当了解BFF要解决的业务痛点后,接着了解BFF究竟是如何解决的。

1. 定位场景

首先要明确哪些场景需要适合BFF模式?任何模式和框架都有各自的局限性,BFF也不例外。在实际开发中,哪些场景和业务需求是最佳方案?

  1. 多个数据整合统一,提供前端应用所需完整api,避免直接调用过多后端服务接口的复杂性
  2. 自定义定制服务,避免灵活业务导致后端底层服务接口频繁改动,以及适配不同业务场景
  3. 统一鉴权、非法输入拦截等XSS等数据安全处理
  4. 轻业务形架构模式快速响应,让后端更专注底层服务能力的构建,灵活支持业务需求

通过架设BFF逻辑层处理,解决不同业务模式之间的耦合问题,提高代码的可维护性,灵活支持业务定制需求。

2. 使用BFF架构

传统模式

在这里插入图片描述

从上图可以看到:不同的客户端请求经过同一个网关后,它们都将分别重定向到为对应客户端设计的 API 服务中。因为每个 API 服务只能针对一种客户端,所以它们可以对特定的客户端进行专门优化。而去除了兼容逻辑的 API 显得更轻便,响应速度还比通用的 API 服务更快(因为它不需要判断不同客户端的逻辑)。

除此之外,每种客户端还可以实现自己发布,不需要再跟着其他客户端一起排期。

此时的方案挺完美了吧?还不完美,因为上面的方案属于一个通用架构。在实际业务中,我们还需要结合实际业务来定,下面我们深入说明一下实际业务需求。

前面我们列出了 5 种服务,实际上,整个供应链系统将近有 100 种服务。因为它是一个非常庞大的系统,且整个业务链条的所有工作都包含在这个系统中,比如新零售、供应链、财务、加盟商、售后、客服等,,这就需要几百号研发人员同时进行维护。

因为我们共同维护一个 App、PC 界面、新零售、售后、加盟商,还有各自的小程序和 H5,所以为了实现业务解耦和分开排期,每个部门需要各自维护自己的 API 服务,而且 App 与 PC 前端也需要根据部门实现组件化,此时的架构如下图所示。

BFF模式

在这里插入图片描述

归纳

在这里插入图片描述

3. 逻辑案例

在这里插入图片描述

BFF局限性

1. 增加微小延迟

BFF是在传统客户端和服务API之间的额外处理服务,对比前端发起的多个请求,中间层服务转发处理相对来说会有微小的服务延迟,但同时也会减少前端逻辑时间。

2. 增加系统复杂度

相较于传统后端服务+网关+前端的模式。BFF将多存在一个链路和代码,变成:后端服务+BFF+网关+前端或者 后端服务+网关+BFF+网关+前端模式,抽离后的链路无疑会增加系统复杂度

3. 边界责任易混乱

每个人对一个技术认知是不同的。需要明确前端、BFF、后端服务三者的定位、职责、界限,以及相应的设计和编码规范。警惕业务逻辑无脑往BFF服务蔓延,不进行深入深入思考会将前后端责任划分容易混乱,造成BFF写入不必要的代码逻辑

设计原则

要构建一个高效的BFF,需要遵循一些设计原则,以确保其可维护性、可扩展性和性能。以下是一些关键的设计原则:

  1. 单一职责原则(Single Responsibility Principle)
    BFF应该具有单一职责,即它只负责处理前端的请求和响应,不应该包含过多的业务逻辑。这有助于保持BFF的简洁性和可维护性。

  2. API精细化
    BFF应该提供精细化的API,每个API端点都应该对应一个特定的前端页面或组件。这有助于减少前端不必要的数据获取和减小数据传输的大小。

  3. 数据聚合与转换
    BFF应该负责聚合来自多个后端服务的数据,并进行必要的数据转换,以满足前端的需求。这可以减少前端的数据处理工作,提高性能。

  4. 安全性
    BFF应该负责实施安全性控制,包括身份验证和授权。它应该确保前端只能访问其有权访问的资源。

  5. 性能优化
    BFF应该采取措施来优化性能,例如缓存、异步处理等。这可以减少前端应用的等待时间,提升用户体验。

  6. 版本管理
    BFF应该支持API版本管理,以确保前端应用可以平稳升级而不受影响。

使用原则

  • 多端应用
    设计API时要考虑不同设备应用的需求,也就是为不同的设备提供不同的API,虽然他们可能会实现相同的工鞥,但因为不同系统、业务组、设备的特殊性,他们对服务端的API访问会各有特点,需要区别处理
  • 聚合服务
    同类的业务流程被拆分到不同的服务和业务组中,这在增加业务灵活性的同时,也让前端的调用变得复杂。BFF的出现为前端应用提供一个对业务服务的聚合API,减少复杂服务的调用链,让前端聚焦处理所需的数据,后端专注开发底层服务能力。减少前后端底层数据对接造成频繁改动的成本。
  • 非必要不新增
    BFF带来数据交互的好处同时,要注意它所带来代码重复和工作量增加方面的问题。如果有BFF功能类似,逻辑处理大致相同的服务API,一定要谨慎对待BFF行为。

参考文档:

  • 微服务 BFF 架构设计
  • BFF 模式介绍
  • 我们应该如何理解BFF架构设计?
  • BFF治理与优化实践

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

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

相关文章

微服务-MybatisPlus下

微服务-MybatisPlus下 文章目录 微服务-MybatisPlus下1 MybatisPlus扩展功能1.1 代码生成1.2 静态工具1.3 逻辑删除1.4 枚举处理器1.5 JSON处理器**1.5.1.定义实体****1.5.2.使用类型处理器** **1.6 配置加密(选学)**1.6.1.生成秘钥**1.6.2.修改配置****…

网络安全防御【IPsec VPN搭建】

目录 一、实验拓扑图 二、实验要求 三、实验思路 四、实验步骤: 修改双机热备的为主备模式: 2、配置交换机LSW6新增的配置: 3、防火墙(FW4)做相关的基础配置: 4、搭建IPsec VPN通道 (1…

Java代码基础算法练习-求杨辉三角第n行的值-2024.07.27

任务描述&#xff1a; 给定一个非负整数n&#xff0c;生成「杨辉三角」的第n行。&#xff08;1<n<10&#xff09;在「杨辉三角」中&#xff0c;每 个数是它左上方和右上方的数的和。 &#xff08;提示&#xff0c;第一列数值为1&#xff0c;如数组下标用i,j表示&#xf…

独占电脑资源来执行一个应用

1. 背景 在人工智能时代&#xff0c;随着神经网络的发展&#xff0c;训练人工智能模型需要越来越多的硬件资源&#xff0c;例如&#xff0c;利用10万条棋局数据、使用一台PC电脑、完整地训练一次确定性神经网络五子棋模型&#xff0c;需要花费一年半的时间。随着训练数据的增长…

APP逆向 day23司小宝逆向

一.前言 今天也是讲最后一个基础知识点了&#xff0c;ptrace占坑&#xff0c;这个也算是一个坑&#xff0c;今天通过这个案例和大家讲一下&#xff0c;今天这个案例我们来整验证码登录&#xff0c;版本选择4.7.8 二.抓包分析 抓包发现&#xff0c;请求头里的东西通过改包发现…

Spring Boot:图书管理系统(一)

1.编写用户登录接口 代码&#xff1a; package com.example.demo;import jakarta.servlet.http.HttpSession; import org.springframework.util.StringUtils; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotatio…

技术成神之路:设计模式(九)备忘录模式

介绍 备忘录模式&#xff08;Memento Pattern&#xff09;是一种行为设计模式&#xff0c;它允许在不破坏封装性的前提下捕获和恢复对象的内部状态。通过备忘录模式&#xff0c;可以在程序运行过程中保存和恢复对象的某个状态&#xff0c;从而实现“撤销”等功能。 1.定义 备忘…

【BUG】已解决:UnicodeDecodeError: ‘utf-8’ codec can’t decode bytes in position 10

UnicodeDecodeError: ‘utf-8’ codec can’t decode bytes in position 10 目录 UnicodeDecodeError: ‘utf-8’ codec can’t decode bytes in position 10 【常见模块错误】 【解决方案】 欢迎来到英杰社区https://bbs.csdn.net/topics/617804998 欢迎来到我的主页&#x…

使用python内置的虚拟环境

在一台机器上安装了太多的第三方python库&#xff0c;它们依赖相同的库可能版本不同&#xff0c;就会造成某些第三方库崩溃&#xff0c;之前可以使用的库可能就会坏掉不能用了&#xff0c;所以可以使用虚拟环境运行不同的程序&#xff0c;python有内置的虚拟环境&#xff1b; …

前端八股文 promise async await 的理解

promise是什么 Promise 是异步编程的一种解决方案&#xff0c;比传统的解决方案——回调函数和事件——更合理和更强大。 目的 解析 吴优编程 &#xff08;解决异步编程中的嵌套问题的&#xff0c;将嵌套的格式 用peomise 写成同步&#xff09; promise.then() 是成功后继…

Cocos Creator2D游戏开发(4)-飞机大战(2)-编辑器界面

编辑器几个重要板块 参考: https://docs.cocos.com/creator/3.8/manual/zh/editor/ (1) 场景编辑器: 仅看2D视图: 按钮作用依次是: 平移, 旋转,缩放,矩形变换,增量吸附工具,最后三个,前俩是变换工具,最后一个是布局组件 矩形变换: 中心点和锚点切换 以后用到慢慢整吧! (2)层…

AI服务器产业链研究分析

AI服务器产业链初探 一、AI服务器的技术架构与构成 AI服务器的主要构成包括&#xff1a; 芯片种类丰富&#xff0c;包括X86、ARM、MIPS等架构的CPU&#xff0c;以及GPU、FPGA、ASIC和NPU等。 内存&#xff1a;DRAM、HBM&#xff08;高带宽存储&#xff09;。 本地存储&#…

前端开发调试工具推荐分类整理

具体前往&#xff1a;前端调试工具分类整理汇总

黑马Java零基础视频教程精华部分_6_字符串

系列文章目录 文章目录 系列文章目录前言一、API是什么&#xff1f; API帮助文档案例&#xff1a;API文档练习Step1&#xff1a;查找文档中Scanner内容。Step2&#xff1a;学习文档中Scanner内容。 二、字符串String类1、String概述总结&#xff1a; 创建String对象的两种方式2…

java学习--String类StringBuffer类StringBuilder类

String类简介 关系图&#xff1a; value不可修改的是value指向的地址&#xff0c;因为可以value为一个数组&#xff0c;而数组名其实就相当于一个指针&#xff0c;指向着一块地址&#xff0c;然后在指向的地址里存放相应的值&#xff0c;值可以任意是什么&#xff0c;但是地址不…

RedHat Enterprise Linux 7 YUM源(本地/网络源)配置详解

目录 一、挂载 二、建立本地源 三、建立网络源 四、验证可行性 一、挂载 ——将光盘挂载到 /mnt 下 当/mnt中有如图内容时&#xff0c;即挂载成功 若挂载光驱/dev/sr0时报错&#xff1a;mount: no medium found on /dev/sr0 解决措施&#xff1a;查看该设备状态是否全部勾选…

MATLAB仿真:数字信号处理IIR数字滤波器设计

目录 1&#xff0e;实验目的 2&#xff0e;实验原理 3&#xff0e;实验仪器及设备 4. 实验内容及步骤 5&#xff0e;信号产生函数mstg清单 6.实验程序及波形如下&#xff1a; 1&#xff0e;实验目的 &#xff08;1&#xff09;熟悉用双线性变换法设计IIR数字滤波器的原理…

Python——Pandas(第三讲)

文章目录 修改替换变量值对应数值的替换指定数值范围的替换 虚拟变量变换数值变量分段数据分组基于拆分进行筛选 分组汇总使用 agg 函数进行汇总引用自定义函数 长宽格式转换转换为最简格式长宽型格式的自由互转 多个数据源的合并数据的横向合并concat 命令 处理缺失值认识缺失…

【题解】328. 奇偶链表(链表)

https://leetcode.cn/problems/odd-even-linked-list/description/?envTypestudy-plan-v2&envIdleetcode-75 class Solution { public:// 定义一个函数&#xff0c;用于将链表中的奇数和偶数节点分开ListNode* oddEvenList(ListNode* head) {// 创建两个哑节点&#xff…

python+vue3+onlyoffice在线文档系统实战20240723笔记,项目界面设计和初步开发

经过之前的学习,已经能够正常打开文档了。 目前为止,我们的代码能够实现: 打开文档编辑文档手动保存自动保存虽然功能依然比较少,但是我们已经基本实现了文档管理最核心的功能,而且我们有个非常大的优势,就是支持多人同时在线协同编辑。 现在我们要开发项目,我们得做基…