Spring Cloud Zuul RateLimit項目Github地址:git
https://github.com/marcosbarbero/spring-cloud-zuul-ratelimitgithub
該包實現了在Zuul對每一個服務進行限流。提供的幾種限流方式:spring
1. 認證用戶(Authenticated User)api
使用已認證的用戶名(username)或'anonymous'post
2. 原始請求(Request Origin)測試
使用用戶的原始請求url
3. URL3d
使用上游請求的地址代理
4. 針對每一個服務的全局配置orm
該方式不會驗證Request Origin,Authenticated User或URL
使用該方式只需不設置‘type’參數便可
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 #對應用來標識請求的key的前綴
enabled: true
repository: REDIS #對應存儲類型(用來存儲統計信息)
behind-proxy: true #代理以後
default-policy: #可選 - 針對全部的路由配置的策略,除非特別配置了policies
limit: 10 #可選 - 每一個刷新時間窗口對應的請求數量限制
quota: 1000 #可選- 每一個刷新時間窗口對應的請求時間限制(秒)
refresh-interval: 60 # 刷新時間窗口的時間,默認值 (秒)
type: #可選 限流方式
- user
- origin
- url
policies:
myServiceId: #特定的路由
limit: 10 #可選- 每一個刷新時間窗口對應的請求數量限制
quota: 1000 #可選- 每一個刷新時間窗口對應的請求時間限制(秒)
refresh-interval: 60 # 刷新時間窗口的時間,默認值 (秒)
type: #可選 限流方式
- user
- origin
- url
配置命名空間:zuul.ratelimit
說明:使用不一樣的repository,須要在pom中加入相關的依賴包。
Policy屬性:
1. 啓動一個Zuul服務和一個API服務,配置正常的路由規則。訪問API:
2. 按照上面的使用方式,從新啓動配置有RateLimit的Zuul。相關配置:
3. 在postman中集中運行12次相同的API調用,結果中有兩次調用返回429:
4. 查看對應的Response Headers和Body的信息:
若是但願本身控制key的策略,能夠經過自定義RateLimitKeyGenerator的實現來增長本身的策略邏輯。
實例:
根據請求上的參數來對請求進行限流。好比有一個請求是http://localhost:8765/api-a//hello2?name=kevin,對相同的name值進行限流。咱們設置了1分鐘內,限流10次,那麼若是1分鐘內,name是kevin的請求超過10次,就會發生限流。
RateLimitKeyGenerator的實現:
測試
同時發送13個請求,其中name=kevin的有11次,name=marry的有2次,測試結果以下: