Backend for Frontend (BFF) 模式用于需要为不同客户端(例如移动应用程序、Web 应用程序、物联网设备)提供不同 API 或接口的场景,以优化它们与后端的交互并隐藏微服务的内部复杂性。每种类型的客户端都有自己的 BFF 服务器,该服务器实现最适合客户端需求的专门化 API。
在处理大型系统时,这很方便——不同的 BFF 可以:
以下是基于 Node.js 的架构示例:
// 用于 BFF 的 Express const express = require('express'); const axios = require('axios'); const app = express(); app.get('/profile', async (req, res) => { // 从不同服务聚合数据 const [user, settings] = await Promise.all([ axios.get('http://user-service/api/user'), axios.get('http://settings-service/api/settings') ]); res.json({ name: user.data.name, theme: settings.data.theme }); }); app.listen(3000);
关键特性:
BFF 只是客户端与微服务之间的一个代理吗?
不是。BFF 和普通代理的主要区别在于它具有业务逻辑和数据适配。BFF 转换和聚合数据,而不仅仅是重定向请求。
可以为所有客户端使用一个 BFF 吗?
不可以,BFF 的一个原则是为每种类型的客户端分配一个 BFF。如果使用统一的 BFF,就失去了针对不同接口和设备类型的最佳配置的意义。
BFF 增加团队之间的弱耦合吗?
通常回答“是”,但实际上并非如此:添加 BFF 通常会增强耦合,因为支持 BFF 需要前端和后端团队的共同工作,这需要协调变化。