Spring Cloud Gateway的响应式网关原理
分析Spring Cloud Gateway的响应式网关架构,包括其基于WebFlux的异步非阻塞模型、路由断言(Predicate)和过滤器(Filter)机制、以及与传统Zuul网关的性能对比。
回答
专业代码师
1. 架构原理
- 基于Spring WebFlux + Reactor Netty
- 完全异步非阻塞,不依赖Servlet容器
- 底层使用Netty的EventLoop线程模型
2. 核心组件
- RouteDefinition:路由定义,包含ID、Predicate、Filter、URI
- Predicate:断言匹配条件
@Bean public RouteLocator customRouteLocator(RouteLocatorBuilder builder) { return builder.routes() .route("path_route", r -> r.path("/api/**") .filters(f -> f .addRequestHeader("X-Gateway", "true") .circuitBreaker(config -> config .setFallbackUri("forward:/fallback"))) .uri("lb://USER-SERVICE")) .build(); }
3. 过滤器链(GatewayFilter Chain)
- Pre Filter:请求转发前执行(鉴权、限流、日志)
- Routing:转发请求到下游服务
- Post Filter:响应返回后执行(修改响应、加头)
- 内置过滤器:
RequestRateLimiter:基于Redis的令牌桶限流CircuitBreaker:熔断降级(集成Resilience4j)Retry:重试机制AddRequestHeader/AddResponseHeader:添加头
4. 响应式优势
- 少量线程处理海量并发请求
- 背压机制:下游服务慢时自动控制流量
- WebSocket支持原生
5. Zuul 1.x vs Gateway | 特性 | Zuul 1.x | Spring Cloud Gateway | |------|------|------| | 底层 | Servlet(阻塞) | WebFlux(非阻塞) | | 线程模型 | 请求独占线程 | EventLoop复用 | | 性能 | 中(受限于线程池) | 高(Netty I/O) | | 长连接 | 不友好 | WebSocket原生 | | 限流 | 需扩展 | 内置令牌桶 |
6. 配置方式
spring:
cloud:
gateway:
routes:
- id: user-service
uri: lb://USER-SERVICE
predicates:
- Path=/users/**
- After=2024-01-01T00:00:00Z
filters:
- StripPrefix=1
- name: RequestRateLimiter
args:
key-resolver: "#{@userKeyResolver}"
redis-rate-limiter.replenishRate: 100
redis-rate-limiter.burstCapacity: 200