
Java微服务网关 - Spring Cloud Gateway实战
网关职责与价值
网关是微服务流量的统一入口,负责路由转发、鉴权限流、协议适配、熔断重试、观测审计与灰度发布。Spring Cloud Gateway 基于 Reactor Netty,具备响应式高并发能力与丰富的过滤器生态。
路由与断言(Predicates)
1 | spring: |
常用断言:Path、Method、Header、Query、Host、After/Before/Between(时间窗)等。
过滤器(Filters)
- 请求改写:
AddRequestHeader、RewritePath - 鉴权与 JWT:自定义全局过滤器解析 Token,注入 userId/roles
- 重试与超时:
Retry、RequestSize、SetResponseHeader
示例:路径重写与响应头设置
1 | filters: |
限流与熔断
基于 Redis 的令牌桶限流:
1 | filters: |
配置 IP 解析器:
1 |
|
熔断(Resilience4j):
1 | filters: |
灰度与权重路由
1 | routes: |
也可基于 Header/Query 进行定向灰度(如 X-Canary=1)。
安全与跨域
- 全局 CORS
1 | spring: |
- 认证:接入 OAuth2/OIDC,或自定义 JWT 验证过滤器
- 保护管理端点,只允许内网访问
可观测性
- 日志:统一 traceId 注入,打印路由ID、下游状态码、耗时
- 指标:Micrometer + Prometheus 导出 QPS/延迟/错误率
- 链路追踪:Sleuth/Brave/OTel,将 trace 传递给下游服务
性能实践
- 合理的线程模型:Gateway 基于 Reactor,避免阻塞 IO(如 JDBC)
- 超时配置:
connect-timeout与response-timeout
1 | spring: |
- 大包限制:设置
max-initial-line-length与max-header-size防御异常请求
常见踩坑
- 过滤器顺序导致 401/403:鉴权应早于业务改写
- 响应式编程误用阻塞方法:使用 WebClient 而非 RestTemplate
- 限流键过于细粒度导致雪崩:优先基于 IP/用户分桶
- 重试与幂等性:仅对 GET 或幂等接口开启重试
FAQ
- 网关支持 WebSocket/GRPC 吗?支持 WebSocket;gRPC 需 HTTP/2 支持与网关版本匹配
- 如何动态下发路由?使用 Nacos/Consul 等配置中心或自定义 RouteDefinitionRepository
- 灰度失败如何回滚?降低权重或移除 v2 路由,配合监控报警自动化回滚
总结
Spring Cloud Gateway 在 Java 体系中提供了高可用的网关方案。通过断言与过滤器灵活组合,实现鉴权、限流、熔断、灰度与观测的一体化能力,关键在于:有序的过滤器链、正确的线程模型与完善的监控告警。
本文是原创文章,采用CC BY-NC-SA 4.0协议,完整转载请注明来自Zelang's Blog
评论 ()




