网关限流(令牌桶算法)
生活随笔
收集整理的這篇文章主要介紹了
网关限流(令牌桶算法)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
一、需求:
每個ip地址1秒內只能發送1次請求,多出來的請求返回429錯誤。
二、引入依賴
spring cloud gateway 默認使用redis的RateLimter限流算法來實現。所以我們要使用首先需要引入redis的依賴
<!--redis--> <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis-reactive</artifactId><version>2.1.3.RELEASE</version> </dependency>三、定義KeyResolver
//定義一個KeyResolver@Beanpublic KeyResolver ipKeyResolver(){return new KeyResolver() {@Overridepublic Mono<String> resolve(ServerWebExchange exchange) {//獲取訪問者的ip地址, 通過訪問者ip地址進行限流, 限流使用的是Redis中的令牌桶算法String hostString = exchange.getRequest().getRemoteAddress().getHostString();return Mono.just(hostString);}};}四、application.yml
spring:application:name: sysgatewaycloud:gateway:globalcors:cors-configurations:'[/**]': # 匹配所有請求allowedOrigins: "*" #跨域處理 允許所有的域allowedMethods: # 支持的方法- GET- POST- PUT- DELETEroutes:#是指的兩個服務- id: goodsuri: lb://goodspredicates:- Path=/goods/**filters:- StripPrefix= 1- name: RequestRateLimiter #請求數限流 名字不能隨便寫args:key-resolver: "#{@ipKeyResolver}"redis-rate-limiter.replenishRate: 1 #令牌桶每秒填充平均速率redis-rate-limiter.burstCapacity: 1 #令牌桶總容量- id: systemuri: lb://systempredicates:- Path=/system/**filters:- StripPrefix= 1# 配置Redis 127.0.0.1可以省略配置redis:host: 192.168.200.128port: 6379 server:port: 9101 eureka:client:service-url:defaultZone: http://127.0.0.1:6868/eurekainstance:prefer-ip-address: true - burstCapacity:令牌桶總容量。 - replenishRate:令牌桶每秒填充平均速率。 - key-resolver:用于限流的鍵的解析器的 Bean 對象的名字。它使用 SpEL 表達式根據#{@beanName}從 Spring 容器中獲取 Bean 對象。通過在replenishRate和中設置相同的值來實現穩定的速率burstCapacity。設置burstCapacity高于時,可以允許臨時突發replenishRate。在這種情況下,需要在突發之間允許速率限制器一段時間(根據replenishRate),因為2次連續突發將導致請求被丟棄(HTTP 429 - Too Many Requests)key-resolver: "#{@userKeyResolver}" 用于通過SPEL表達式來指定使用哪一個KeyResolver.如上配置:表示 一秒內,允許 一個請求通過,令牌桶的填充速率也是一秒鐘添加一個令牌。最大突發狀況 也只允許 一秒內有一次請求,可以根據業務來調整 。五、測試結果
總結
以上是生活随笔為你收集整理的网关限流(令牌桶算法)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 光合作用的五大应用
- 下一篇: BCrypt管理员登录密码验证