spring?cloud?gateway限流常見算法實(shí)現(xiàn)
前言:
我們在很多時(shí)候應(yīng)該會遇到一種情況吧,比如說某些秒殺類型的商品在搶購的時(shí)候,你明顯的感覺到這種情況,再例如大學(xué)生們應(yīng)該都經(jīng)歷過的一件事,那就是每個(gè)學(xué)期必須經(jīng)歷的選課,每當(dāng)選課開始的時(shí)候是不是總會刷新的時(shí)候一直進(jìn)不去,這也是做了限流的原因。
一、網(wǎng)關(guān)限流
1、限流的作用
1. 保護(hù)后端服務(wù)
網(wǎng)關(guān)限流可以有效地控制進(jìn)入系統(tǒng)的請求流量,避免后端服務(wù)因接收到過多的請求而過載或者崩潰。特別是在高并發(fā)場景下,后端系統(tǒng)的處理能力可能有限,限流可以確保請求不會超出后端服務(wù)的最大承載能力。
2. 保證服務(wù)質(zhì)量 (QoS)
通過限流,網(wǎng)關(guān)可以確保所有用戶或請求都有公平的機(jī)會訪問系統(tǒng)資源,避免某些用戶或請求因過度占用系統(tǒng)資源而影響其他正常用戶的體驗(yàn)。限流有助于平衡系統(tǒng)負(fù)載,避免部分突發(fā)請求導(dǎo)致服務(wù)質(zhì)量下降。
3. 避免濫用和惡意攻擊
限流能夠有效防止惡意用戶或爬蟲等非正常流量對系統(tǒng)的惡意攻擊。比如,針對DDoS攻擊(分布式拒絕服務(wù))或暴 力 破 解等惡意流量,網(wǎng)關(guān)通過限流可以限制每個(gè)IP或者每個(gè)用戶的請求次數(shù),從而防止系統(tǒng)被過載。
4. 減少資源浪費(fèi)
如果沒有限流,過多的請求可能會讓系統(tǒng)資源(如CPU、內(nèi)存、數(shù)據(jù)庫連接等)處于超負(fù)荷狀態(tài),導(dǎo)致資源浪費(fèi)或者資源耗盡。限流可以合理地限制請求數(shù)量,確保系統(tǒng)資源被有效利用,而不是被不必要的請求耗盡。
5. 提高系統(tǒng)可擴(kuò)展性和穩(wěn)定性
通過合理配置限流策略,網(wǎng)關(guān)能夠幫助系統(tǒng)平衡流量,確保系統(tǒng)穩(wěn)定運(yùn)行,避免因負(fù)載過高而發(fā)生宕機(jī)或性能瓶頸。通過動(dòng)態(tài)調(diào)整限流策略,還可以應(yīng)對不同流量波動(dòng),提高系統(tǒng)的可擴(kuò)展性。
6. 控制不同用戶的訪問頻率
網(wǎng)關(guān)可以根據(jù)不同用戶、IP地址或者API接口的不同需求配置不同的限流規(guī)則。比如,可以為VIP用戶提供更高的請求頻率限制,而普通用戶則可以設(shè)置更嚴(yán)格的限流規(guī)則。這有助于實(shí)現(xiàn)服務(wù)質(zhì)量差異化管理。
7. 提升用戶體驗(yàn)
通過限流,可以避免系統(tǒng)在流量高峰期間過載導(dǎo)致的請求失敗、響應(yīng)延遲等問題,從而提升用戶的體驗(yàn)。當(dāng)系統(tǒng)能夠持續(xù)穩(wěn)定響應(yīng)用戶請求時(shí),用戶滿意度會提高,且系統(tǒng)負(fù)載能夠保持在合理范圍。
8. 避免API濫用和負(fù)載過高
尤其在微服務(wù)架構(gòu)中,API網(wǎng)關(guān)起到至關(guān)重要的作用。通過限流,API網(wǎng)關(guān)能夠控制每個(gè)API接口的訪問頻率,防止某個(gè)API接口被頻繁調(diào)用導(dǎo)致的性能問題,確保整個(gè)系統(tǒng)的API接口資源合理分配。
9. 監(jiān)控與分析
限流機(jī)制還可以作為監(jiān)控的一部分,幫助運(yùn)營人員分析請求模式。通過記錄哪些請求被限流,系統(tǒng)可以更好地了解哪些用戶或哪些功能區(qū)域的負(fù)載較高,進(jìn)而優(yōu)化系統(tǒng)架構(gòu)或流量分配。
10. 避免系統(tǒng)崩潰
如果網(wǎng)關(guān)不進(jìn)行限流,系統(tǒng)在高并發(fā)流量下可能會因承載過多請求而崩潰,導(dǎo)致不可用。通過提前限制請求流量,網(wǎng)關(guān)可以有效避免這種情況,保持系統(tǒng)穩(wěn)定運(yùn)行。
2、網(wǎng)關(guān)限流的常見算法
1. 令牌桶算法 (Token Bucket)
令牌桶算法是最常見的限流算法之一,它通過控制請求的速率來實(shí)現(xiàn)限流。
- 工作原理:令牌桶會以固定的速率生成令牌,每當(dāng)一個(gè)請求到達(dá)時(shí),網(wǎng)關(guān)會檢查桶中是否有令牌。如果有,則允許請求通過,并且從桶中消耗一個(gè)令牌;如果沒有,則請求被拒絕或者等待令牌的生成。
- 優(yōu)點(diǎn):允許請求的突發(fā)流量,因?yàn)榱钆仆翱梢源鎯α钆?,支持請求的突發(fā)。
- 適用場景:適用于那些偶爾有突發(fā)流量的應(yīng)用,比如API接口。
2. 漏桶算法 (Leaky Bucket)
漏桶算法也常用于限流,其基本思想是控制流量的平均速率。
- 工作原理:漏桶算法使用一個(gè)固定大小的桶,當(dāng)請求到達(dá)時(shí),如果桶中有空間,則請求可以進(jìn)入桶中;如果桶已經(jīng)滿了,則新的請求會被丟棄。請求從桶中以固定速率“漏出”。
- 優(yōu)點(diǎn):防止突發(fā)流量導(dǎo)致系統(tǒng)過載,保證請求的流量是平穩(wěn)的。
- 適用場景:適用于希望平滑流量,避免突發(fā)流量影響系統(tǒng)的場景。
3. 計(jì)數(shù)器算法 (Counter-based)
計(jì)數(shù)器算法通過對請求計(jì)數(shù)并進(jìn)行周期性重置來實(shí)現(xiàn)限流。
- 工作原理:每次接收到請求時(shí),都會增加一個(gè)計(jì)數(shù)器的值,當(dāng)計(jì)數(shù)器達(dá)到預(yù)設(shè)的限制時(shí),新的請求將被拒絕。計(jì)數(shù)器會在一段時(shí)間后(如每秒、每分鐘)被重置為零。
- 優(yōu)點(diǎn):簡單易實(shí)現(xiàn)。
- 缺點(diǎn):可能存在短時(shí)間內(nèi)請求數(shù)過多的問題,特別是在請求突發(fā)時(shí)。
3、令牌桶算法在gateway中的具體實(shí)現(xiàn)
spring cloud gateway 默認(rèn)使用redis的RateLimter限流算法來實(shí)現(xiàn)。所以我們要使用首先需要引入redis的依賴。
<!--redis--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis-reactive</artifactId> <version>2.1.3.RELEASE</version> </dependency>
在GatewayApplicatioin引導(dǎo)類中添加如下代碼,KeyResolver用于計(jì)算某一個(gè)類型的限流的KEY也就是說,可以通過KeyResolver來指定限流的Key。
//定義一個(gè)KeyResolver @Bean public KeyResolver ipKeyResolver() { return new KeyResolver() { @Override public Mono<String> resolve(ServerWebExchange exchange) { return Mono.just(exchange.getRequest().getRemoteAddress().getHostName()); } }; }
修改application.yml中配置項(xiàng),指定限制流量的配置以及REDIS的配置
spring: cloud: gateway: routes: - id: goods uri: lb://goods predicates: - Path=/goods/** filters: - StripPrefix= 1 - name: RequestRateLimiter #請求數(shù)限流 名字不能隨便寫 args: key-resolver: "#{@ipKeyResolver}" redis-rate-limiter.replenishRate: 1 #令牌桶每秒填充平均速率 redis-rate-limiter.burstCapacity: 1 #令牌桶總?cè)萘? redis: host: 192.168.200.128 #自己redis的ip和端口以及密碼配置 port: 6379
解釋:
- burstCapacity:令牌桶總?cè)萘俊?/li>
- replenishRate:令牌桶每秒填充平均速率。
- key-resolver:用于限流的鍵的解析器的 Bean 對象的名字。它使用 SpEL 表達(dá)式根據(jù)#{@beanName}從 Spring 容器中獲取 Bean 對象。
通過在replenishRate
和中設(shè)置相同的值來實(shí)現(xiàn)穩(wěn)定的速率burstCapacity
。設(shè)置burstCapacity
高于時(shí),可以允許臨時(shí)突發(fā)replenishRate
。在這種情況下,需要在突發(fā)之間允許速率限制器一段時(shí)間(根據(jù)replenishRate
),因?yàn)?次連續(xù)突發(fā)將導(dǎo)致請求被丟棄(HTTP 429 - Too Many Requests
)key-resolver: "#{@userKeyResolver}" 用于通過SPEL表達(dá)式來指定使用哪一個(gè)KeyResolver.
如上配置:
表示 一秒內(nèi),允許 一個(gè)請求通過,令牌桶的填充速率也是一秒鐘添加一個(gè)令牌。最大突發(fā)狀況 也只允許 一秒內(nèi)有一次請求,可以根據(jù)業(yè)務(wù)來調(diào)整 。
在做好以上的所有配置之后,當(dāng)你再次訪問具體的微服務(wù)的時(shí)候,如果你訪問的請求超過了每秒1個(gè)的速度,那么你就會被限流,頁面會顯示429錯(cuò)誤。如圖所示:
到此這篇關(guān)于spring cloud gateway限流常見算法實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)spring cloud gateway限流內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Spring Cloud服務(wù)入口Gateway的介紹和使用問題小結(jié)
- Spring Boot 3 整合 Spring Cloud Gateway實(shí)踐過程
- SpringCloud的網(wǎng)關(guān)Zuul和Gateway詳解
- SpringCloud Zuul和Gateway的實(shí)例代碼(搭建方式)
- 一文掌握spring cloud gateway(總結(jié)篇)
- SpringCloudGateway 網(wǎng)關(guān)登錄校驗(yàn)實(shí)現(xiàn)思路
- Spring?Cloud?Gateway服務(wù)網(wǎng)關(guān)限流問題及解決
相關(guān)文章
Java中關(guān)于優(yōu)先隊(duì)列PriorityQueue的使用及相關(guān)方法
這篇文章主要介紹了Java中關(guān)于優(yōu)先隊(duì)列PriorityQueue的使用及相關(guān)方法,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-08-08SkyWalking?自定義插件(Spring?RabbitMQ)具體分析過程
這篇文章主要介紹了SkyWalking?自定義插件(Spring?RabbitMQ)具體分析過程,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-02-02JDK9的新特性之String壓縮和字符編碼的實(shí)現(xiàn)方法
這篇文章主要介紹了JDK9的新特性之String壓縮和字符編碼的實(shí)現(xiàn)方法,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-05-05Java 替換字符串右側(cè)出現(xiàn)的第一個(gè)子串方式
這篇文章主要介紹了Java 替換字符串右側(cè)出現(xiàn)的第一個(gè)子串方式,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-08-08Dubbo+Nacos服務(wù)啟動(dòng)報(bào)錯(cuò),返回unknown user的問題
這篇文章主要介紹了Dubbo+Nacos服務(wù)啟動(dòng)報(bào)錯(cuò),返回unknown user的問題,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-09-09MyBatis-Plus非表字段的三種處理方法小結(jié)
這篇文章主要介紹了MyBatis-Plus非表字段的三種處理方法小結(jié),具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-08-08Jdbctemplate多數(shù)據(jù)源配置方法詳解
這篇文章主要介紹了Jdbctemplate多數(shù)據(jù)源配置方法詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-06-06Java數(shù)據(jù)結(jié)構(gòu)最清晰圖解二叉樹前 中 后序遍歷
樹是一種重要的非線性數(shù)據(jù)結(jié)構(gòu),直觀地看,它是數(shù)據(jù)元素(在樹中稱為結(jié)點(diǎn))按分支關(guān)系組織起來的結(jié)構(gòu),很象自然界中的樹那樣。樹結(jié)構(gòu)在客觀世界中廣泛存在,如人類社會的族譜和各種社會組織機(jī)構(gòu)都可用樹形象表示2022-01-01