微服务网关限流讲解
使用令牌桶進(jìn)行請(qǐng)求次數(shù)限流
spring cloud gateway 默認(rèn)使用redis的RateLimter限流算法來實(shí)現(xiàn)。所以我們要使用首先需要引入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引導(dǎo)類中添加如下代碼,KeyResolver用于計(jì)算某一個(gè)類型的限流的KEY也就是說,可以通過KeyResolver來指定限流的Key。
我們可以根據(jù)IP來限流,比如每個(gè)IP每秒鐘只能請(qǐng)求一次,在GatewayWebApplication定義key的獲取,獲取客戶端IP,將IP作為key,如下代碼:
/**** IP限流* @return*/ @Bean(name="ipKeyResolver") public KeyResolver userKeyResolver() {return new KeyResolver() {@Overridepublic Mono<String> resolve(ServerWebExchange exchange) {//獲取遠(yuǎn)程客戶端IPString hostName = exchange.getRequest().getRemoteAddress().getAddress().getHostAddress();System.out.println("hostName:"+hostName);return Mono.just(hostName);}}; }配置代碼如下:
spring:cloud:gateway:globalcors:corsConfigurations:'[/**]': # 匹配所有請(qǐng)求allowedOrigins: "*" #跨域處理 允許所有的域allowedMethods: # 支持的方法- GET- POST- PUT- DELETEroutes:- id: goods_routeuri: lb://goodspredicates:- Path=/api/brand**filters:- StripPrefix=1- name: RequestRateLimiter #請(qǐng)求數(shù)限流 名字不能隨便寫 ,使用默認(rèn)的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是您希望允許用戶每秒執(zhí)行多少請(qǐng)求,而不會(huì)丟棄任何請(qǐng)求。這是令牌桶填充的速率
redis-rate-limiter.burstCapacity是指令牌桶的容量,允許在一秒鐘內(nèi)完成的最大請(qǐng)求數(shù),將此值設(shè)置為零將阻止所有請(qǐng)求。
key-resolver: "#{@ipKeyResolver}" 用于通過SPEL表達(dá)式來指定使用哪一個(gè)KeyResolver.
如上配置:
表示 一秒內(nèi),允許 一個(gè)請(qǐng)求通過,令牌桶的填充速率也是一秒鐘添加一個(gè)令牌。
最大突發(fā)狀況 也只允許 一秒內(nèi)有一次請(qǐng)求,可以根據(jù)業(yè)務(wù)來調(diào)整 。
?
多次請(qǐng)求會(huì)發(fā)生如下情況
?
總結(jié)
- 上一篇: 令牌桶实现限流原理
- 下一篇: 用户微服务表结构介绍