网关职责与价值

网关是微服务流量的统一入口,负责路由转发、鉴权限流、协议适配、熔断重试、观测审计与灰度发布。Spring Cloud Gateway 基于 Reactor Netty,具备响应式高并发能力与丰富的过滤器生态。

路由与断言(Predicates)

1
2
3
4
5
6
7
8
9
10
11
12
spring:
cloud:
gateway:
routes:
- id: user
uri: http://user-service
predicates:
- Path=/api/user/**
- Method=GET,POST
- Header=X-Env, prod
filters:
- StripPrefix=2

常用断言:Path、Method、Header、Query、Host、After/Before/Between(时间窗)等。

过滤器(Filters)

  • 请求改写:AddRequestHeaderRewritePath
  • 鉴权与 JWT:自定义全局过滤器解析 Token,注入 userId/roles
  • 重试与超时:RetryRequestSizeSetResponseHeader

示例:路径重写与响应头设置

1
2
3
filters:
- RewritePath=/api/(?<segment>.*), /${segment}
- AddResponseHeader=X-Trace, #{#root.request.id}

限流与熔断

基于 Redis 的令牌桶限流:

1
2
3
4
5
6
filters:
- name: RequestRateLimiter
args:
key-resolver: "#{@ipKeyResolver}"
redis-rate-limiter.replenishRate: 50
redis-rate-limiter.burstCapacity: 100

配置 IP 解析器:

1
2
3
4
5
6
@Bean
KeyResolver ipKeyResolver() {
return exchange -> Mono.just(
Objects.requireNonNull(exchange.getRequest().getRemoteAddress()).getAddress().getHostAddress()
);
}

熔断(Resilience4j):

1
2
3
4
5
filters:
- name: CircuitBreaker
args:
name: user-cb
fallbackUri: forward:/fallback/user

灰度与权重路由

1
2
3
4
5
6
7
8
9
routes:
- id: user-v1
uri: http://user-v1
predicates: [ Path=/api/user/** ]
filters: [ Weight=user, 90 ]
- id: user-v2
uri: http://user-v2
predicates: [ Path=/api/user/** ]
filters: [ Weight=user, 10 ]

也可基于 Header/Query 进行定向灰度(如 X-Canary=1)。

安全与跨域

  • 全局 CORS
1
2
3
4
5
6
7
8
9
10
spring:
cloud:
gateway:
globalcors:
corsConfigurations:
'[/**]':
allowedOrigins: "*"
allowedMethods: [GET,POST,PUT,DELETE,OPTIONS]
allowedHeaders: "*"
allowCredentials: true
  • 认证:接入 OAuth2/OIDC,或自定义 JWT 验证过滤器
  • 保护管理端点,只允许内网访问

可观测性

  • 日志:统一 traceId 注入,打印路由ID、下游状态码、耗时
  • 指标:Micrometer + Prometheus 导出 QPS/延迟/错误率
  • 链路追踪:Sleuth/Brave/OTel,将 trace 传递给下游服务

性能实践

  • 合理的线程模型:Gateway 基于 Reactor,避免阻塞 IO(如 JDBC)
  • 超时配置:connect-timeoutresponse-timeout
1
2
3
4
5
6
spring:
cloud:
gateway:
httpclient:
connect-timeout: 3000
response-timeout: 5s
  • 大包限制:设置 max-initial-line-lengthmax-header-size 防御异常请求

常见踩坑

  • 过滤器顺序导致 401/403:鉴权应早于业务改写
  • 响应式编程误用阻塞方法:使用 WebClient 而非 RestTemplate
  • 限流键过于细粒度导致雪崩:优先基于 IP/用户分桶
  • 重试与幂等性:仅对 GET 或幂等接口开启重试

FAQ

  • 网关支持 WebSocket/GRPC 吗?支持 WebSocket;gRPC 需 HTTP/2 支持与网关版本匹配
  • 如何动态下发路由?使用 Nacos/Consul 等配置中心或自定义 RouteDefinitionRepository
  • 灰度失败如何回滚?降低权重或移除 v2 路由,配合监控报警自动化回滚

总结

Spring Cloud Gateway 在 Java 体系中提供了高可用的网关方案。通过断言与过滤器灵活组合,实现鉴权、限流、熔断、灰度与观测的一体化能力,关键在于:有序的过滤器链、正确的线程模型与完善的监控告警。