概念
??????? 關(guān)于微服務(wù)網(wǎng)關(guān)Gateway中有幾十種過(guò)濾工廠(chǎng),這一篇博文記錄的是關(guān)于請(qǐng)求限流過(guò)濾工廠(chǎng),也就是標(biāo)題中的RequestRateLimiterGatewayFilterFactory。這個(gè)路由過(guò)濾工廠(chǎng)是用來(lái)判斷當(dāng)前請(qǐng)求是否應(yīng)該被處理,如果不會(huì)被處理就會(huì)返回HTTP狀態(tài)碼為429的code。接下來(lái)構(gòu)建兩個(gè)模塊,其中一個(gè)是服務(wù)模塊,一個(gè)是網(wǎng)關(guān)模塊來(lái)測(cè)試關(guān)于請(qǐng)求過(guò)濾工廠(chǎng)是否生效。
服務(wù)
引入依賴(lài)
<dependencies>
<!-- 由于僅是測(cè)試 于是無(wú)需多引入微服務(wù)相關(guān)依賴(lài) -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
修改yml配置
server:
port: 8081
spring:
application:
name: cloud-demo
接口路徑
@RestController
@RequestMapping("/filter")
public class RateLimiterFilterController {
@GetMapping("/requestRateLimiter")
public String requestRateLimiter() {
return "進(jìn)入了限流方法";
}
}
網(wǎng)關(guān)
引入依賴(lài)
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<!-- 網(wǎng)關(guān) 需要注意的是網(wǎng)關(guān)中不要引入spring-boot-starter-web 否則啟動(dòng)報(bào)錯(cuò) -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
<version>2.2.0.RELEASE</version>
</dependency>
<!-- Redis RateLimiter -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis-reactive</artifactId>
</dependency>
修改yml配置
server:
port: 8080
spring:
application:
name: cloud-gateway
redis:
host: IP
port: 端口
password: 密碼
cloud:
gateway:
routes:
- id: request-rate-limiter-route
uri: http://127.0.0.1:8081
predicates:
- Path=/filter/requestRateLimiter/**
filters:
# 需要注意的是Redis要在5.x以上才會(huì)生效 并且有密碼情況下需要配置正確
- name: RequestRateLimiter
args:
# 對(duì)應(yīng)的限流路由判斷
key-resolver: "#{@userKeyResolver}"
# 每秒生成的令牌數(shù)
redis-rate-limiter.replenishRate: 2
# 高并發(fā)情況下將每秒生成的令牌數(shù)增加的個(gè)數(shù) 即 replenishRate + burstCapacity
redis-rate-limiter.burstCapacity: 2
# 每個(gè)請(qǐng)求消耗的令牌個(gè)數(shù)
redis-rate-limiter.requestedTokens: 2
接口
@Configuration
public class FilterConfig {
@Bean
public KeyResolver userKeyResolver() {
// getFirst()是獲取MultiValueMap中的第一個(gè)key中的值 因?yàn)檫@個(gè)MultiValueMap不會(huì)產(chǎn)生key沖突導(dǎo)致value覆蓋的問(wèn)題
return exchange -> Mono.just(exchange.getRequest().getQueryParams().getFirst("user"));
}
}
測(cè)試
??????? 輸入:http://localhost:8080/filter/requestRateLimiter是無(wú)法訪(fǎng)問(wèn)的。因?yàn)樵贔ilterConfig配置類(lèi)中配置了userKeyResolver這個(gè)組件,所以需要在路徑上添加user參數(shù)。
??????? 輸入:http://localhost:8080/filter/requestRateLimiter?user=xxx可以正常訪(fǎng)問(wèn)的,但是把刷新的速率加快,直接報(bào)了以下的錯(cuò)誤,如果沒(méi)有報(bào)錯(cuò)也沒(méi)有顯示文本的,F(xiàn)12也可以看到路徑429錯(cuò)誤碼,這就是一開(kāi)始所說(shuō)的請(qǐng)求過(guò)多此過(guò)濾工廠(chǎng)會(huì)報(bào)429HTTP狀態(tài)碼的問(wèn)題。
??????? 當(dāng)然,既然這個(gè)過(guò)濾工廠(chǎng)需要配置Redis,那么就一定會(huì)需要在Redis中存儲(chǔ)數(shù)據(jù)。打開(kāi)Redis可視化工具可以發(fā)現(xiàn),因?yàn)槲覜](méi)有指定存儲(chǔ)的庫(kù),所以默認(rèn)在0數(shù)據(jù)庫(kù)中,會(huì)被存儲(chǔ)兩個(gè)值。
????????一個(gè)為request_rate_limiter.(user名稱(chēng)).timestamp,另一個(gè)為request_rate_limiter.(user名稱(chēng)).tokens。這之后就是涉及到源碼的閱讀,本篇博文并不會(huì)介紹源碼,但后續(xù)會(huì)更新自定義路由過(guò)濾工廠(chǎng)。
文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-723767.html
文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-723767.html
到了這里,關(guān)于【Spring Cloud】網(wǎng)關(guān)Gateway的請(qǐng)求過(guò)濾工廠(chǎng)RequestRateLimiterGatewayFilterFactory的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!