BFF(Backend for Frontend)和API Gateway(网关)是微服务架构中两个容易混淆但职责完全不同的组件。它们不是替代关系,而是协同关系:Gateway 在最外层做统一入口,BFF 在 Gateway 之后、领域服务之前,为特定前端定制接口。
一、核心定位对比
| 维度 | API Gateway | BFF |
|---|---|---|
| 面向对象 | 所有客户端 | 特定前端(Web/App/大屏) |
| 核心职责 | 路由、鉴权、限流、熔断、协议转换 | 聚合、裁剪、适配、编排 |
| 数量 | 通常一个 | 每个前端一个 |
| 业务逻辑 | 尽量少,只做基础设施 | 可以有编排逻辑 |
| 变更频率 | 低,稳定 | 高,跟随前端迭代 |
| 归属 | 平台/运维团队 | 前端/业务团队 |
| 技术选型 | Nginx、Kong、Spring Cloud Gateway | Node.js、NestJS、Spring Boot、FastAPI |
一句话:Gateway 是“大门”,BFF 是“前台”。
二、API Gateway 详解
定位
微服务的统一入口,所有外部请求先经过 Gateway,再路由到内部服务。
核心职责
路由转发:根据 URL 把请求转发到对应服务。
鉴权认证:校验 token、API Key,拒绝非法请求。
限流熔断:保护后端服务,防止雪崩。
协议转换:外部 HTTP → 内部 gRPC/Dubbo。
日志监控:统一记录请求日志、指标。
灰度发布:按规则路由到不同版本。
安全防护:防 SQL 注入、XSS、DDoS。
常见实现
Nginx / OpenResty
Kong
Spring Cloud Gateway
APISIX
Envoy
云厂商:AWS API Gateway、阿里云 API 网关
特点
通用性:不关心具体业务,对所有客户端一视同仁。
稳定性:变更少,一旦配置好,很少改动。
性能:高并发、低延迟,通常用 C/C++/Go 编写。
三、BFF 详解
定位
为特定前端定制的中间层,位于 Gateway 之后、领域服务之前。
核心职责
接口聚合:把多个后端接口合并成一个。
数据裁剪:只返回前端需要的字段。
格式适配:后端数据结构转前端友好格式。
多端定制:Web BFF、App BFF、大屏 BFF 各自独立。
鉴权与会话:统一处理 token、用户上下文。
缓存与降级:热点数据缓存,后端故障时兜底。
业务编排:调用多个服务,完成一个前端需求。
常见实现
Node.js / NestJS:高并发 I/O,与前端同构。
Spring Boot:企业级,强事务。
FastAPI:AI 场景,异步、自动文档。
Go:高性能网关。
GraphQL:前端按需取数,天然 BFF。
特点
定制性:每个前端一个 BFF,接口为该端量身定制。
灵活性:跟随前端快速迭代。
业务性:可以有编排逻辑,但不碰数据库。
四、协同关系
text
┌─────────┐ ┌─────────┐ ┌─────────┐ │ Web │ │ App │ │ 大屏 │ └────┬────┘ └────┬────┘ └────┬────┘ │ │ │ └────────────┼────────────┘ ▼ ┌─────────────────┐ │ API Gateway │ 统一入口、鉴权、限流 └────────┬────────┘ │ ┌───────────┼───────────┐ ▼ ▼ ▼ ┌─────────┐ ┌─────────┐ ┌─────────┐ │ Web BFF │ │ App BFF │ │大屏 BFF │ └────┬────┘ └────┬────┘ └────┬────┘ │ │ │ └───────────┼───────────┘ ▼ ┌─────────────────┐ │ 领域服务 │ │ 用户/订单/库存 │ └─────────────────┘
请求链路:前端 → Gateway → BFF → 领域服务
Gateway做统一的基础设施:鉴权、限流、路由。
BFF做前端的定制化:聚合、裁剪、适配。
领域服务做核心业务:数据、事务、领域逻辑。
五、为什么不能互相替代
Gateway 不能替代 BFF
Gateway 对所有客户端通用,无法为每个前端定制。
Gateway 不应该有业务逻辑,聚合编排会让它臃肿。
Gateway 变更影响所有客户端,不能跟随单个前端迭代。
BFF 不能替代 Gateway
BFF 是特定前端的,无法统一处理所有入口。
BFF 不做限流、熔断、DDoS 防护等基础设施。
BFF 数量多,如果每个都做鉴权,重复且难维护。
结论:Gateway 管“进门”,BFF 管“点菜”。两者缺一不可。
六、什么时候需要 BFF
| 场景 | 是否需要 BFF |
|---|---|
| 单一 Web 前端,接口简单 | ❌ 不需要 |
| 多端(Web/App/小程序/大屏) | ✅ 需要 |
| 前端需要聚合多个后端接口 | ✅ 需要 |
| 后端接口字段太多,前端只用少数 | ✅ 需要 |
| 前端迭代快,后端稳定 | ✅ 需要 |
| 团队有前端/全栈资源 | ✅ 适合 |
| 团队只有后端,前端外包 | ❌ 慎重 |
| 微服务数量少,接口简单 | ❌ 不需要 |
七、最佳实践
Gateway 层
只做基础设施:鉴权、限流、路由、日志。
不做业务逻辑:聚合、编排下沉到 BFF。
配置化:路由规则用配置中心管理。
高可用:多实例部署,避免单点。
监控告警:QPS、延迟、错误率。
BFF 层
按端划分:Web BFF、App BFF、大屏 BFF。
不碰数据库:只调用领域服务。
不做核心业务:核心逻辑下沉。
统一鉴权:集中处理 token、用户上下文。
缓存热点:聚合结果可缓存。
降级策略:后端故障时返回兜底数据。
避免膨胀:BFF 不应变成新的“万能后端”。
团队 ownership:由前端或全栈团队负责。
八、技术选型建议
| 组件 | 推荐技术 | 理由 |
|---|---|---|
| Gateway | Spring Cloud Gateway / Kong / APISIX | 成熟、高性能、生态好 |
| Web BFF | NestJS / Node.js | 与前端同构,聚合 I/O 强 |
| App BFF | NestJS / Go | 高并发、低延迟 |
| AI BFF | FastAPI | 异步、自动文档、AI 生态 |
| 大屏 BFF | Node.js / Go | 聚合多系统数据 |
| GraphQL BFF | Apollo / GraphQL Yoga | 前端按需取数 |
九、总结
| 对比维度 | API Gateway | BFF |
|---|---|---|
| 定位 | 统一入口 | 前端专属中间层 |
| 面向 | 所有客户端 | 特定前端 |
| 职责 | 路由、鉴权、限流 | 聚合、裁剪、适配 |
| 数量 | 一个 | 每个前端一个 |
| 业务 | 无 | 有编排 |
| 变更 | 低 | 高 |
| 归属 | 平台/运维 | 前端/业务 |
| 技术 | Nginx/Kong/Gateway | Node/Spring/FastAPI |
一句话:Gateway 是微服务的“大门”,BFF 是前端的“专属前台”。Gateway 管安全、路由、限流;BFF 管聚合、裁剪、适配。两者协同,才能既保证后端稳定,又让前端体验流畅。
请求链路:前端 → Gateway → BFF → 领域服务。