想要快速为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
状态码
- 使用工具(如JMeter)发送超过
-
监控Redis数据
- 限流计数器存储在Redis中,键名格式为
request_rate_limiter.{key}.tokens
,可通过redis-cli
查看实时令牌数量
- 限流计数器存储在Redis中,键名格式为
五、注意事项
-
算法选择
- 令牌桶:允许突发流量,适合应对短时高峰(默认方案)
- 漏桶:平滑流量,强制恒定速率(需自定义实现)
-
分布式一致性
- 生产环境建议使用Redis集群,避免单点故障导致限流失效
-
动态配置
- 结合Nacos可实现限流规则热更新
通过以上步骤,可快速实现基于Spring Cloud Gateway的限流控制。实际项目中建议结合监控系统(如Prometheus)实时观察限流效果,并根据业务需求调整参数。