这篇文章上次修改于 2172 天前,可能其部分内容已经发生变化,如有疑问可询问作者。 ### spring cloud gateway 自带了个限流器filter,就是RequestRateLimiter,可以使用令牌桶算法来限流 #### 先说下令牌桶算法,就是:每秒向令牌桶放N个令牌,令牌桶的最大容积是M个,那么如果请求过来了,会从令牌桶中拿出一个令牌,令牌桶还剩M-1个。以此类推,当令牌桶的数量还剩0个的时候,就拒绝接受请求。所以这个情况可以支持突发性的请求情况。就是我一致很小量的请求,但是突然来了一大波请求,令牌桶容积决定了它能接受的最大突发情况。 ### 首先看下spring cloud gateway的配置,注意要用到redis ```xml - id: lb2thorquest uri: lb://THORQUEST order: 9999 predicates: - Host=10.1.0.75:9001 filters: - name: RequestRateLimiter args: redis-rate-limiter.replenishRate: 1 # 令牌桶放入的速度 redis-rate-limiter.burstCapacity: 3 # 令牌桶的容积 key-resolver: "#{@remoteAddrKeyResolver}" #SPEL表达式去的对应的bean redis: host: 10.10.2.175 port: 6379 database: 5 ``` 引入redis ``` xml org.springframework.boot spring-boot-starter-data-redis-reactive ``` ### 这个key resolver会生成一个key,为这个key生成一个令牌桶。如果是客户端ip,那么就是为每个ip生成一个令牌桶。如果是个固定值,就是全局的令牌桶。 ```java @Bean KeyResolver remoteAddrKeyResolver() { return exchange -> Mono.just(Objects.requireNonNull(exchange.getRequest().getRemoteAddress()).getHostName()); } ``` 那么使劲刷新url,出现429 too many request 就表示成功了,
没有评论