微服务网关限流讲解
使用令牌桶進行請求次數限流
spring cloud gateway 默認使用redis的RateLimter限流算法來實現。所以我們要使用首先需要引入redis的依賴
(1)引入redis依賴
在gateway的pom.xml中引入redis的依賴
<!--redis--> <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis-reactive</artifactId><version>2.1.3.RELEASE</version> </dependency>(2)定義KeyResolver
在Applicatioin引導類中添加如下代碼,KeyResolver用于計算某一個類型的限流的KEY也就是說,可以通過KeyResolver來指定限流的Key。
我們可以根據IP來限流,比如每個IP每秒鐘只能請求一次,在GatewayWebApplication定義key的獲取,獲取客戶端IP,將IP作為key,如下代碼:
/**** IP限流* @return*/ @Bean(name="ipKeyResolver") public KeyResolver userKeyResolver() {return new KeyResolver() {@Overridepublic Mono<String> resolve(ServerWebExchange exchange) {//獲取遠程客戶端IPString hostName = exchange.getRequest().getRemoteAddress().getAddress().getHostAddress();System.out.println("hostName:"+hostName);return Mono.just(hostName);}}; }配置代碼如下:
spring:cloud:gateway:globalcors:corsConfigurations:'[/**]': # 匹配所有請求allowedOrigins: "*" #跨域處理 允許所有的域allowedMethods: # 支持的方法- GET- POST- PUT- DELETEroutes:- id: goods_routeuri: lb://goodspredicates:- Path=/api/brand**filters:- StripPrefix=1- name: RequestRateLimiter #請求數限流 名字不能隨便寫 ,使用默認的facatoryargs:key-resolver: "#{@ipKeyResolver}"redis-rate-limiter.replenishRate: 1redis-rate-limiter.burstCapacity: 1application:name: gateway-web#Redis配置redis:host: 192.168.211.132port: 6379server:port: 8001 eureka:client:service-url:defaultZone: http://127.0.0.1:7001/eurekainstance:prefer-ip-address: true management:endpoint:gateway:enabled: trueweb:exposure:include: true解釋:
redis-rate-limiter.replenishRate是您希望允許用戶每秒執行多少請求,而不會丟棄任何請求。這是令牌桶填充的速率
redis-rate-limiter.burstCapacity是指令牌桶的容量,允許在一秒鐘內完成的最大請求數,將此值設置為零將阻止所有請求。
key-resolver: "#{@ipKeyResolver}" 用于通過SPEL表達式來指定使用哪一個KeyResolver.
如上配置:
表示 一秒內,允許 一個請求通過,令牌桶的填充速率也是一秒鐘添加一個令牌。
最大突發狀況 也只允許 一秒內有一次請求,可以根據業務來調整 。
?
多次請求會發生如下情況
?
總結
- 上一篇: 令牌桶实现限流原理
- 下一篇: 用户微服务表结构介绍