Spring Cloud Gateway限流极速部署:3步搞定,秒级防护微服务!

想要快速为Spring Cloud Gateway集成限流功能?本文提供最简方案,无需复杂配置,三步即可完成!通过内置的RequestRateLimiter过滤器,结合Redis实现高并发场景下的精准流量控制。

一、环境准备

  • 添加核心依赖

    pom.xml中引入Spring Cloud Gateway和Redis Reactive依赖(Redis用于分布式限流):

<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>
  • 配置Redis连接

    application.yml中配置Redis地址:

spring:
  redis:
    host: localhost
    port: 6379

二、基础限流配置

  • 令牌桶算法实现

    Spring Cloud Gateway默认采用令牌桶算法,通过RequestRateLimiter过滤器实现:

spring:
  cloud:
    gateway:
      routes:
        - id: user-service
          uri: lb://user-service
          predicates:
            - Path=/api/users/**
          filters:
            - name: RequestRateLimiter
              args:
                # 令牌桶每秒填充速率(req/s)
                redis-rate-limiter.replenishRate: 10 
                # 突发流量容量(令牌桶大小)
                redis-rate-limiter.burstCapacity: 20 
                # 限流维度解析器(按IP限流)
                key-resolver: "#{@ipKeyResolver}" 
  • 定义限流维度解析器

    创建KeyResolver Bean决定限流维度(如IP、用户ID等):

@Bean
public KeyResolver ipKeyResolver() {
    return exchange -> Mono.just(
        exchange.getRequest().getRemoteAddress().getHostString()
    );
}

三、高级限流策略

  • 多维度组合限流

    支持同时配置路径和IP限流:

filters:
  - name: RequestRateLimiter
    args:
      rate-limiter: "compoundRateLimiter"
      key-resolver: "#{@pathAndIpKeyResolver}"
自定义组合限流解析器(如将路径和IP拼接为Key):
@Bean
public KeyResolver pathAndIpKeyResolver() {
    return exchange -> {
        String ip = exchange.getRequest().getRemoteAddress().getHostString();
        String path = exchange.getRequest().getURI().getPath();
        return Mono.just(ip + ":" + path); // 组合维度生成唯一key
    };
}
  • 自定义限流算法

    若需替换默认算法(如改用漏桶算法)

    实现RateLimiter接口,重写isAllowed方法

     public class CustomRateLimiter extends AbstractRateLimiter<CustomRateLimiter.Config> {
         @Override
         public Mono<Response> isAllowed(String routeId, String id) {
             // 自定义算法逻辑
             // 返回Mono.just(Response.of(allowed, remainingTokens))
         }
     }

在配置中通过SpEL指定自定义类:

args:
  rate-limiter: "#{@customRateLimiter}"

四、验证与测试

  • 触发限流

    • 使用工具(如JMeter)发送超过burstCapacity的请求,观察返回429 Too Many Requests状态码
  • 监控Redis数据

    • 限流计数器存储在Redis中,键名格式为request_rate_limiter.{key}.tokens,可通过redis-cli查看实时令牌数量

五、注意事项

  • 算法选择
    • 令牌桶:允许突发流量,适合应对短时高峰(默认方案)
    • 漏桶:平滑流量,强制恒定速率(需自定义实现)
  • 分布式一致性
    • 生产环境建议使用Redis集群,避免单点故障导致限流失效
  • 动态配置
    • 结合Nacos可实现限流规则热更新

通过以上步骤,可快速实现基于Spring Cloud Gateway的限流控制。实际项目中建议结合监控系统(如Prometheus)实时观察限流效果,并根据业务需求调整参数。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容