API 网关:微服务入口的统一管控
什么是 API 网关
API 网关是微服务架构中的反向代理入口,所有外部请求先经过网关,再由网关路由到对应的微服务。
没有网关时,客户端需要知道每个微服务的地址,耦合严重。引入网关后,客户端只需知道网关地址,由网关统一处理横切关注点。
核心职责
1. 路由转发
根据请求路径、Header 等规则,将请求转发到对应的后端服务。
/api/users/** → user-service
/api/orders/** → order-service
/api/products/** → product-service
2. 认证与鉴权
在网关层统一校验 JWT Token、OAuth2 等,避免每个微服务重复实现认证逻辑。校验通过后将用户信息通过 Header 透传给下游。
3. 限流与熔断
保护后端服务不被突发流量冲垮:
- 限流:令牌桶、滑动窗口,按用户/IP/API 维度控制 QPS
- 熔断:下游服务异常时快速失败,避免级联故障
4. 请求聚合
将多个微服务的响应合并为一次返回,减少客户端请求次数。例如首页需要用户信息 + 订单列表 + 推荐商品,网关可以并发请求三个服务后聚合返回。
5. 日志与监控
网关是所有流量的必经之路,天然适合做:
- 统一日志记录
- 请求耗时统计
- 调用链起始点(生成 TraceID)
主流方案
Spring Cloud Gateway(Java 生态)
基于 WebFlux 的响应式网关,性能优秀:
spring:
cloud:
gateway:
routes:
- id: user-service
uri: lb://user-service
predicates:
- Path=/api/users/**
filters:
- StripPrefix=1
- name: RequestRateLimiter
args:
redis-rate-limiter.replenishRate: 10
优势:与 Spring 生态无缝集成,支持服务发现、负载均衡。
Kong / APISIX(通用网关)
基于 OpenResty (Nginx + Lua) 的高性能网关,通过插件扩展:
- Kong:插件丰富,企业级功能完善
- APISIX:性能更高,支持多语言插件
# APISIX 创建路由
curl http://127.0.0.1:9180/apisix/admin/routes/1 -X PUT -d '
{
"uri": "/api/users/*",
"upstream": {
"type": "roundrobin",
"nodes": { "user-service:8080": 1 }
},
"plugins": {
"limit-req": { "rate": 100, "burst": 50 }
}
}'
网关选型建议
| 方案 | 适用场景 | 性能 | 生态 |
|---|---|---|---|
| Spring Cloud Gateway | Java 技术栈 | 中 | 强(Spring 全家桶) |
| Kong | 多语言/混合架构 | 高 | 强(插件市场) |
| APISIX | 高性能场景 | 极高 | 中(快速成长) |
| Traefik | K8s/容器化 | 高 | 强(云原生) |
| Envoy + Istio | Service Mesh | 最高 | 强(CNCF 毕业) |
注意事项
- 网关不要做重业务逻辑:网关是基础设施,保持轻量
- 注意网关自身高可用:网关挂了全部服务不可用,需要多副本 + 健康检查
- 超时配置:聚合请求场景要合理设置超时和降级策略
- 避免网关成为瓶颈:IO 密集型的网关适合异步非阻塞模型