在spring cloud alibaba工程的网关模块中进行相关配置,实现限制每个IP在每秒只能访问3次(IP的限制原理是令牌桶算法)
步骤
添加依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis-reactive</artifactId>
</dependency>
修改配置文件
修改application.yml文件
- redis的配置
spring:
redis:
host: localhost
# 默认端口号是6379
port: 6379
- 过滤器配置
- 使用的过滤器是RequestRateLimiter
- RedisKeyResolver是自定义的类,用来实现获取ip
配置文件中填写首字母变成小写
spring:
gateway:
routes:
- id: alibaba-provider
uri: lb://alibaba-provider
predicates:
- Path=/ap/users
- Method=get
filters:
- RewritePath=/ap(?<abc>/?.*), $\{abc}
- name: RequestRateLimiter
# args是传入给RequestRateLimiter这个过滤器的参数
args:
# 给定redis中的key, 使用用户的ip作为key
keyResolver: '#{@redisKeyResolver}'
# 初始化往令牌桶中放的令牌数量
redis-rate-limiter.replenishRate: 3
# 每秒钟往令牌桶中存放的令牌的数量
redis-rate-limiter.burstCapacity: 3
实现获取IP的组件
该组件能够获取远程请求的IP地址,自定义一个RedisKeyResolve类
@Component
public class RedisKeyResolver implements KeyResolver {
@Override
public Mono<String> resolve(ServerWebExchange exchange) {
return Mono.just(exchange.getRequest().getRemoteAddress().getAddress().getHostAddress());
}
}
查看访问信息
将服务器开启以后,访问服务,在redis中运行keys *
查看访问的ip信息