BFF(Backend For Frontend)这个模式出来很多年了,业界也有很多不错的实践。本文旨在对什么是 BFF,以及在什么情况下适合使用 BFF 做一些说明。

BFF 的诞生背景

在互联网的发展过程中,Web 应用的功能变得越来越丰富。极端情况下,有一些页面甚至需要调用几十个接口来完成数据的获取。随着移动互联网的发展,移动 APP、H5 页面大大拓宽了前端的工作领域,同时也带来了多样的页面数据获取需求。

在传统的开发模式中,后端服务直接为前端页面提供 API 接口。换句话说,后端的接口设计受页面的影响非常大。在互联网场景下,前端页面的变化是非常快的,也就意味着后端的接口也要跟着变。那么,势必会影响到后端的领域能力沉淀。同时,由于不同的 UI 端对数据的需求不尽相同,后端往往需要针对不同的端提供定制化的接口,这加剧了这个问题的影响。

那么,如何才能有效解决这个问题呢?

如何建设 BFF?

BFF 全称是 Backend For Frontend。这里面有两个关键词,一个是 BFF 的服务对象,即 BFF 是为前端数据服务的。一个是 BFF 的本身存在形式,BFF 是一个后端服务,负责对后端领域数据接口进行聚合、裁剪以及编排。

在回答如何建设 BFF 这个问题之前,我们需要先明确一个问题,就是由谁来构建 BFF?

现在各大互联网公司都有关于 BFF 的实践,有的是前端团队负责 BFF,有的是后端团队负责 BFF。

我们不妨可以对比下前端和后端团队来构建 BFF 的优缺点。

谁来构建优势劣势
前端能对页面的定制化需求做出快速反应,几乎没有沟通成本需要具备后端开发能力,对人的要求更高;同时需要前端深入理解业务模型
后端对业务模型理解更加透彻;服务管理的工具更丰富沟通成本高

这两种实践没有孰优孰劣,无非是哪种方式更适合各自技术团队的技术能力构成和组织架构罢了。

我所在的团队中,前端团队有一定的服务端开发能力,同时前端更接近于用户,对数据的定制化需求更加迫切,因此,我们采用的是由前端团队来负责建设 BFF。

如何划分 BFF?

单一服务的 BFF 只适合于业务初始阶段,当业务逐步发展,BFF 对接的业务模型越来越多,对接的前端展现形式也越来越多,我们就需要思考 BFF 如何划分了。

这里有两个问题需要解决,一个是如何处理各端差异的问题,一个是如何管理业务模型的问题。

如何处理各端差异

我们前面就说到,BFF 诞生的一个出发点就是要解决因为端的差异导致对数据需求的不同的问题。

为了能快速响应各端的数据需求,同时减少各端之间的相互影响,我们需要针对各端单独起 BFF 服务。

uml diagram
如何管理业务模型

后端的业务模型都是领域相关的,比如用户模型、订单模型、商品模型,这些模型不会在同一个服务内,而是分别在用户领域、订单领域、商品领域的服务里面。

通常情况下,我们有两种方式来建立 BFF 的领域能力。一种是在 BFF 中通过目录、模块的形式进行规范管理,BFF 以单体服务的形式存在。一种是将领域能力独立成服务,对后端领域能力进行领域内的数据聚合。面向各个端的 BFF 服务再将各个领域的 BFF 服务数据进行二次聚合。

前一种方式的架构图与上面一样,后一种的架构图如下。

uml diagram

将领域 BFF 服务单独拆分出来,需要面向端的 BFF 将数据做二次聚合。这增加了额外的复杂性。同时,如果后端领域服务拆分的很细的话,BFF 服务的颗粒度划分也需要做一些深入的思考。这个我们会在后面的文章中详细分析。

构建 BFF 的基本原则是什么?

BFF 作为一个沟通前后端的中间层服务,势必在建设过程中遇到很多难以确定边界的事情。比如一个功能到底是放在 BFF 做还是放在后端服务来做,有时候这样的问题最终得依赖经验丰富的开发同学来解决。

那么,我们在构建 BFF 的时候,需要确定一些基本原则,来尽量减少这类问题的发生。

  • BFF 要聚焦在对数据的聚合、裁剪和编排上

BFF 作为一个服务,理论上什么功能都可以做。但是我们要明确构建 BFF 的目的,就是为了解决前端页面差异化的展示需求。因此,BFF 应该聚焦在对数据的聚合、裁剪,以及在必要情况对后端接口进行一定的编排的能力。其他的问题,虽然 BFF 也可以轻松解决,但是还是要交给后端服务来实现。

  • 所有的 UI 都应该与 BFF 对接

有了 BFF 以后,我们应该将所有针对 UI 的数据支持都收口到 BFF 上来。换句话说就是所有 UI 的数据都应该从 BFF 中获取,尽量避免即从后端服务直接获取数据,又从 BFF 获取数据的情况。

BFF 带来了哪些挑战?

对于前端开发人员来说,BFF 带来了一个全新的技术环境。需要开发人员快速学习并掌握服务端开发的基本技能,包括但不限于基础的服务端开发能力、基础的运维能力等。

同时,前端同学要完成思维方式的转变,BFF 虽然为前端页面的数据服务,但是其本身是一个后端服务,作为 API 的消费者的同时,也是 API 的生产者,所有后端服务可能遇到的问题,BFF 都可能遇到。比如对外提供的 API 如何保证兼容性等。

除了硬性的技能要求以外,BFF 带给前端开发人员最大的挑战是需要开发人员更加细致的了解业务。需要从具体业务、乃至整个产品的角度来思考,这对习惯于聚焦页面展现效果的前端开发人员来说,也是一个极大的工作思路的转变。

参考文献

关注微信公众号,获取最新推送~

加微信,深入交流~