API 网关与 BFF 架构

API 网关的核心职责、Backend-for-Frontend 模式、GraphQL 网关实践及认证路由策略。

API 网关与 BFF 架构

网关是微服务架构的流量入口,BFF 是适配多端体验的专用层。两者结合实现灵活的前后端协作。

1. API 网关核心职责

                    Client
                      ↓
              ┌───────────────┐
              │   API Gateway  │ ← 流量入口
              └───────────────┘
                      │
      ┌───────────────┼───────────────┐
      ↓               ↓               ↓
┌──────────┐    ┌──────────┐    ┌──────────┐
│ Order    │    │ Payment  │    │ User     │
│ Service  │    │ Service  │    │ Service  │
└──────────┘    └──────────┘    └──────────┘

功能矩阵

职责说明
请求路由按路径/Host/Header 转发到后端服务
负载均衡多种 LB 算法:Round Robin、Least Conn
认证授权JWT 校验、OAuth 集成、RBAC
限流熔断令牌桶限流、熔断状态机
协议转换HTTP ↔ gRPC、REST ↔ GraphQL
日志监控请求日志、延迟分布、错误率
灰度发布按用户比例/Header 路由

2. 网关选型

网关特点适用场景
Nginx/OpenResty高性能、Lua 扩展简单路由、高并发入口
Kong插件丰富、企业级全功能 API 管理
Apinto国产开源、轻量国内生态替代
Spring Cloud GatewayJava 生态、Spring 集成Spring 体系微服务
Envoy云原生、Service MeshK8s + Istio 场景
Traefik自动服务发现云原生动态路由

3. BFF 模式

Backend for Frontend:为不同客户端提供定制化的 API。

    ┌─────────┐
    │  Web    │────────────────→ Web BFF ──→ 聚合后端
    ├─────────┤
    │ Mobile  │────────────────→ Mobile BFF ──→ 聚合后端
    ├─────────┤
    │ Admin   │────────────────→ Admin BFF ──→ 聚合后端
    └─────────┘

BFF vs 网关

对比网关BFF
职责通用横切业务聚合、数据适配
关注点安全、限流、路由响应结构、数据裁剪
复用性全局统一每个客户端独立
示例JWT 校验Web 端返回更多字段

BFF 实践要点

// Web BFF:聚合多服务,返回完整数据
async function getOrderDetail(orderId) {
    const [order, payment, logis] = await Promise.all([
        orderService.get(orderId),
        paymentService.get(orderId),
        logisticsService.get(orderId)
    ]);
    return { order, payment, logistics: logis };
}

// Mobile BFF:精简响应,减少数据量
async function getOrderSummary(orderId) {
    const order = await orderService.get(orderId);
    return { id: order.id, status: order.status, total: order.total };
}

4. GraphQL 网关

为何选择 GraphQL

# 客户端决定要什么数据
query {
    order(id: "123") {
        id
        status
        items { name price }
        user { name avatar }
    }
}

优势:

  • 精确获取,避免 Over-fetching
  • 一次请求聚合多资源
  • 强类型 Schema 作为 API 契约

Schema Stitching / Federation

// Apollo Federation:多个服务各自维护子 Schema
const gateway = new ApolloGateway({
    serviceList: [
        { name: 'orders', url: '...' },
        { name: 'users', url: '...' }
    ]
});
// Gateway 自动合并为统一查询入口

GraphQL 网关的权衡

优势挑战
请求效率高N+1 查询问题
类型安全服务端复杂度
版本管理灵活缓存策略复杂
文档即代码学习成本

5. 认证与授权策略

典型认证流

Client → Auth Server → Token
  │
  │ (携带 Token)
  ↓
Gateway → 验签/鉴权 → 透传 UserID → Backend

网关层实现

# Kong 插件示例
plugins:
  - name: jwt
    config:
      uri_param_names: [jwt]
      claims_to_verify: [exp]
  - name: rate-limiting
    config:
      minute: 60

微服务间调用

方案 A:网关统一鉴权,Service 间信任传递
  └─ 简单但不适合内部安全要求高场景

方案 B:Service Mesh mTLS + 服务鉴权
  └─ 端到端安全,但复杂度较高

6. 性能优化

策略说明
连接池复用后端连接,减少 TCP 握手
响应缓存Cache-Control 策略、Redis 缓存
异步聚合并发请求下游服务
边缘缓存CDN 缓存静态 API
请求合并窗口期内合并相同请求

总结

组件核心能力代表工具
API 网关统一入口、安全、治理Kong, Envoy, Spring Gateway
BFF客户端适配、数据聚合Node.js, Java
GraphQL灵活查询、服务联邦Apollo, Hasura

7. 网关生产部署模式

部署拓扑

模式 A:集中式网关

Internet ──→ CDN/WAF ──→ API Gateway ──→ Backend Services
                  │
                  └── 所有流量统一经过网关
                  └── 适合:中小型系统,统一治理

模式 B:分层网关

Internet ──→ CDN/WAF ──→ Edge Gateway(认证、限流)
                              │
                    ┌─────────┼─────────┐
                    ▼         ▼         ▼
              Web BFF    Mobile BFF    Admin BFF
                    │         │         │
                    └─────────┼─────────┘
                              ▼
                        Internal API Gateway
                              │
                    ┌─────────┼─────────┐
                    ▼         ▼         ▼
                 Service A  Service B  Service C
                  └── 适合:大型系统,多客户端、多团队

模式 C:Sidecar 网关(Service Mesh)

Client ──→ Ingress Gateway
              │
    ┌─────────┼─────────┐
    ▼         ▼         ▼
 Pod A     Pod B     Pod C
 [App+Envoy] [App+Envoy] [App+Envoy]  ← Sidecar 代理
    │         │         │
    └─────────┴─────────┘
                   │
            Internal Services
            └── 适合:Kubernetes 环境,细粒度治理

与 Service Mesh 的关系

层级组件职责
边缘API Gateway南北流量、认证、限流、路由
内部Service Mesh (Istio)东西流量、mTLS、服务发现
应用BFF客户端适配、业务聚合

关键洞察:API Gateway 和 Service Mesh 不是二选一,而是互补。Gateway 处理外部流量入口,Service Mesh 处理内部服务通信。


8. 网关性能调优

优化项配置建议效果
连接池保持长连接,减少 TCP 握手减少 50%+ 延迟
HTTP/2启用多路复用减少连接数
响应缓存对读请求配置 TTL减少后端压力
超时配置按服务设置不同超时防止级联故障
请求合并窗口期内合并相同请求减少重复计算
压缩gzip / brotli减少传输体积 60-80%

总结

组件核心能力代表工具决策要点
API 网关统一入口、安全、治理Kong, Envoy, Spring Gateway性能 vs 功能丰富度
BFF客户端适配、数据聚合Node.js, Go , Java按客户端拆分
GraphQL灵活查询、服务联邦Apollo, Hasura团队 GraphQL 经验

网关是门面,BFF 是翻译。二者配合,为微服务提供统一且灵活的对外接口。在实际落地时,应根据团队技术栈和系统规模选择合适的部署模式:小型系统使用集中式网关即可,大型系统则需要分层网关 + Service Mesh 的组合方案。

继续阅读

探索更多技术文章

浏览归档,发现更多关于系统设计、工具链和工程实践的内容。

全部文章 返回首页

「架构」更多文章

  1. 韧性工程与错误预算:从 SLO 到故障演练
  2. 微前端架构:组合、隔离与独立部署
  3. 数据网格(Data Mesh):领域数据产品与去中心化治理