CodeWalk

Spring Cloud Gateway的响应式网关原理

作者:专业代码师 · 2026-05-30 12:55

分析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