Spring Cloud Gateway:流量控制与熔断降级实战配置

一、流量控制(限流)配置

Spring Cloud Gateway 通过 RequestRateLimiter 过滤器实现限流,常用 令牌桶算法。以下是完整配置流程:

  1. 添加依赖pom.xml):
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis-reactive</artifactId>
</dependency>

  1. Redis 配置application.yml):
spring:
  redis:
    host: 127.0.0.1
    port: 6379
  cloud:
    gateway:
      routes:
        - id: user_service
          uri: lb://user-service
          predicates:
            - Path=/api/users/**
          filters:
            - name: RequestRateLimiter
              args:
                redis-rate-limiter.replenishRate: 10    # 每秒生成10个令牌
                redis-rate-limiter.burstCapacity: 20    # 桶容量20个令牌
                key-resolver: "#{@userKeyResolver}"       # 限流键解析器

  1. 自定义限流键(Java 配置类):
@Bean
KeyResolver userKeyResolver() {
    return exchange -> Mono.just(
        exchange.getRequest().getRemoteAddress().getAddress().getHostAddress()
    ); // 按IP限流
}

二、熔断降级配置

集成 Resilience4j 实现熔断(Hystrix 已弃用):

  1. 添加依赖
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-circuitbreaker-reactor-resilience4j</artifactId>
</dependency>

  1. 熔断器配置application.yml):
resilience4j:
  circuitbreaker:
    instances:
      backendA:
        failureRateThreshold: 50%     # 失败率阈值
        minimumNumberOfCalls: 5       # 最小调用数
        slidingWindowType: COUNT_BASED # 滑动窗口类型
        slidingWindowSize: 10          # 窗口大小

  1. 网关熔断过滤器
spring:
  cloud:
    gateway:
      routes:
        - id: order_service
          uri: lb://order-service
          predicates:
            - Path=/api/orders/**
          filters:
            - name: CircuitBreaker
              args:
                name: backendA                  # 熔断器实例名
                fallbackUri: forward:/fallback  # 降级端点

  1. 降级处理控制器
@RestController
public class FallbackController {
    @GetMapping("/fallback")
    public Mono<String> fallback() {
        return Mono.just("服务暂时不可用,请稍后重试");
    }
}

三、关键参数说明
配置项 说明
replenishRate 每秒补充的令牌数,决定平均流量
burstCapacity 桶容量,允许的瞬时突发流量
failureRateThreshold 熔断触发失败率阈值(如:$50%$ 表示失败率过半时熔断)
slidingWindowSize 统计失败率的调用次数窗口大小
fallbackUri 熔断时转发的降级服务端点
四、测试验证方法
  1. 限流测试

    # 使用压测工具模拟高并发
    ab -n 100 -c 30 http://gateway:8080/api/users/
    

    观察返回 429 Too Many Requests 的请求比例

  2. 熔断测试

    • 连续触发下游服务异常
    • 当失败率达到阈值时,请求自动转发到 fallback 端点

最佳实践:生产环境建议结合 Prometheus + Grafana 监控流量与熔断状态,动态调整阈值。

更多推荐