BFF架构笔记

了解BFF架构

微服务架构:BFF和网关是符合演化出来的?

  1. 在微服务架构中,BFF(Backend for Frontend)也称聚合层或者适配层,它主要承接一个适配角色:将内部复杂的微服务,适配成对各种不同用户体验(无线/Web/H5/第三方等)友好和统一的API。聚合裁剪适配是BFF的主要职责
  2. 在微服务架构中,网关专注解决跨横切面逻辑,包括路由、安全、监控和限流熔断等。网关一方面是拆分解耦的利器,同时让开发人员可以专注业务逻辑的实现,达成架构上的关注分离。
  3. 端用户体验层->网关层->BFF层->微服务层,是现代微服务架构的典型分层方式,这个架构能够灵活应对业务需求的变化,是一种支持创新的演化式架构。

BFF全称是Backends For Frontends(服务于前端的后端),Sam Newman曾在他的博客中写了一篇相关的文章——Pattern: Backends For Frontends,在文章中Sam Newman详细地说明了BFF。本文参考了几篇不同博客和文章,简单阐述一下自己对BFF的认识。

简而言之,BFF就是服务器设计API时会考虑到不同设备的需求,也就是为不同的设备提供不同的API接口,虽然它们可能是实现相同的功能,但因为不同设备的特殊性,它们对服务端的API访问也各有其特点,需要区别处理。

客户端都不是直接访问服务器的公共接口,而是调用BFF层提供的接口,BFF层再调用基层的公共服务,不同的客户端拥有不同的BFF层,它们定制客户端需要的API。是否需要为相似的设备人,如IOS和android分别提供一个BFF,这个需要根据现实情况决定,不同的项目环境解决手段不一样。

 

那么采用BFF架构与多端公用、单一的API有什么优点了?最重要的一点在上文中已经提到了,它能够满足因不同客户端特殊的交互引起的对新接口的要求,所以一开始就会针对相应的设备设计好对应的接口。如果使用单一、通用的API,我们一开始并没有考虑到特殊需求,那么有新的请求需要出现时,可能会出现以下问题:

1. 添加新的接口,容易造成接口的不稳定性;

2. 在原来的接口上改,容易造成耦合,破坏单一职责。

 

考虑这样一个简单例子,因为移动APP的屏幕限制,在某一个列表页我们只需要展示一些关键的信息,但是由于调用的是服务端提供统一的API,服务端在设计的时候只考虑到了web端,返回所有的字段信息,但这些对于移动端而言都是无用的。在优化性能时处理这样的问题时,服务器端就需要新增接口或者通过引入相关耦合来解决这样的问题。而使用BFF在很大程度能避免这样的问题。  
使用BFF的另一个优点就是当由于某一客户端需要调用调用多个不同的服务端接口来实现某一功能时,可以直接在对应的BFF层编写相应的API,而不会影响到基层的公共服务,且客户端不用直接向多个后台发起调用,可以优化性能。


当然,凡事有利有弊,BFF带来便利好处的同时也会引起一些问题,如代码重复,加大开发工作量等。所以在使用时需要结合现实情况仔细斟酌,符合项目的应用开发背景。例如蚂蚁财富使用BFF的场景如下。(没有具体分析,有兴趣的可以通过上面提供的链接和查阅相关资料进行研究)

 

使用 BFF 的正确姿势

  • 多端应用
    我们在设计 API 时会考虑到不同设备的需求,也就是为不同的设备提供不同的 API,虽然它们可能是实现相同的功能,但因为不同设备的特殊性,它们对服务端的 API 访问也各有其特点,需要区别处理。

  • 服务聚合
    随着微服务的兴起,原本在同一个进程内运行的业务流程被拆分到了不同的服务中。这在增加业务灵活性的同时,也让前端的调用变得更复杂。BFF 的出现为前端应用提供了一个对业务服务调用的聚合点,它屏蔽了复杂的服务调用链,让前端可以聚焦在所需要的数据上,而不用关注底层提供这些数据的服务。

  • 非必要,莫新增
    我们在看到 BFF 带来的各种好处的同时,也要注意到它所带来的代码重复和工作量增加方面的问题。如果与已有 BFF 功能类似,且展现数据的要求也相近的话,一定要谨慎对待新增 BFF 的行为。因此,建议非必要,莫新增

实战中的玩法

  • 访问控制
    例如,服务中的权限控制,将所有服务中的权限控制集中在 BFF 层,使下层服务更加纯粹和独立。

  • 应用缓存
    项目中时常存在一些需要缓存的临时数据,此时 BFF 作为业务的汇聚点,距离用户请求最近,遂将该缓存操作放在 BFF 层。

  • 第三方入口
    在业务中需要与第三交互时,将该交互放在 BFF 层,这样可以只暴露必要信息给第三方,从而便于控制第三方的访问。

将以下内容写成优快云的Markdown格式笔记:--- ![image.png](https://tc-cdn.flowus.cn/oss/d8dbb947-c4ec-401a-ad8c-f966c0e0a210/image.png?time=1742033700&token=170c1f4d4c4abf73067ed4ceb7da99e81600c23783cf882c4853aab6032f6943&role=free) # 1.基础知识 ## 四个区域 - 工作区(Working Directory):你在电脑里能实际看到的目录。 - 暂存区(Stage/Index):用来临时存放未提交的内容,一般在.git目录下的index中。 - 本地仓库(Repository):Git 在本地的版本库,仓库信息存储在.git这个隐藏目录中。 - 远程仓库(Remote Repository):托管在远程服务器上的仓库。常见有GitHub,GitLab,Gitee。 ## 文件状态 - 已修改(Modified):修改了但是没有保存到暂存区的文件。 - 已暂存(Staged):修改后已经保存到暂存区的文件。 - 已提交(Committed):把暂存区的文件提交到本地仓库后的状态。 ![image.png](https://tc-cdn.flowus.cn/oss/665035d9-e2b6-43ab-b8d1-25bcd2bd8f6a/image.png?time=1742033700&token=3f71866dc50f10846de691c4c4b6f143cd8b1eefd2e36099449db8867ec2c981&role=free) ![image.png](https://tc-cdn.flowus.cn/oss/1b24ba52-2c85-4f57-ba7f-91701f7b5d57/image.png?time=1742033700&token=9637c82180cecae61fcb2f1b597b4c597f8847c2e3a0bdcce4f8ff8de2fb929c&role=free) ## 基本概念 - main/master: 默认主分支 - origin: 默认远程仓库 - HEAD: 指向当前分支的指针 - HEAD^: 上一个版本 - HEAD~: 上四个版本 ## 特殊文件 - .git: Git仓库的元数据和对象数据库 - .gitignore: 忽略文件,不需要提交到仓库的文件 - .gitattributes: 指向当前分支的指针 - .gitkeep: 使空目录被提交到仓库 - .gitmodules: 记录子模块的信息 - .gitconfig: 记录仓库的配置信息 ## GitFlow - 主分支(master/main):代表项目的稳定版本。 - 开发分支(develop):用于日常开发。 - 功能分支(feature):用于开发单独的功能或特性。 - 发布分支(release):用于准备项目发布。 - 热修复分支(hotfix):用于修复主分支上的紧急问题。 ![image.png](https://tc-cdn.flowus.cn/oss/ac4e7213-49b5-4385-9baf-b42d71c01c09/image.png?time=1742033700&token=beeb5ca87548a76951e33beb1cfed599af5a0a06b9bff9d7f3055989f28a9524&role=free) # 2.CMD ## 初始化设置 - 配置用户名:`git config --global user.name "Your Name"` - 配置邮箱:`git config --global user.email "[mail@example.com](mailto:mail@example.com)"` - 存储配置:`git config --global credential.helper store` ## 创建仓库 - 新建本地仓库:`git init <project-name>` - (省略`project-name`则在当前目录创建) - 克隆远程仓库:`git clone <url>` ## 添加与提交 - 添加文件到暂存区:`git add <file>` - (`git add .` 表示添加所有文件到暂存区) - 提交所有暂存区的文件到本地仓库:`git commit -m "message"` - 提交所有已修改的
03-16
<think>好的,用户想用优快云 Markdown格式整理Git相关的笔记,包括基础知识、特殊文件、GitFlow和常用命令。首先,我需要回忆优快云 Markdown支持的语法,比如代码块、标题、列表、链接等。然后,用户提到的四个区域(工作区、暂存区、本地仓库、远程仓库)和文件状态(未跟踪、已修改、已暂存等)需要结构清晰地呈现,可能需要用列表和表格。 接下来,特殊文件如.gitignore和.gitattributes,这部分需要说明它们的用途和示例,代码块会比较合适。GitFlow工作流部分,可能需要用标题分级和步骤列表,以及可能的示意图,不过优快云 Markdown不支持直接上传图片,但可以引用外部图片链接,不过用户可能没有图床,所以暂时用文字描述或者建议使用流程图语法? CMD常用命令这里可能指的是Git命令,比如git init, commit, push等,需要整理常用命令和示例,用代码块展示。同时要注意引用用户提供的三个参考链接,虽然内容似乎和Git关系不大,但可能需要找合适的地方插入引用,比如在导入文件或插入图像时引用[^1][^3],架构设计可能和GitFlow有关联,引用[^2]。 需要检查是否所有数学公式都正确使用了$...$和$$...$$,但Git内容可能涉及较少数学公式,不过如果有示例中的代码或命令行,需确保语法正确。最后,生成相关问题,可能涉及Git的高级用法、冲突解决、优化技巧等。 可能需要注意用户提到的“四个区域”和“文件状态”是否正确,以及GitFlow的正确步骤。另外,优快云 Markdown是否支持某些特殊语法,比如表格、流程图等,需要确认。如果用户需要插入图像,可能需要使用外部链接,如引用[^3]中的例子。最后,确保回答结构清晰,分点明确,符合用户的要求。</think># Git知识体系全解析(优快云 Markdown版) ## 一、Git核心概念 ### 1. 四个工作区域 - **工作区(Working Directory)** 本地可见的目录结构,直接编辑文件的位置 - **暂存区(Staging Area)** 通过`git add`将修改存入的临时存储区域 - **本地仓库(Local Repository)** 通过`git commit`永久记录代码版本的位置 - **远程仓库(Remote Repository)** 云端代码托管平台(如GitHub/Gitee)的存储空间[^2] ### 2. 文件生命周期 | 状态 | 描述 | 转换命令 | |-------------------|--------------------------------|-------------------| | Untracked | 新文件未被Git管理 | `git add` | | Modified | 已修改但未暂存 | `git add` | | Staged | 已暂存等待提交 | `git commit` | | Unmodified | 已提交未修改 | 修改文件后变为Modified | ## 二、Git特殊文件配置 ### 1. .gitignore ```gitignore # 忽略所有.class文件 *.class # 不忽略lib目录下的.jar文件 !lib/*.jar # 忽略build目录 build/ ``` ### 2. .gitattributes ```gitattributes *.js diff=javascript *.jpg binary ``` ## 三、GitFlow工作流 ```mermaid graph TD A[主分支master] --> B[发布分支release] A --> C[开发分支develop] C --> D[功能分支feature] C --> E[热修复分支hotfix] ``` ## 四、常用命令速查 ### 基础操作 ```bash # 初始化仓库 git init # 克隆远程仓库 git clone https://gitee.com/example.git ``` ### 版本控制 ```bash # 提交到本地仓库 git commit -m "更新日志" # 查看提交历史 git log --graph --oneline ``` ### 分支管理 ```bash # 创建新分支 git checkout -b new-feature # 合并分支(快速前进模式) git merge --ff-only develop ``` : 文件导入方法参考优快云文档导入功能说明 : 分支策略参考现代软件架构设计原则 : 流程图使用mermaid语法实现 §§ 相关问题 §§ 1. 如何解决Git合并冲突? 2. Git rebase和merge有什么区别? 3. 如何配置Git SSH密钥认证? 4. Git如何实现版本回退? 5. Git子模块(submodule)如何使用?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值