内部 BFF(Backend for Frontend)

内部 BFF(Backend for Frontend)是一种架构模式,指为每一个特定的前端用户界面(如移动App、Web页面)单独构建和定制的后端服务

它的核心思想是"为前端而生",是微服务架构演进过程中,为了解决前后端协作效率问题而诞生的一个中间层。

核心原则:各司其职,按需定制

你可以把 BFF 想象成一个"专属 concierge(礼宾服务)"。它不像一个通用的"总服务台"那样试图满足所有人的需求,而是为特定类型的"客户"(前端)提供量身定制的服务。

  • 专属服务:如果应用有 Web 端和移动端,那就分别为它们创建一个 BFF。移动端 BFF 只关心如何为手机App提供最精简、快速的数据;Web端 BFF 则负责提供更丰富、详尽的数据。
  • 自主权 :BFF 通常由前端团队独立管理和维护。这使得前端团队可以自主选择技术栈、控制发布节奏,无需等待后端团队,极大地提升了开发效率。
  • 单一职责:一个 BFF 只为"一个"前端用户界面服务,确保它能够深刻理解该前端的特定需求。

它是如何工作的?

BFF 在架构中扮演着"聚合层 "或"适配层"的角色。它位于前端应用和后端微服务之间,主要做三件事:

  1. 聚合数据:BFF 会调用后端的多个微服务,将分散的数据"聚合"起来。例如,一个商品详情页可能需要调用商品信息、用户评价、库存状态等多个服务,BFF 可以一次性完成所有这些调用。
  2. 裁剪与适配:BFF 会对聚合来的数据进行"裁剪"和"整形",只把前端真正需要的数据按它想要的格式返回。移动端不需要的数据(如长篇的HTML描述)可以在BFF层被过滤掉,以节省带宽和提升性能。
  3. 处理边缘关注点:BFF 还可以统一处理一些切面性的功能,如身份认证、限流等。

BFF 模式的优势

  • 提升前端开发效率:前端开发者可以专注于UI/UX,而无需关心后端复杂的微服务调用和数据组装逻辑。
  • 优化用户体验:可以为不同设备(Web、移动、IoT)提供量身定制的API,优化数据传输量和响应速度。
  • 解耦前后端:后端微服务可以保持稳定和纯粹,专注于核心业务领域,不用为了适配各种前端而频繁变更。
  • 团队自治:前端团队拥有BFF的所有权,可以独立迭代,减少了跨团队协调的成本。

关键考量:BFF vs. API Gateway

BFF 和 API Gateway(网关)容易被混淆,但它们的关注点不同。

特性 BFF (Backend for Frontend) API Gateway (API网关)
核心职责 为特定的前端提供定制化的数据和体验。 作为所有API请求的统一入口 ,提供路由、安全、限流、监控等跨切面功能。
服务对象 一个特定的前端客户端(如一个移动App)。 所有后端服务,作为系统的边界。
包含逻辑 包含特定于客户端的聚合和适配逻辑 通常不包含业务逻辑,侧重于基础设施和管控功能。

在实际架构中,两者常常共存:API Gateway 处理通用的安全、路由和限流,然后将请求转发给对应的 BFF 服务,由 BFF 完成数据聚合和适配。

潜在的挑战

  • 代码重复:不同端(如Web和移动)的BFF可能存在相似的逻辑,导致代码重复。
  • 运维复杂度:增加了一层服务,意味着有更多的服务需要部署、监控和维护,增加了运维开销。
  • 延迟增加:请求链路变长(客户端 -> BFF -> 微服务),可能会引入额外的网络延迟。

总结

内部 BFF 是一种以用户界面为中心 的架构模式,它通过为每个前端创建专属的后端服务,来解决多端场景下通用API的灵活性不足问题。它的核心价值在于赋予前端团队更大的自主权,从而提升开发效率和用户体验。虽然带来了额外的复杂度和成本,但在需要精细化管理多端体验的大型项目中,BFF 模式是一种非常有效的解决方案。

BFF 模式也衍生出了"胖BFF"和"瘦BFF"等不同形态的讨论。如果你想了解这方面的细节,我可以继续为你介绍。

相关推荐
喵了几个咪2 个月前
单体项目如何“无感”演进微服务?GoWind的Core+BFF分层实践
微服务·架构·golang·gowind·bff