API 网关
API Gateway 是所有外部流量进入微服务前的统一处理层,承担鉴权、限流、路由、监控等横切关注点。
定位
客户端
│
▼
API Gateway ←── 所有请求的唯一入口
│
├── user-service
├── order-service
├── payment-service
└── ai-service
没有 API Gateway 时,每个微服务都要自己实现鉴权、限流、日志,造成大量重复逻辑。
核心能力
鉴权(Authentication & Authorization)
- JWT 验证:网关解析 Token,注入用户信息到 Header,后端无需重复验证
- OAuth2:统一授权,支持第三方登录
- API Key:对外开放接口的简单鉴权
请求携带 JWT Token
│
▼
网关解析 Token
├── 合法 → 注入 X-User-Id: 123 → 转发
└── 非法 → 401 Unauthorized
限流(Rate Limiting)
| 策略 | 说明 |
|---|---|
| 全局限流 | 所有请求总 QPS 上限 |
| 用户级限流 | 每个用户 N 次/秒 |
| IP 限流 | 防止单 IP 刷接口 |
| 接口限流 | 核心接口单独保护 |
算法:
- 令牌桶(Token Bucket):允许突发流量
- 滑动窗口(Sliding Window):精准控制时间窗口内请求数
- 漏桶(Leaky Bucket):平滑输出,防止突刺
路由(Routing)
| 路由维度 | 示例 |
|---|---|
| 路径路由 | /api/user → user-service |
| Header 路由 | X-Version: v2 → v2 服务 |
| 灰度路由 | 5% 流量 → 新版本 Pod |
| 地域路由 | 国内请求 → 国内集群 |
其他能力
- 协议转换:REST → gRPC、WebSocket 升级
- 请求/响应改写:添加 Header、修改 Body
- API 聚合:将多个服务的响应合并后返回(BFF 模式)
- 统一日志:所有请求的访问日志集中采集
- OpenAPI 文档:自动生成接口文档
主流方案对比
| 网关 | 语言 | 特点 | 适用场景 |
|---|---|---|---|
| Kong | Go + Lua | 插件生态最丰富,商业版功能强 | 企业级,多语言团队 |
| APISIX | Go + Lua | 国产,性能强,动态配置 | 高并发,国内团队 |
| Envoy Gateway | Go | Service Mesh 生态,K8s Gateway API 标准 | 云原生,Istio 配套 |
| Spring Cloud Gateway | Java | Spring 生态无缝集成 | Java 微服务团队 |
| Traefik | Go | 自动发现,配置简单 | 中小规模,K8s 原生 |
K8s Gateway API
K8s 官方正在用 Gateway API 替代 Ingress,提供更强的表达能力:
GatewayClass → Gateway → HTTPRoute → Service
相比 Ingress 的优势:
- 多租户(不同团队管理不同 Route)
- 支持 Header/Query 路由
- 支持流量权重(金丝雀发布原生支持)
- 支持 TLS 终止配置
网关 vs Ingress vs Service Mesh
| 维度 | API Gateway | Ingress | Service Mesh |
|---|---|---|---|
| 流量方向 | 南北向(外→内) | 南北向(外→内) | 东西向(内→内) |
| 部署位置 | 集群边界 | 集群边界 | 每个 Pod Sidecar |
| 鉴权 | 是 | 基础 | mTLS |
| 限流 | 是 | 插件支持 | 是 |
| 熔断 | 是 | 否 | 是 |
| 可观测 | 是 | 基础 | 深度 |
Java 实战(Spring Cloud)
- Spring Cloud 总览
- Spring Cloud Gateway
- 熔断与限流
- Spring Boot 限流
- Redis(Gateway 令牌桶限流)