一:Spring Cloud Gateway 自带限流实现
1. 添加依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis-reactive</artifactId>
</dependency>
2.指定KeyResolver的限流key
其中 exchange.getRequest().getRemoteAddress().getHostName(), 可以根据自己的需求去切换限流的key,我这里是根据hostName进行切换的。
@Bean
KeyResolver ipResolver() {
return exchange -> Mono.just(exchange.getRequest().getRemoteAddress().getHostName());
}
3. 配置文件修改
3.1根据官方文档设置的配置文件格式
spring:
cloud:
gateway:
routes:
- id: requestratelimiter_route
uri: http://example.org
filters:
- name: RequestRateLimiter
args:
redis-rate-limiter.replenishRate: 10
redis-rate-limiter.burstCapacity: 20
key-resolver: "#{@ipResolver}"
上面是官网的配置,但是我设定之后并不起作用,并且不会返回任何信息。
查看源码后修改配置
改造后的配置为
spring:
cloud:
gateway:
routes:
- id: requestratelimiter_route
uri: http://example.org
filters:
- name: RequestRateLimiter
args:
replenishRate: 10
burstCapacity: 20
key-resolver: "#{@ipResolver}"
4.运行测试
jemeter 测试之后,查看redis存储信息得:
超出限流请求时 Response code: 429