Zuul上實現(xiàn)限流(spring-cloud-zuul-ratelimit)

簡述

Spring Cloud Zuul RateLimit項目Github地址:

https://github.com/marcosbarbero/spring-cloud-zuul-ratelimit

該包實現(xiàn)了在Zuul對每個服務(wù)進行限流。提供的幾種限流方式:

1. 認證用戶(Authenticated User)

使用已認證的用戶名(username)或'anonymous'

2. 原始請求(Request Origin)

使用用戶的原始請求

3. URL

使用上游請求的地址

4. 針對每個服務(wù)的全局配置

該方式不會驗證Request Origin,Authenticated User或URL

使用該方式只需不設(shè)置‘type’參數(shù)即可


使用方式

pom.xml增加依賴:

<dependency>

? ? ? <groupId>com.marcosbarbero.cloud</groupId>

? ? ? <artifactId>spring-cloud-zuul-ratelimit</artifactId>

? ? ? <version>1.3.2.RELEASE</version>

</dependency>

配置示例:

zuul:

? ? ratelimit:

? ? ? ? key-prefix: your-prefix ?#對應(yīng)用來標識請求的key的前綴

? ? ? ? enabled: true

? ? ? ? repository: REDIS ?#對應(yīng)存儲類型(用來存儲統(tǒng)計信息)

? ? ? ? behind-proxy: true ?#代理之后

? ? ? ? default-policy: #可選 - 針對所有的路由配置的策略,除非特別配置了policies

? ? ? ? ? ? ?limit: 10 #可選 - 每個刷新時間窗口對應(yīng)的請求數(shù)量限制

? ? ? ? ? ? ?quota: 1000 #可選- ?每個刷新時間窗口對應(yīng)的請求時間限制(秒)

? ? ? ? ? ? ? refresh-interval: 60 # 刷新時間窗口的時間,默認值 (秒)

? ? ? ? ? ? ? ?type: #可選 限流方式

? ? ? ? ? ? ? ? ? ? - user

? ? ? ? ? ? ? ? ? ? - origin

? ? ? ? ? ? ? ? ? ? - url

? ? ? ? ? policies:

? ? ? ? ? ? ? ? myServiceId: #特定的路由

? ? ? ? ? ? ? ? ? ? ? limit: 10 #可選- 每個刷新時間窗口對應(yīng)的請求數(shù)量限制

? ? ? ? ? ? ? ? ? ? ? quota: 1000 #可選-? 每個刷新時間窗口對應(yīng)的請求時間限制(秒)

? ? ? ? ? ? ? ? ? ? ? refresh-interval: 60 # 刷新時間窗口的時間,默認值 (秒)

? ? ? ? ? ? ? ? ? ? ? type: #可選 限流方式

? ? ? ? ? ? ? ? ? ? ? ? ? - user

? ? ? ? ? ? ? ? ? ? ? ? ? - origin

? ? ? ? ? ? ? ? ? ? ? ? ? - url

通用應(yīng)用程序配置

配置命名空間:zuul.ratelimit

說明:使用不同的repository,需要在pom中加入相關(guān)的依賴包。

Policy屬性:


測試

1. 啟動一個Zuul服務(wù)和一個API服務(wù),配置正常的路由規(guī)則。訪問API:

2. 按照上面的使用方式,重新啟動配置有RateLimit的Zuul。相關(guān)配置:

3. 在postman中集中運行12次相同的API調(diào)用,結(jié)果中有兩次調(diào)用返回429:

4. 查看對應(yīng)的Response Headers和Body的信息:

自定義Key策略

如果希望自己控制key的策略,可以通過自定義RateLimitKeyGenerator的實現(xiàn)來增加自己的策略邏輯。

實例:

根據(jù)請求上的參數(shù)來對請求進行限流。比如有一個請求是http://localhost:8765/api-a//hello2?name=kevin,對相同的name值進行限流。我們設(shè)置了1分鐘內(nèi),限流10次,那么如果1分鐘內(nèi),name是kevin的請求超過10次,就會發(fā)生限流。

RateLimitKeyGenerator的實現(xiàn):

測試

同時發(fā)送13個請求,其中name=kevin的有11次,name=marry的有2次,測試結(jié)果如下:

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容