SpringCloud-Gateway(限流)

42 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第14天,点击查看活动详情

Gateway中限流

Gateway 中它的限流是基于 redisLua 脚本来实现的令牌桶算法来进行限流的,底层的原理就是基于令牌桶算法。
由于它是基于 redis 来实现的限流、所以我们项目中必须要添加 redis 的依赖和依赖 redis服务

Gateway中限流配置

当我们项目中已经正常引入 redis依赖redis服务之后就可以进行配置 Gateway的限流。
限流中的参数比较多,所以是提供了 nameargs 进行配置。
1、name就是 RequestRateLimiter
2、args中有多个配置内容:

  • 第一个是叫 key-resolver ,表示当前使用的限流方案是令牌桶算法基于什么进行限流,限流的依据是什么,配置的规则是 '#{}' 这是一个固定语法,单引号是防止里面有特殊字符,一般来说会这样进行配置例如:'#{@abcComponet}',表示是使用 spring 容器中叫abcComponet的。
  • 第二个是redis-rate-limiter.replenisRate,表示每秒往里面放多少个令牌,可以理解为平均的QPS数量,例如设置的是 10 那么每秒就是会放10个。
  • 第三个是 redis-rate-limiter.burstCapacity 桶容量,表示一共有多少个令牌,可以理解为最大的QPS的数量。

key-resolve

限流算法的依据,也是限流中最重要的,要怎么去认为同时来的两个请求是不是同一个人发起的请求。
如果一个客户机去访问服务的时候,查看首页的时候是可以正常访问的,但是刚好就到了QPS顶峰了,点击按钮的时候会发现被限流了,这样对用户体验就不太好。
首先是需要实现一个 KeyResolver 的接口,然后重写 resolve方法,以下就是令牌桶算法进行限流的同时通过hostname进行区分用户进行限流。

image.png