在 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 实现,适合大多数微服务网关场景。