微服务架构下,API网关是流量入口,负责路由转发、鉴权、限流、灰度与日志采集,接口治理从”每个服务各管各的”收敛成”入口统一管控”。本文对比主流网关,围绕Spring Cloud Gateway给出路由、限流、鉴权与接口规范的实践配置,并说明接口规范和服务治理的落地要点。
微服务API网关的职责边界与选型原则
网关只处理”通用横切逻辑”:鉴权、限流、灰度、路由、审计。业务逻辑不要在网关里实现,否则网关会膨胀、更新频繁、成为故障点。选型时考虑四个维度:生态成熟度、路由性能、插件机制、与现有技术栈的契合度。Java技术栈用Spring Cloud Gateway,需要多语言插件和动态路由时用APISIX或Kong,两者都基于OpenResty/NGINX的底层。
主流网关选型对比
- Spring Cloud Gateway:WebFlux异步模型,与Spring生态无缝,适合Java团队,路由配置支持代码与YAML。
- APISIX:高性能、插件机制,热更新路由,支持Kubernetes集成,适合多语言或K8s场景。
- Kong:企业版功能全,插件市场大,基于Nginx生态,适合已有Nginx运维经验的团队。
选型不必纠结某个功能,先确认团队维护能力:Java团队选Spring Cloud Gateway学习成本最低,配置不涉及额外编排。
Spring Cloud Gateway路由与限流配置
路由定义路径到服务的映射,限流用Redis实现令牌桶(RequestRateLimiter):
spring:
cloud:
gateway:
routes:
- id: order-service
uri: lb://order-service
predicates:
- Path=/api/order/**
filters:
- name: RequestRateLimiter
args:
redis-rate-limiter.replenishRate: 10 # 每秒令牌填充数
redis-rate-limiter.burstCapacity: 20 # 突发容量
key-resolver: "#{@userKeyResolver}"
- id: user-service
uri: lb://user-service
predicates:
- Path=/api/user/**
key-resolver根据IP或用户ID生成限流维度,保障单个用户不独占配额:
@Bean
public KeyResolver userKeyResolver() {
return exchange -> Mono.just(
exchange.getRequest().getRemoteAddress().getAddress().getHostAddress()
);
}
API接口规范与版本管理
接口规范要统一四件事:路径命名、鉴权头、错误码、版本策略。路径用资源复数+动作(/api/orders),鉴权统一走BearerToken由网关校验,错误码用三段式(业务域_错误号)如order_not_found_1001,版本用URL前缀/v1/或Header版本号,向后兼容时优先用Header避免路径爆炸。
网关鉴权与错误码设计
网关鉴权做JWT校验、白名单放行、Token过期刷新。统一错误响应格式:
{
"code": "auth_token_expired_40101",
"message": "token已过期,请重新登录",
"traceId": "8f3a2c1e-9b0d-4f6a-8a5e-1d2c3b4a5f6e"
}
traceId随请求全链路传递,排查问题定位到具体调用链。
网关可观测性与稳定性
网关作为流量入口,必须在它身上埋点:请求数、错误数、延迟分布、限流命中次数全部上报Prometheus,接口分版本和维度的面板。稳定性配置:限流、熔断(sentinel或resilience4j)、超时兜底,避免单条慢链路拖垮整个网关。变更采用灰度路由先行,再全量放量。
接口治理的常见问题
接口治理容易踩的坑:一是网关和业务都写鉴权,双重校验浪费性能;二是限流参数拍脑袋,突发流量直接打到下游;三是错误码设计随意,客户端每次都改switch。落地顺序建议:先统一路由和错误码,再补鉴权与限流,最后接监控和灰度,治理节奏和版本发布对齐,避免一次性大改造成线上故障。
原创文章,作者:小编,如若转载,请注明出处:https://www.yunthe.com/wei-fu-wu-api-wang-guan-xuan-xing-yu-jie-kou-zhi-li-shi/