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

网关是门面,BFF 是翻译。二者配合,为微服务提供统一且灵活的对外接口。

继续阅读

探索更多技术文章

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

全部文章 返回首页

「架构」更多文章

  1. 架构评审与技术债管理
  2. SLA/SLO/SLI 与容量规划
  3. 云原生架构模式