原文链接:传送门。
想象下这个场景:你需要使用微服务架构来构建一个电子商务应用。你会有一些微服务来服务于顾客,订单,产品,购物车,等等。这些微服务暴露被前端系统消费的各种API。
然而,微服务返回给前端的数据并不会根据前端系统要呈现数据的精确方式进行格式化或者过滤。在这种情况下,前端系统本身需要一些逻辑来再次格式化这些数据。而在前端系统具有这些逻辑会占用更多的浏览器资源。
在像这样的情况下,我们可以使用BFF来将这些前端逻辑移动到一个中间层。这个中间层就是BFF。这样,当前端系统请求一些数据时,它其实会调用BFF中的API。
如上所描述的,BFF会做以下事情:
这样的话,前端页面都会具有尽可能少的逻辑。因此BFF可以帮助将数据流水线化的进行展示,并承担了为前端提供了有侧重的API的职责。
另一个可以简化你的前后台关系的重要方式是通过在它们之间共享类型来实现。具体可以参考这里。
下图展示了微服务如何通过BFF与前端系统进行交互。
如同我们已经叙述的,BFF在微服务和前端系统之间扮演了一个简单接口的角色。理想情况下,前端项目组也会负责管理BFF。
一个单独的BFF侧重于一个UI,并仅仅只是那个UI。因此,其会帮助我们保持前端系统的简洁并通过后台看到一个统一的数据视图。
这带来了另一个问题,我们可以为多个UI构建多个BFF么?我们将在此文的后续章节回答这个问题,请继续阅读。
现在我们知道BFF类似于一个在客户端和其他外部API,服务之间的一个代理服务器。如果请求必须经过另一个组件,其必定会增加延迟。然而,如果我们需要与多个未曾为前端进行优化的服务一起工作时,相比于浏览器的高资源使用来说,这些延迟是微不足道的。
构建一个BFF允许你很聪明的对其他后台服务/API进行批量调用并一次性的返回数据,或者通过转化或者格式化数据来返回一个更方便的展示形式。
这个对于在2G/3G的移动客户端来说是很有用的,因为在这种情况下会需要好几秒(甚至更久)来建立连接。
像很多其他模式一样,在你的应用中是否使用BFF取决于你打算要遵循的上下文和架构。举个例子,如果你的应用是一个简单的单体应用,那么BFF是没有必要的,它不会为应用增加价值。然而,如果你的应用依赖于微服务,并且消费了很多其他的外部API及服务,我们最好可以用BFF来流水线化数据流并提升我们应用的效率。
进一步的,如果你应用需要为一个特定的前端开发一个优化后的后台或者你的客户端消费的数据需要大量的聚合计算,那么,BF是一个合适的选项。
当然了,这正是具有一个BFF的完整点。
传统的实践(没有BFF的应用)针对于所有的客户仅仅只有一个API网关。
然而,使用BFF的目的是为你的客户端提供一个有侧重的接口来与之连接。举个例子,移动UI的数据消费可能会与浏览器的数据消费有所不同。在这种情况下,为了更好的数据展示,我们可以使用两个BFF。让我们来看看使用多个BFF的应用架构图。
如你所见的,每一个客户端都会有一个BFF,他们会帮助优化来自于服务的都响应。
使用BFF的几个优势列举如下:
到现在为止我们所看到的一切很让我惊奇,然而,BFF可以减少错误么?
答案是否定的。像任何一个其他的技术或者模式一样,即使是BFF也有陷阱,为了避免这些,我们需要遵从最佳实践。
BFF不仅仅帮助开发,也能显著的提升用户体验。因此,当保证BFF侧重于其前端的同时,考虑数据优化和聚合是很关键的。
除此之外,如果你之前还没有用过BFF模式,现在是开始的时候了。之后,让我也知道你的体验和意见。