Spring Cloud Gateway不同頻率限流的解決方案(每分鐘,每小時,每天)
SpringCloud Gateway 簡介
SpringCloud Gateway 是 Spring Cloud 的一個全新專案,該專案是基於 Spring 5.0,Spring Boot 2.0 和 Project Reactor 等技術開發的閘道器,它旨在為微服務架構提供一種簡單有效的統一的 API 路由管理方式。
SpringCloud Gateway 作為 Spring Cloud 生態系統中的閘道器,目標是替代 Zuul,在Spring Cloud 2.0以上版本中,沒有對新版本的Zuul 2.0以上最新高效能版本進行整合,仍然還是使用的Zuul 2.0之前的非Reactor模式的老版本。而為了提升閘道器的效能,SpringCloud Gateway是基於WebFlux框架實現的,而WebFlux框架底層則使用了高效能的Reactor模式通訊框架Netty。
Spring Cloud Gateway 的目標,不僅提供統一的路由方式,並且基於 Filter 鏈的方式提供了閘道器基本的功能,例如:安全,監控/指標,和限流。
提前宣告:Spring Cloud Gateway 底層使用了高效能的通訊框架Netty。
SpringCloud Gateway 特徵
SpringCloud官方,對SpringCloud Gateway 特徵介紹如下:
(1)基於 Spring Framework 5,Project Reactor 和 Spring Boot 2.0
(2)整合 Hystrix 斷路器
(3)整合 Spring Cloud DiscoveryClient
(4)Predicates 和 Filters 作用於特定路由,易於編寫的 Predicates 和 Filters
(5)具備一些閘道器的高階功能:動態路由、限流、路徑重寫
從以上的特徵來說,和Zuul的特徵差別不大。SpringCloud Gateway和Zuul主要的區別,還是在底層的通訊框架上。
簡單說明一下上文中的三個術語:
(1)Filter(過濾器):
和Zuul的過濾器在概念上類似,可以使用它攔截和修改請求,並且對上游的響應,進行二次處理。過濾器為org.springframework.cloud.gateway.filter.GatewayFilter類的例項。
(2)Route(路由):
閘道器配置的基本組成模組,和Zuul的路由配置模組類似。一個Route模組由一個 ID,一個目標 URI,一組斷言和一組過濾器定義。如果斷言為真,則路由匹配,目標URI會被訪問。
(3)Predicate(斷言):
這是一個 Java 8 的 Predicate,可以使用它來匹配來自 HTTP 請求的任何內容,例如 headers 或引數。斷言的輸入型別是一個 ServerWebExchange。
正文
在使用SCG限流功能時,預設情況下是按秒限流,即一秒允許多少個請求,現需要根據不同時間頻率進行限流,即限制每分鐘、每小時或者每天限流。
分析
SCG的限流使用的guava的ratelimiter工具,令牌桶模式,引數包括以下3個:
- replenishRate: 每次補充令牌數量
- burstCapacity: 令牌桶最大容量,突發請求數量
- requestedTokens: 每次請求消耗令牌的數量
使用方案
每秒限制請求1次
- name: RequestRateLimiter #基於redis漏斗限流 args: key-resolver: "#{@myResolver}" redis-rate-limiter: replenishRate: 1 burstCapacity: 1 requestedTokens: 1
每秒限制請求10次
- name: RequestRateLimiter #基於redis漏斗限流 args: key-resolver: "#{@myResolver}" redis-rate-limiter: replenishRate: 10 burstCapacity: 10 requestedTokens: 1
每分鐘限制請求1次
- name: RequestRateLimiter #基於redis漏斗限流 args: key-resolver: "#{@myResolver}" redis-rate-limiter: replenishRate: 1 burstCapacity: 60 requestedTokens: 60
每分鐘限制請求10次
- name: RequestRateLimiter #基於redis漏斗限流 args: key-resolver: "#{@myResolver}" redis-rate-limiter: replenishRate: 1 burstCapacity: 60 requestedTokens: 6
每小時限制請求1次
- name: RequestRateLimiter #基於redis漏斗限流 args: key-resolver: "#{@myResolver}" redis-rate-limiter: replenishRate: 1 burstCapacity: 3600 requestedTokens: 3600
每小時限制請求10次
- name: RequestRateLimiter #基於redis漏斗限流 args: key-resolver: "#{@myResolver}" redis-rate-limiter: replenishRate: 1 burstCapacity: 3600 requestedTokens: 360
其他頻率以此類推,調整三個引數即可。
到此這篇關於Spring Cloud Gateway不同頻率限流的解決方案(每分鐘,每小時,每天)的文章就介紹到這了,更多相關Spring Cloud Gateway限流內容請搜尋我們以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援我們!