1. 导入依赖
<!-- 限流 需要的依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<!-- 基于redis实现限流-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis-reactive</artifactId>
</dependency>
2. 配置redis
3. 配置application.yml
spring:
application:
name: upen-gateway
#配置springcloudgateway
cloud:
gateway:
routes:
- id: auth-server #保证id唯一
# uri: http://localhost:9001 #路由转发的服务
uri: lb://demo-auth #发现注册中心的sever-id来动态设置路由转发的 uri
predicates:
- Path=/user/** #匹配规则 根据访问的路径来确认那些路由需要转发
filters:
- name: RequestRateLimiter
args:
key-resolver: "#{@pathKeyResolver}"
redis-rate-limiter.replenishRate: 1 #每秒向令牌桶下发多少个令牌
redis-rate-limiter.burstCapacity: 3 #令牌桶最大有多少个令牌
redis:
host: localhost
database: 0
port: 6379
使用令牌桶算法实现限流,redis记录每秒会有多少个令牌下发到令牌桶,而令牌桶会有一个最大容量。每个请求经过网关时需要从令牌桶中获取一个令牌去执行请求,如果令牌桶内无令牌 则该请求为无效请求,将被拦截
4. 配置令牌解析器
@Configuration
public class KeyResolverConfiguration {
@Bean
public KeyResolver pathKeyResolver(){
return new KeyResolver() {
@Override
public Mono<String> resolve(ServerWebExchange exchange) {
//根据路径进行限流
//还可以根据ip
//根据参数进行限流
return Mono.just(exchange.getRequest().getPath().toString());
}
};
}
}