soul 入门 第十六章 rateLimit 插件

246 阅读1分钟

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);
            });
}