soul 入门 第十六章 rateLimit 插件
介绍
rateLimit是限流插件,可以精细控制到接口级别
rateLimit 的使用
1、在admin中启用rateLimit插件,配置redis模式、redis地址等。
2、在rateLimit插件页面添加选择器,为选择器设置规则,主要包括条件、桶容量、令牌速率。
3、网关引入rateLimit插件
<!-- soul ratelimiter plugin start-->
<dependency>
<groupId>org.dromara</groupId>
<artifactId>soul-spring-boot-starter-plugin-ratelimiter</artifactId>
<version>${last.version}</version>
</dependency>
<!-- soul ratelimiter plugin end-->
4、重启网关
原理
rateLimit 限流是通过令牌桶实现,拿到令牌即可访问目标资源,否则直接返回。令牌以某个速率流入桶中。rateLimit采用redis令牌桶。
下面看下rateLimit插件关键代码
@Override
protected Mono<Void> doExecute(final ServerWebExchange exchange, final SoulPluginChain chain, final SelectorData selector, final RuleData rule) {
// 获得处理器名称
final String handle = rule.getHandle();
// 拿到处理器
final RateLimiterHandle limiterHandle = GsonUtils.getInstance().fromJson(handle, RateLimiterHandle.class);
// 判断是否需要限流
return redisRateLimiter.isAllowed(rule.getId(), limiterHandle.getReplenishRate(), limiterHandle.getBurstCapacity())
.flatMap(response -> {
if (!response.isAllowed()) {
exchange.getResponse().setStatusCode(HttpStatus.TOO_MANY_REQUESTS);
Object error = SoulResultWrap.error(SoulResultEnum.TOO_MANY_REQUESTS.getCode(), SoulResultEnum.TOO_MANY_REQUESTS.getMsg(), null);
// 需要实施限流
return WebFluxResultUtils.result(exchange, error);
}
// 不限,程序往下走
return chain.execute(exchange);
});
}