后端架构模式之-BFF(Backend-For-Frontend)

Backend-for-Frontend(BFF) 的概念与意义

1. 什么是 Backend-for-Frontend(BFF)?

Backend-for-Frontend(简称 BFF)是一种后端架构模式,它为特定的前端应用(Web、移动端、桌面端等)提供专门的后端服务,作为前端与通用后端(或微服务)之间的中间层。

在传统架构中,前端通常直接与一个通用的后端 API(如 RESTful 或 GraphQL API)交互,而 BFF 引入了一层专门的后端,让不同类型的前端(Web、iOS、Android、小程序等)有各自独立的 BFF 层。


2. 为什么需要 BFF 层?(BFF 的意义)

BFF 主要用于优化前端和后端的交互,解决以下问题:

(1)不同前端的需求不同
  • Web、移动端、智能设备等不同的前端通常有不同的数据需求,比如:
    • Web 端可能需要加载完整的数据列表。
    • 移动端可能只需要部分关键数据,减少带宽消耗。
    • 小程序可能需要更高效的接口设计,减少 API 调用次数。
  • 如果所有前端都直接调用同一个后端 API,可能会导致前端获取了过多过少的数据,影响性能和用户体验。
  • BFF 层可以根据不同前端的需求,定制化数据格式,减少前端的额外处理。
(2)减少前端的 API 组合逻辑
  • 在没有 BFF 的架构下,前端可能需要多次调用后端 API,然后在前端进行数据合并和转换。
  • BFF 层可以封装多个 API 调用,把复杂的业务逻辑放到后端处理,前端只需要调用一个更简单、更直观的 API
(3)提升安全性
  • 直接让前端访问后端微服务可能暴露太多细节,而 BFF 层可以充当“网关”:
    • 统一进行身份认证、权限控制
    • 避免前端直接暴露数据库结构或业务逻辑,增强安全性。
(4)降低后端改动对前端的影响
  • 如果前端直接依赖通用后端 API,一旦后端改动(比如字段变更、API 结构调整),前端也必须修改。
  • BFF 层可以作为适配层,确保前端的 API 结构保持稳定,即使后端发生变更,BFF 也可以进行转换,减少对前端的影响。

3. BFF 的架构示意
[前端应用]│├── Web 前端 ——> [BFF for Web] ——> [后端服务]│├── iOS App ——> [BFF for iOS] ——> [后端服务]│├── Android App ——> [BFF for Android] ——> [后端服务]│├── 小程序 ——> [BFF for 小程序] ——> [后端服务]
  • 每个前端应用都有专门的 BFF 层,BFF 层向后端请求数据,并根据前端需求优化数据结构,然后返回给前端。

4. BFF 的实际应用场景
  • 电商系统
    • PC 端需要展示完整商品列表,而移动端只需要部分简要信息,BFF 层可以针对不同终端返回不同的数据格式。
  • 社交应用
    • Web 端可能支持复杂的好友推荐算法,而移动端可能只需要快速获取好友列表,BFF 层可以根据终端优化 API 调用方式。
  • 企业级应用
    • 一个 SaaS 系统可能有 Web 端、移动端、管理员端等不同用户角色,每个角色需要的数据结构不同,BFF 层可以进行适配。

5. BFF 的技术选型

BFF 层通常使用轻量级的后端框架,以便快速开发、扩展和维护:

  • Node.js(Express, NestJS):适用于 JavaScript/TypeScript 技术栈的前端团队。
  • Python(Flask, FastAPI):适用于 Python 生态的团队,特别是数据处理密集型应用。
  • Go(Gin, Echo):适用于高并发、低延迟的应用。
  • Java(Spring Boot):适用于大型企业系统,与微服务结合紧密。

6. 总结

BFF 是一种后端架构模式,位于前端与后端服务之间,为不同前端提供定制化 API,以优化数据传输、减少 API 调用次数、提升前端开发效率,并降低后端改动对前端的影响。

适用于: ✅ 需要支持多个前端(Web、移动端、小程序等)。
✅ 需要优化前端 API,减少前端数据处理逻辑。
✅ 需要增强安全性,避免前端直接暴露后端 API。
✅ 需要降低后端变更对前端的影响。

在现代 Web 系统开发中,BFF 已成为前后端分离架构的重要组成部分。

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

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

相关文章

upload-labs靶场 1-21通关

目录 1.Pass-01 前端绕过 分析 解题 2.Pass-02 服务器端检测--修改IMME 分析 解题 3.Pass-03 黑名单绕过 分析 解题 4.Pass-04 .htaccess绕过 分析 解题 5.Pass-05 . .绕过和.user.ini绕过 分析 解题 6.Pass-06 大小写绕过 分析 解题 7.Pass-07 空格绕过 分…

信贷风控系统架构设计

设计一个信贷风控系统需要综合考虑业务需求、技术架构、数据治理、合规安全等多个维度。以下是从顶级Java架构师视角的系统设计方案,分模块详细说明: 一、系统架构设计原则 高可用性:7x24小时服务,多机房容灾。低延迟&#xff1a…

Ubuntu20.04 在离线机器上安装 NVIDIA Container Toolkit

步骤 1.下载4个安装包 Index of /nvidia-docker/libnvidia-container/stable/ nvidia-container-toolkit-base_1.13.5-1_amd64.deb libnvidia-container1_1.13.5-1_amd64.deb libnvidia-container-tools_1.13.5-1_amd64.deb nvidia-container-toolkit_1.13.5-1_amd64.deb 步…

【工具】COME对比映射学习用于scRNA-seq数据的空间重构

介绍 单细胞RNA测序(scRNA-seq)能够在单细胞分辨率下实现高通量转录组分析。固有的空间位置对于理解单细胞如何协调多细胞功能和驱动疾病至关重要。然而,在组织分离过程中,空间信息常常丢失。空间转录组学(ST&#xf…

Idea配置注释模板

一、配置类注释模板 打开IDEA,打开settings(快捷键:Ctrl Alt s),选择Editor,找到File and Code Templates 这里以设置class文件为例,点击Class,在右侧配置以下内容 #if (${PACKAGE_NAME} && $…

pytorch高可用的设计策略和集成放大各自功能

在使用 PyTorch 编写模型时,为确保模型具备高可用性,可从模型设计、代码质量、训练过程、部署等多个方面采取相应的方法,以下为你详细介绍: 模型设计层面 模块化设计 实现方式:将模型拆分成多个小的、独立的模块,每个模块负责特定的功能。例如,在一个图像分类模型中,可…

从开源大模型工具Ollama存在安全隐患思考企业级大模型应用如何严守安全红线

近日,国家网络安全通报中心通报大模型工具Ollama默认配置存在未授权访问与模型窃取等安全隐患,引发了广泛关注。Ollama作为一款开源的大模型管理工具,在为用户提供便捷的同时,却因缺乏有效的安全管控机制,存在数据泄露…

初识Qt · 信号与槽 · 基础知识

目录 前言: 信号和槽初识 两个问题 前言: 本文我们正式开始介绍信号与槽这个概念,在谈及Qt中的信号与槽这个概念之前,我们不妨回顾一下Linux中的信号,比如发生了除0错误,OS就会给该进程发送一个信号&am…

Kotlin 5种单例模式

在Kotlin中实现单例模式有多种方法,以下是几种常见的方法: 饿汉式 饿汉式是最简单的一种实现方式,在类加载时就完成了实例的初始化。 //饿汉式 object Singleton1 {fun printMessage() {println("饿汉式")} }懒汉式 懒汉式是延迟…

探秘基带算法:从原理到5G时代的通信变革【一】引言

文章目录 一、引言1.1 研究背景与意义1.2 研究目的与方法1.3 研究内容与创新点 本博客为系列博客,主要讲解各基带算法的原理与应用,包括:viterbi解码、Turbo编解码、Polar编解码、CORDIC算法、CRC校验、FFT/DFT、QAMtiaozhi/解调、QPSK调制/解…

C/C++输入输出(1)

1.getchar和putchar 1.1getchar() 函数原型: 1 int getchar(void); getchar()函数返回用户从键盘输入的字符,使用时不带有任何参数。 程序运行到这个命令就会暂停,等待用户从键盘输入,等同于使用cin或scanf()方法读取一个字符…

【消息队列】数据库的数据管理

1. 数据库的选择 对于当前实现消息队列这样的一个中间件来说,具体要使用哪个数据库,是需要稍作考虑的,如果直接使用 MySQL 数据库也是能实现正常的功能,但是 MySQL 也是一个客户端服务器程序,也就意味着如果想在其他服…

飞机大战lua迷你世界脚本

-- 迷你世界飞机大战 v1.2 -- 星空露珠工作室制作 -- 最后更新:2024年1月 ----------------------------- -- 迷你世界API适配配置 ----------------------------- local UI { BASE_ID 7477478487091949474-22856, -- UI界面ID ELEMENTS { BG 1, -- 背景 BTN_LE…

图解MOE大模型的7个核心问题并探讨DeepSeekMoE的专家机制创新

原文地址:https://newsletter.maartengrootendorst.com/p/a-visual-guide-to-mixture-of-experts #mermaid-svg-FU7YUSIfuXO6EVHa {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-FU7YUSIfuXO6EVHa .error-icon{fill…

【智能机器人开发全流程:硬件选型、软件架构与ROS实战,打造高效机器人系统】

文章目录 1. 硬件层设计(1) 传感器选型(2) 计算平台 2. 软件架构设计(1) 核心模块划分(2) 通信框架 3. 关键实现步骤(1) 硬件-软件接口开发(2) SLAM与导航实现(3) 仿真与测试 4. 典型框架示例基于ROS的移动机器人分层架构 5. 优化与扩展6. 开源项目参考 1. 硬件层设计 (1) 传感…

React Native v0.78 更新

这个版本在 React Native 中引入了 React 19,并带来了一些重要的新功能,例如 Android 矢量图(Vector Drawables)的原生支持 以及 iOS 更好的 Brownfield 集成。 亮点 React 19 集成更小更快的发布节奏可选择在 Metro 中启用 Jav…

机器学习数学通关指南

✨ 写在前面 💡 在代码的世界里沉浸了十余载,我一直自诩逻辑思维敏捷,编程能力不俗。然而,当我初次接触 DeepSeek-R1 并领略其清晰、系统的思考过程时,我不禁为之震撼。那一刻,我深刻意识到:在A…

MySQL 实验1:Windows 环境下 MySQL5.5 安装与配置

MySQL 实验1:Windows 环境下 MySQL5.5 安装与配置 目录 MySQL 实验1:Windows 环境下 MySQL5.5 安装与配置 一、MySQL 软件的下载二、安装 MySQL三、配置 MySQL 1、配置环境变量2、安装并启动 MySQL 服务3、设置 MySQL 字符集4、为 root 用户设置登录密…

烟花燃放安全管控:智能分析网关V4烟火检测技术保障安全

一、方案背景 在中国诸多传统节日的缤纷画卷中,烟花盛放、烧纸祭祀承载着人们的深厚情感。一方面,烟花璀璨,是对节日欢庆氛围的热烈烘托,寄托着大家对美好生活的向往与期许;另一方面,袅袅青烟、点点烛光&a…

Elasticsearch:解锁深度匹配,运用Elasticsearch DSL构建闪电般的高效模糊搜索体验

目录 Elasticsearch查询分类 叶子查询 全文检索查询 match查询 multi_match查询 精确查询 term查询 range查询 复杂查询 bool查询简单应用 bool查询实现排序和分页 bool查询实现高亮 场景分析 问题思考 解决方案 search_after方案(推荐) point in time方案 方案…