代码在:
https://gitee.com/sleepforests/spring-cloud-gateway-demo
spring cloud gateway内置了限流filter,通过配置及简单开发即可完成限流逻辑。
scg使用令牌桶算法来实现限流,需要使用redis来支持集群模式。
下面是最简单的一个配置:
filters:
- name: RequestRateLimiter
args:
key-resolver: '#{@appIdKeyResolver}'
redis-rate-limiter.replenishRate: 1
redis-rate-limiter.burstCapacity: 3
其中,key-resolver是限流的key,比如我们使用host来计算流量、使用userId来计算流量、使用appId计算流量等。scg提供了一个接口,我们来实现,这里配置的是bean的id。
接口如下:
/**
- @author Spencer Gibb
*/
public interface KeyResolver {
Mono<String> resolve(ServerWebExchange exchange);
}
这里我们使用host来限流
public class AppIdKeyResolver implements KeyResolver {
@Override
public Mono<String> resolve(ServerWebExchange exchange) {
return Mono.just(exchange.getRequest().getQueryParams().getFirst("appId"));
}
}
@Bean
public AppIdKeyResolver appIdKeyResolver() {
return new AppIdKeyResolver();
}
几点问题:
1、依赖redis,对于高qps的情况下其实有问题;
2、有一个限流的lua脚本,可以上去看看具体的逻辑,我没怎么看;
3、限流之后直接给用户报错,不知道有没有扩展点能提供一个友好的提示给用户,或者其他兜底措施;
网友评论