欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

spring?cloud?gateway限流常見算法實(shí)現(xiàn)

 更新時(shí)間:2025年02月21日 09:08:01   作者:敲代碼的小王!  
本文主要介紹了spring?cloud?gateway限流常見算法實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

前言:

我們在很多時(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)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java中關(guān)于優(yōu)先隊(duì)列PriorityQueue的使用及相關(guān)方法

    Java中關(guān)于優(yōu)先隊(duì)列PriorityQueue的使用及相關(guān)方法

    這篇文章主要介紹了Java中關(guān)于優(yōu)先隊(duì)列PriorityQueue的使用及相關(guān)方法,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-08-08
  • SkyWalking?自定義插件(Spring?RabbitMQ)具體分析過程

    SkyWalking?自定義插件(Spring?RabbitMQ)具體分析過程

    這篇文章主要介紹了SkyWalking?自定義插件(Spring?RabbitMQ)具體分析過程,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-02-02
  • JDK9的新特性之String壓縮和字符編碼的實(shí)現(xiàn)方法

    JDK9的新特性之String壓縮和字符編碼的實(shí)現(xiàn)方法

    這篇文章主要介紹了JDK9的新特性之String壓縮和字符編碼的實(shí)現(xiàn)方法,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-05-05
  • 掌握模塊化開發(fā)Spring Boot子模塊使用技巧

    掌握模塊化開發(fā)Spring Boot子模塊使用技巧

    這篇文章主要為大家介紹了掌握模塊化開發(fā)Spring Boot子模塊使用技巧詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-06-06
  • Java 替換字符串右側(cè)出現(xiàn)的第一個(gè)子串方式

    Java 替換字符串右側(cè)出現(xiàn)的第一個(gè)子串方式

    這篇文章主要介紹了Java 替換字符串右側(cè)出現(xiàn)的第一個(gè)子串方式,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-08-08
  • Dubbo+Nacos服務(wù)啟動(dòng)報(bào)錯(cuò),返回unknown user的問題

    Dubbo+Nacos服務(wù)啟動(dòng)報(bào)錯(cuò),返回unknown user的問題

    這篇文章主要介紹了Dubbo+Nacos服務(wù)啟動(dòng)報(bào)錯(cuò),返回unknown user的問題,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-09-09
  • MyBatis-Plus非表字段的三種處理方法小結(jié)

    MyBatis-Plus非表字段的三種處理方法小結(jié)

    這篇文章主要介紹了MyBatis-Plus非表字段的三種處理方法小結(jié),具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-08-08
  • Jdbctemplate多數(shù)據(jù)源配置方法詳解

    Jdbctemplate多數(shù)據(jù)源配置方法詳解

    這篇文章主要介紹了Jdbctemplate多數(shù)據(jù)源配置方法詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-06-06
  • Java數(shù)據(jù)結(jié)構(gòu)最清晰圖解二叉樹前 中 后序遍歷

    Java數(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
  • Java解釋器的運(yùn)行過程介紹

    Java解釋器的運(yùn)行過程介紹

    今天小編就為大家分享一篇關(guān)于Java解釋器的運(yùn)行過程介紹,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧
    2019-04-04

最新評論