Spring Cloud Gateway 中,实现限流(Rate Limiting)功能的常见方式是通过内置的 RequestRateLimiter 过滤器。这个过滤器结合了 Redis令牌桶算法(Token Bucket Algorithm) 来实现高效的限流控制。

实现限流的关键组件与技术:

1. RequestRateLimiter Gateway Filter

这是 Spring Cloud Gateway 提供的一个内置过滤器,专门用于限流处理。

  • 配置方式:可以在 application.yml 或 Java 配置中设置。
  • 属于 Gateway Filter Factory 的一种:RequestRateLimiterGatewayFilterFactory

2. Redis

Spring Cloud Gateway 的默认实现使用 Redis 来存储令牌桶状态,因为 Redis 的操作是原子性的,适合高并发场景。

  • 所需依赖(以 RedisReactive 为例): <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis-reactive</artifactId> </dependency>

3. 令牌桶算法(Token Bucket Algorithm)

该算法是限流中的一种常见策略,具体过程如下:

  • 每个用户/请求维度维持一个“令牌桶”。
  • 桶中按固定速率填充令牌(如每秒 2 个)。
  • 每个请求消耗一个令牌,若没有令牌,则拒绝请求。

配置示例(基于 application.yml)

spring:
  cloud:
    gateway:
      routes:
        - id: rate_limit_route
          uri: http://httpbin.org/get
          predicates:
            - Path=/get
          filters:
            - name: RequestRateLimiter
              args:
                redis-rate-limiter.replenishRate: 5       # 每秒新增令牌数
                redis-rate-limiter.burstCapacity: 10      # 最大令牌桶容量
                key-resolver: "#{@ipKeyResolver}"          # 限流的key,默认按IP

# 定义 KeyResolver Bean

自定义 KeyResolver(按 IP 限流):

@Bean
public KeyResolver ipKeyResolver() {
    return exchange -> Mono.just(
        Objects.requireNonNull(exchange.getRequest().getRemoteAddress()).getAddress().getHostAddress()
    );
}

你也可以根据用户 ID、API 路径、Header 等来定义限流维度。

限流策略小结

限流策略简介适用场景
令牌桶控制请求速率,可平滑突发请求高并发 API 接口限流
固定窗口/滑动窗口按时间周期统计请求数简单限流需求
漏桶算法控制请求匀速处理限流 + 匀速执行需求

Spring Cloud Gateway 默认采用 令牌桶算法 + Redis 实现,适合大多数微服务网关场景。