写点什么

BFF 模式:微服务前端数据加载的最佳实践?

  • 2021-03-31
  • 本文字数:2530 字

    阅读完需:约 8 分钟

BFF模式:微服务前端数据加载的最佳实践?

设想一个场景,你需要使用微服务构建电子商务应用程序。你可以为客户、订单、产品、购物车等提供微服务,微服务暴露 API 给前端使用。


但是,微服务提供给前端的数据可能不会按照前端需要的方式进行编排或过滤。


这种情况下,前端需要一些逻辑来重新处理这些数据,同时在用户端使用这样的逻辑会占用更多的浏览器资源。


在这样的情况下,我们可以使用 BFF 将一些前端逻辑转移到中间层,中间层就是 BFF。当前端请求一些数据时,它将调用 BFF 中的 API。


BFF 将执行以下操作:


  • 调用相关的微服务 API 并获取所需数据

  • 根据前端展现来处理数据

  • 将格式化后的数据发送到前端


因此,前端将有更少的逻辑,BFF 有助于简化数据展示,并为前端提供一个目的明确的接口。

它如何适用于电子商务?


下图显示了每个微服务如何通过 BFF 与前端连接。


BFF 的角色


正如我们已经探讨过的,BFF 充当前端和微服务之间的简单接口。理想情况下,前端团队也将负责管理 BFF。


一个 BFF 只关注一个 UI,而且只关注那个 UI。因此,它将帮助我们保持前端的简单性,并通过后端输出的统一的数据格式。


这就引出了下一个问题。我们能为多个用户界面提供多个 BFF 吗?我们将在后面回答这个问题。

这会增加延迟吗?


现在我们知道 BFF 类似于客户端和其他外部 API、服务等之间的代理服务器。如果请求必须通过另一个组件,它肯定会增加延迟。但是,如果浏览器需要处理多个未针对前端优化的服务,那么与浏览器的高资源使用率相比,BFF 延迟可以忽略不计。


构建 BFF 允许你智能地对其他后端 / 微服务进行批处理调用,并一次返回所有数据,或者通过转换和格式化数据来返回更方便的展现形式。


这对于 2G 或 3G 网络上的移动客户端非常有用,因为在这些网络上建立连接可能需要几秒钟(或更长时间)。

应用程序何时使用 BFF


与许多其他模式一样,在应用程序中使用 BFF 取决于你计划遵循的上下文和体系结构。如果你的应用程序是一个简单的单片应用程序(译者注:monolithic app,单片软件指非模块化的软件,也是一种设计思想。它将 UI、数据、逻辑等全部做成一整块,以一个完全整体的方式实现,通常会直接从开始到结束完成一个复杂任务的每一小步,同时由自己独立对所有的数据进行管理),那么 BFF 是不必要的,它几乎毫无价值。


但是,如果你的应用程序依赖于微服务,并且使用许多外部 API 和其他服务,那么最好使用 BFF 来简化数据流,并为你的应用程序带来更高的效率。


此外,如果你的应用程序需要为特定的前端接口开发优化的后端,或者你的客户端需要使用在后端进行大量聚合的数据,那么 BFF 是一个合适的选项。


提示:分布式设计需要不同种类的代码协作工具。使用 Bit(Github)在单个组件上进行协作,这些组件可以跨代码仓库共享并独立开发。


保持你的代码仓库可扩展性、可维护性和始终同步。


了解更多信息:


  • 如何构建微前端:

https://blog.bitsrc.io/how-we-build-micro-front-ends-d3eeeac0acfc?fileGuid=S9EhcQ4jbascxSJk

  • 如何利用 Bit 在微服务间共享和重用代码;

https://blog.bitsrc.io/how-we-successfully-share-and-reuse-code-between-microservices-at-scale-20fcfaebc6d0?fileGuid=S9EhcQ4jbascxSJk

我们能有多个 BFF 吗?


当然可以!这就是 BFF 的意义所在。


没有 BFF 的传统应用程序对于各种客户端只有一个 API 网关,如下所示,



来源:https://perspectives.mobilelive.ca/


然而,拥有 BFF 的目的是为客户端提供一个可连接的集中接口。例如,移动 UI 的数据消耗可能不同于浏览器的数据消耗。在这种情况下,为了更好地展示数据,可以使用两个 BFF。多个 BFF 的应用程序如下图所示,



来源:https://perspectives.mobilelive.ca/


如你所见,每种客户端都有一个 BFF,它将有助于优化服务(Sa、Sb…Sn)的响应。

BFF 的优点


拥有 BFF 的几个优点,


  • 关注点分离——前端需求将与后端关注点分离,便于维护。

  • 更容易维护和修改 API——客户端应用程序对 API 结构了解较少,这将使其对 API 中的更改更有弹性。

  • 更好的前端错误处理——大部分时间,服务器错误对前端用户是没有意义的。BFF 可以映射出需要显示给用户的错误,而不是直接返回服务器错误,这将改善用户体验。

  • 多种设备类型可以并行调用后端——当浏览器向 BFF 发出请求时,移动设备也可以这样做。这将有助于更快地获得相应服务的响应。

  • 更好的安全性——某些敏感信息可以被隐藏,并且在向前端返回响应时可以忽略不必要的数据。这种抽象将使攻击者更难以应用程序为目标。

  • 共享组件的团队所有权——应用程序的不同部分可以由不同的团队轻松处理。前端团队可以共享客户端应用程序及其底层资源消耗层的所有权,从而提高开发速度。下图显示了团队划分 BFF 的例子。



来源:https://samnewman.io/patterns/architectural/bff/

在实践中遵循的最佳实践


到目前为止,我们所看到的一切都是惊人的!但是,BFF 是否可以防故障?


答案是否定的!和其他技术或模式一样,即使是 BFF 也有陷阱。为了避免这些,我们必须遵循一些最佳实践。下面列出了一些要遵循的最佳做法。


  • 避免使用自包含的大而全的 API 实现 BFF——你的自包含 API 应该位于微服务层。大多数开发人员忘记了这一点,也开始在 BFF 中实现服务级别 API。你应该记住,BFF 是客户端和服务之间的转换层。当数据从服务端 API 返回时,其目的是将其转换为客户端应用程序指定的数据类型。

  • 避免 BFF 逻辑重复——需要注意的一个关键点是,单个 BFF 应该满足特定的用户体验,而不是设备类型。例如,大多数时候,所有移动设备(iOS、Android 等)共享相同的用户体验。在这种情况下,所有这些操作系统的一个 BFF 就足够了。iOS 不需要单独的 BFF,Android 也不需要单独的 BFF。

  • 避免过度依赖 BFF——BFF 只是一个转换层。是的,它也为应用程序提供了一定程度的安全性。但是,你不应该过分依赖它。你的 API 层和前端层应该负责所有的功能和安全方面,而不管是否存在 BFF。因为 BFF 只是填补一个空白,而不是向应用程序添加任何功能或服务。

总结


BFF 模式不仅有助于开发,而且有助于极大地改善用户体验。因此,在保持 BFF 专注于其前端的同时,考虑数据优化和聚合是非常重要的。


此外,如果你以前没有使用过 BFF 模式,现在是时候开始了。


延伸阅读


https://blog.bitsrc.io/bff-pattern-backend-for-frontend-an-introduction-e4fa965128bf


2021-03-31 14:2612685

评论

发布
暂无评论
发现更多内容

Docker部署PhotoPrism、Immich图片管理应用,无需公网IP远程访问教程

贝锐

NAS Docker 镜像

SaaS架构:多租户系统架构设计

快乐非自愿限量之名

架构 SaaS

薇美姿舒客B2B订货平台:抢占末端渠道先机,实现持续增长

赛博威科技

视频下载工具Downie 4 for Mac

Mac相关知识分享

视频下载软件

视觉特效软件包FxFactory 8 Pro for Mac

Mac相关知识分享

数据结构 - 链表

EquatorCoco

数据结构 链表

API在电商之中的作用是什么?

秃头小帅oi

专业矢量图形设计工具Sketch for mac

Mac相关知识分享

以生态共建推动产业发展,深开鸿亮相2024开放原子开源生态大会

Geek_2d6073

低代码开发平台开启智能制造新工具时代

不在线第一只蜗牛

低代码 制造业

公司党委书记、董事长、总经理胡志强出席“国企改革大家谈”分享天翼云改革经验

天翼云开发者社区

云计算 天翼云

JavaScript 异步编程入门

FunTester

云服务器的公网IP是公用的吗?

Ogcloud

云主机 云服务器 云主机厂商 云服务器租用

3DCAT实时云渲染赋能2024广东旅博会智慧文旅元宇宙体验馆上线!

3DCAT实时渲染

实时云渲染 元宇宙解决方案 智慧文旅元宇宙 元宇宙体验馆

草料二维码产品更新速览!优化二维码标签下载弹窗、企业专属独立登录页等

草料二维码

无代码平台 草料二维码 草料二维码无代码

Spring Boot集成Spring Security之自动装配

快乐非自愿限量之名

spring Spring Boot

3分钟理清QPS、TPS、RT 以及它们之间的关系

高端章鱼哥

鸿蒙开发案例:通过三杯猜球学习显示动画

zhongcx

天翼云完成首个国产化万卡训练,MFU达到国内领先水平!

天翼云开发者社区

云计算 云服务 云平台 天翼云

Docker-Compose 应用可观测性最佳实践

观测云

Docker-compose

AIGCDesign 开放式跨端 AI 组件解决方案

京东零售技术

前端 AIGC

与南方航空牵手合作,望繁信科技朋友圈再扩大!

望繁信科技

数字化转型 流程挖掘 流程资产 流程智能 望繁信科技

引领行业数字变革,天翼云出席IDC年度盛典暨颁奖典礼!

天翼云开发者社区

云计算 IDC

新特性速览! Sermant 2.1.0版本重磅发布

华为云开源

开源 字节码 微服务治理 sermant

视频转 GIF 工具Video GIF converter for Mac

Mac相关知识分享

干货:TikTok限流、0播放问题怎么解决?

Ogcloud

TikTok tiktok运营 TikTok养号 tiktok矩阵 tiktok限流

一张图带你了解.NET终结(Finalize)流程

不在线第一只蜗牛

.net

乘风破浪!天翼云为出海企业打造全球云服务解决方案!

天翼云开发者社区

云计算 IDC

远程桌面连接工具Microsoft Remote Desktop for Mac

Mac相关知识分享

小说

我们用GLM-4-Plus搞了个“阅读智能体”,工作效率提升了300%

Alter

带参数的Python装饰器让你的代码更优雅

LLLibra146

Python 装饰器

BFF模式:微服务前端数据加载的最佳实践?_大前端_Viduni Wickramarachchi_InfoQ精选文章