亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

Spring Cloud Gateway限流實(shí)戰(zhàn)

stonezhu / 1349人閱讀

摘要:歡迎訪問我的歡迎訪問我的內(nèi)容所有原創(chuàng)文章分類匯總及配套源碼,涉及等本篇概覽本篇概覽本文是實(shí)戰(zhàn)系列的第八篇,經(jīng)過前面的學(xué)習(xí),咱們對(duì)過濾器已了解得差不多,今天來補(bǔ)全過濾器的最后一個(gè)版塊限流默認(rèn)的限流器是基于實(shí)現(xiàn)的,限流算法是大家熟悉的令牌桶關(guān)于

歡迎訪問我的GitHub

https://github.com/zq2599/blog_demos

內(nèi)容:所有原創(chuàng)文章分類匯總及配套源碼,涉及Java、Docker、Kubernetes、DevOPS等;

本篇概覽

  • 本文是《Spring Cloud Gateway實(shí)戰(zhàn)》系列的第八篇,經(jīng)過前面的學(xué)習(xí),咱們對(duì)過濾器已了解得差不多,今天來補(bǔ)全過濾器的最后一個(gè)版塊:限流(RequestRateLimiter )

  • 默認(rèn)的限流器是基于redis實(shí)現(xiàn)的,限流算法是大家熟悉的令牌桶(Token Bucket Algorithm),關(guān)于令牌捅的原理就不在此展開了,聰明的您看一眼下圖應(yīng)該就懂了:裝令牌的桶容量有限,例如最多20個(gè),令牌進(jìn)入桶的速度恒定(注意,這里是和漏桶算法的區(qū)別),例如每秒10個(gè),底部每個(gè)請(qǐng)求能拿到令牌才會(huì)被處理:

在這里插入圖片描述

RequestRateLimiter基本套路

  • 使用RequestRateLimiter過濾器的步驟非常簡(jiǎn)單:
  1. 準(zhǔn)備可用的redis
  2. maven或者gradle中添加依賴org.springframework.boot:spring-boot-starter-data-redis-reactive
  3. 確定按照什么維度限流,例如按照請(qǐng)求中的username參數(shù)限流,這是通過編寫KeyResolver接口的實(shí)現(xiàn)來完成的
  4. 配置application.yml文件,添加過濾器
  • 以上就是使用RequestRateLimiter過濾器的套路了,簡(jiǎn)單么?接下來,咱們先編碼再驗(yàn)證

源碼下載

名稱鏈接備注
項(xiàng)目主頁https://github.com/zq2599/blog_demos該項(xiàng)目在GitHub上的主頁
git倉(cāng)庫地址(https)https://github.com/zq2599/blog_demos.git該項(xiàng)目源碼的倉(cāng)庫地址,https協(xié)議
git倉(cāng)庫地址(ssh)git@github.com:zq2599/blog_demos.git該項(xiàng)目源碼的倉(cāng)庫地址,ssh協(xié)議
  • 這個(gè)git項(xiàng)目中有多個(gè)文件夾,本篇的源碼在spring-cloud-tutorials文件夾下,如下圖紅框所示:

在這里插入圖片描述

  • spring-cloud-tutorials文件夾下有多個(gè)子工程,本篇的代碼是gateway-requestratelimiter,如下圖紅框所示:

在這里插入圖片描述

準(zhǔn)備工作

  • 為了更好的演示Gateway的效果,在服務(wù)提供者provider-hello的代碼(Hello.java)中新增一個(gè)web接口,可以接受一個(gè)入?yún)ⅲ?/li>
    @GetMapping("/userinfo")    public String userInfo(@RequestParam("username") String username) {        return Constants.HELLO_PREFIX + " " + username + ", " + dateStr();    }
  • 后面的測(cè)試咱們就用上述接口;

編碼

  • 在父工程spring-cloud-tutorials之下新增子工程gateway-requestratelimiter,其pom.xml內(nèi)容如下,重點(diǎn)是org.springframework.boot:spring-boot-starter-data-redis-reactive
            spring-cloud-tutorials        com.bolingcavalry        1.0-SNAPSHOT        4.0.0    gateway-requestratelimiter                        com.bolingcavalry            common            ${project.version}                            org.springframework.cloud            spring-cloud-starter-gateway                            org.springframework.boot            spring-boot-starter-data-redis-reactive            
  • 配置文件application.yml,請(qǐng)注意RequestRateLimiter的幾個(gè)參數(shù),已經(jīng)用中文添加了詳細(xì)的注釋:
server:  #服務(wù)端口  port: 8081spring:  application:    name: circuitbreaker-gateway  # redis配置  redis:    host: 192.168.50.43    port: 6379  cloud:    gateway:      routes:        - id: path_route          uri: http://127.0.0.1:8082          predicates:            - Path=/hello/**          filters:            - name: RequestRateLimiter              args:              	# 令牌入桶的速度為每秒100個(gè),相當(dāng)于QPS                redis-rate-limiter.replenishRate: 100                # 桶內(nèi)能裝200個(gè)令牌,相當(dāng)于峰值,要注意的是:第一秒從桶內(nèi)能去200個(gè),但是第二秒只能取到100個(gè)了,因?yàn)槿胪八俣仁敲棵?00個(gè)                redis-rate-limiter.burstCapacity: 200                # 每個(gè)請(qǐng)求需要的令牌數(shù)                redis-rate-limiter.requestedTokens: 1
  • 指定限流維度的代碼CustomizeConfig.java,這里是根據(jù)請(qǐng)求參數(shù)username的值來限流的,假設(shè)真實(shí)請(qǐng)求中一半請(qǐng)求的username的等于Tom,另一半的username的等于Jerry,按照application.yml的配置,Tom的請(qǐng)求QPS為10,Jerry的QPS也是10:
package com.bolingcavalry.gateway.config;import org.springframework.cloud.gateway.filter.ratelimit.KeyResolver;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import reactor.core.publisher.Mono;import java.util.Objects;@Configurationpublic class CustomizeConfig {    @Bean    KeyResolver userKeyResolver() {        return exchange -> Mono.just(exchange.getRequest().getQueryParams().getFirst("username"));    }}
  • 毫無營(yíng)養(yǎng)的啟動(dòng)類RequestRateLimiterApplication.java:
package com.bolingcavalry.gateway;import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplicationpublic class RequestRateLimiterApplication {    public static void main(String[] args) {        SpringApplication.run(RequestRateLimiterApplication.class,args);    }}
  • 代碼寫完了,接下來開始驗(yàn)證;

驗(yàn)證(桶容量等于入桶速度)

  • 首先驗(yàn)證的是桶容量等于入桶速度時(shí)的效果,請(qǐng)修改gateway-requestratelimiter應(yīng)用的application.yml中文件,使得redis-rate-limiter.replenishRate和redis-rate-limiter.burstCapacity的值都等于100,也就是說桶的大小等于100,每秒放入的令牌數(shù)也是100

  • 確保redis已經(jīng)啟動(dòng),并且與application.yml中的配置保持一直

  • 啟動(dòng)nacos(provider-hello依賴)

  • 啟動(dòng)服務(wù)提供者provider-hello

  • 啟動(dòng)gateway-requestratelimiter

  • 為了模擬web請(qǐng)求,我這里使用了Apache Benchmark,windows版本的下載地址:
    https://www.apachelounge.com/download/VS16/binaries/httpd-2.4.48-win64-VS16.zip

  • 上述文件下載解壓后即可使用,在控制臺(tái)進(jìn)入Apache24/bin后執(zhí)行以下命令,意思是向指定地址發(fā)送10000個(gè)請(qǐng)求,并發(fā)數(shù)為2:

ab -n 10000  -c 2 http://localhost:8081/hello/userinfo?username=Tom
  • 控制臺(tái)輸出如下,可見不到八秒的時(shí)間,只成功了800個(gè),證明限流符合預(yù)期:

在這里插入圖片描述

驗(yàn)證(桶容量大于入桶速度)

  • 接下來試試桶容量大于入桶速度時(shí)的限流效果,這對(duì)于我們控制峰值響應(yīng)有很重要的參考價(jià)值

  • 請(qǐng)修改gateway-requestratelimiter應(yīng)用的application.yml中文件,redis-rate-limiter.replenishRate維持100不變,但是redis-rate-limiter.burstCapacity改成200,也就是說每秒放入的令牌數(shù)還是100,但桶的容量翻倍了

  • 重啟應(yīng)用gateway-requestratelimiter

  • 再次執(zhí)行以下命令,意思是向指定地址發(fā)送10000個(gè)請(qǐng)求,并發(fā)數(shù)為2:

ab -n 10000  -c 2 http://localhost:8081/hello/userinfo?username=Tom
  • 測(cè)試結(jié)果如下圖,可見符合預(yù)期,可以將桶內(nèi)令牌全部用掉,以支撐峰值超過QPS的場(chǎng)景:

在這里插入圖片描述

驗(yàn)證(根據(jù)username的維度限流)

  • 接下來驗(yàn)證限流的維度,究竟是不是按照請(qǐng)求參數(shù)username的值來限流的

  • 咱們打開兩個(gè)命令行,同時(shí)發(fā)送請(qǐng)求(動(dòng)作要快),第一個(gè)的username等于Tom,第二個(gè)等于Jerry,理論上推測(cè),如果都是8秒內(nèi)完成,那么每個(gè)命令都有900個(gè)請(qǐng)求能成功

  • 測(cè)試結(jié)果如下圖,可見符合預(yù)期,每個(gè)username用的是自己的令牌:

在這里插入圖片描述

  • 至此,Spring Cloud Gateway限流實(shí)戰(zhàn)已經(jīng)完成,如此簡(jiǎn)單易用的限流方案,希望能給您的學(xué)習(xí)和使用帶來參考

你不孤單,欣宸原創(chuàng)一路相伴

  1. Java系列
  2. Spring系列
  3. Docker系列
  4. kubernetes系列
  5. 數(shù)據(jù)庫+中間件系列
  6. DevOps系列

歡迎關(guān)注公眾號(hào):程序員欣宸

微信搜索「程序員欣宸」,我是欣宸,期待與您一同暢游Java世界...
https://github.com/zq2599/blog_demos

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/124538.html

相關(guān)文章

  • Spring Cloud Gateway 擴(kuò)展支持動(dòng)態(tài)限流

    摘要:以流量為切入點(diǎn),從流量控制熔斷降級(jí)系統(tǒng)負(fù)載保護(hù)等多個(gè)維度保護(hù)服務(wù)的穩(wěn)定性分布式系統(tǒng)的流量防衛(wèi)兵。歡迎關(guān)注我們獲得更多的好玩實(shí)踐 之前分享過 一篇 《Spring Cloud Gateway 原生的接口限流該怎么玩》, 核心是依賴Spring Cloud Gateway 默認(rèn)提供的限流過濾器來實(shí)現(xiàn) 原生RequestRateLimiter 的不足 配置方式 spring: clou...

    妤鋒シ 評(píng)論0 收藏0
  • Spring Cloud Gateway 擴(kuò)展支持動(dòng)態(tài)限流

    摘要:以流量為切入點(diǎn),從流量控制熔斷降級(jí)系統(tǒng)負(fù)載保護(hù)等多個(gè)維度保護(hù)服務(wù)的穩(wěn)定性分布式系統(tǒng)的流量防衛(wèi)兵。歡迎關(guān)注我們獲得更多的好玩實(shí)踐 之前分享過 一篇 《Spring Cloud Gateway 原生的接口限流該怎么玩》, 核心是依賴Spring Cloud Gateway 默認(rèn)提供的限流過濾器來實(shí)現(xiàn) 原生RequestRateLimiter 的不足 配置方式 spring: clou...

    beanlam 評(píng)論0 收藏0
  • spring cloud gateway限流

    摘要:常見的限流方式,比如適用線程池隔離,超過線程池的負(fù)載,走熔斷的邏輯。在令牌桶算法中,存在一個(gè)桶,用來存放固定數(shù)量的令牌。,令牌桶每秒填充平均速率。 轉(zhuǎn)載請(qǐng)標(biāo)明出處: https://www.fangzhipeng.com本文出自方志朋的博客 在高并發(fā)的系統(tǒng)中,往往需要在系統(tǒng)中做限流,一方面是為了防止大量的請(qǐng)求使服務(wù)器過載,導(dǎo)致服務(wù)不可用,另一方面是為了防止網(wǎng)絡(luò)攻擊。 常見的限流方式,...

    joy968 評(píng)論0 收藏0
  • 阿里Sentinel支持Spring Cloud Gateway

    摘要:應(yīng)對(duì)突發(fā)請(qǐng)求時(shí)額外允許的請(qǐng)求數(shù)目。勻速排隊(duì)模式下的最長(zhǎng)排隊(duì)時(shí)間,單位是毫秒,僅在勻速排隊(duì)模式下生效。和為后續(xù)參數(shù)匹配特性預(yù)留,目前未實(shí)現(xiàn)。 1. 前言 4月25號(hào),Sentinel 1.6.0 正式發(fā)布,帶來 Spring Cloud Gateway 支持、控制臺(tái)登錄功能、改進(jìn)的熱點(diǎn)限流和注解 fallback 等多項(xiàng)新特性,該出手時(shí)就出手,緊跟時(shí)代潮流,昨天剛發(fā)布,今天我就要給大家分...

    chengtao1633 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<