限流作为网关最基本的功能,Spring Cloud Gateway官方就提供了RequestRateLimiterGatewayFilterFactory这个类,使用Redis和lua脚本实现了令牌桶方式的限流.这个filterFactory依赖RateLimiter及KeyResolver,其中KeyResolver用于从request中提取限流的key,而RateLimiter则是相应的针对key的限流规则.
首先,将这个KeyResolver交由spring管理起来
@Bean(name = "remoteAddrKeyResolver")
public KeyResolver getKeyResolver() {
return new KeyResolver() {
@Override
public Mono<String> resolve(ServerWebExchange exchange) {
return Mono.just(exchange.getRequest().getRemoteAddress().getHostName());
}
};
}
引入redis的依赖,并配置application.yml,这里对consumer-9090实现限流
#端口
server:
port: 16000
#服务名
spring:
application:
name: gateway
cloud:
gateway:
routes: #路由配置:参数为一个List
- id: consumer-9090 #唯一标识
uri: lb://RIBBON-CONSUMER #转发的地址,写服务名称
predicates: