摘要:歡迎訪問我的歡迎訪問我的內(nèi)容所有原創(chuàng)文章分類匯總及配套源碼,涉及等本篇概覽本篇概覽本文是實戰(zhàn)系列的第八篇,經(jīng)過前面的學(xué)習(xí),咱們對過濾器已了解得差不多,今天來補全過濾器的最后一個版塊限流默認(rèn)的限流器是基于實現(xiàn)的,限流算法是大家熟悉的令牌桶關(guān)于
https://github.com/zq2599/blog_demos
內(nèi)容:所有原創(chuàng)文章分類匯總及配套源碼,涉及Java、Docker、Kubernetes、DevOPS等;
本文是《Spring Cloud Gateway實戰(zhàn)》系列的第八篇,經(jīng)過前面的學(xué)習(xí),咱們對過濾器已了解得差不多,今天來補全過濾器的最后一個版塊:限流(RequestRateLimiter )
默認(rèn)的限流器是基于redis實現(xiàn)的,限流算法是大家熟悉的令牌桶(Token Bucket Algorithm),關(guān)于令牌捅的原理就不在此展開了,聰明的您看一眼下圖應(yīng)該就懂了:裝令牌的桶容量有限,例如最多20個,令牌進入桶的速度恒定(注意,這里是和漏桶算法的區(qū)別),例如每秒10個,底部每個請求能拿到令牌才會被處理:
名稱 | 鏈接 | 備注 |
---|---|---|
項目主頁 | https://github.com/zq2599/blog_demos | 該項目在GitHub上的主頁 |
git倉庫地址(https) | https://github.com/zq2599/blog_demos.git | 該項目源碼的倉庫地址,https協(xié)議 |
git倉庫地址(ssh) | [email protected]:zq2599/blog_demos.git | 該項目源碼的倉庫地址,ssh協(xié)議 |
@GetMapping("/userinfo") public String userInfo(@RequestParam("username") String username) { return Constants.HELLO_PREFIX + " " + username + ", " + dateStr(); }
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
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個,相當(dāng)于QPS redis-rate-limiter.replenishRate: 100 # 桶內(nèi)能裝200個令牌,相當(dāng)于峰值,要注意的是:第一秒從桶內(nèi)能去200個,但是第二秒只能取到100個了,因為入桶速度是每秒100個 redis-rate-limiter.burstCapacity: 200 # 每個請求需要的令牌數(shù) redis-rate-limiter.requestedTokens: 1
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")); }}
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); }}
首先驗證的是桶容量等于入桶速度時的效果,請修改gateway-requestratelimiter應(yīng)用的application.yml中文件,使得redis-rate-limiter.replenishRate和redis-rate-limiter.burstCapacity的值都等于100,也就是說桶的大小等于100,每秒放入的令牌數(shù)也是100
確保redis已經(jīng)啟動,并且與application.yml中的配置保持一直
啟動nacos(provider-hello依賴)
啟動服務(wù)提供者provider-hello
啟動gateway-requestratelimiter
為了模擬web請求,我這里使用了Apache Benchmark,windows版本的下載地址:
https://www.apachelounge.com/download/VS16/binaries/httpd-2.4.48-win64-VS16.zip
上述文件下載解壓后即可使用,在控制臺進入Apache24/bin后執(zhí)行以下命令,意思是向指定地址發(fā)送10000個請求,并發(fā)數(shù)為2:
ab -n 10000 -c 2 http://localhost:8081/hello/userinfo?username=Tom
接下來試試桶容量大于入桶速度時的限流效果,這對于我們控制峰值響應(yī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個請求,并發(fā)數(shù)為2:
ab -n 10000 -c 2 http://localhost:8081/hello/userinfo?username=Tom
接下來驗證限流的維度,究竟是不是按照請求參數(shù)username的值來限流的
咱們打開兩個命令行,同時發(fā)送請求(動作要快),第一個的username等于Tom,第二個等于Jerry,理論上推測,如果都是8秒內(nèi)完成,那么每個命令都有900個請求能成功
測試結(jié)果如下圖,可見符合預(yù)期,每個username用的是自己的令牌:
微信搜索「程序員欣宸」,我是欣宸,期待與您一同暢游Java世界...
https://github.com/zq2599/blog_demos
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/124538.html
摘要:以流量為切入點,從流量控制熔斷降級系統(tǒng)負(fù)載保護等多個維度保護服務(wù)的穩(wěn)定性分布式系統(tǒng)的流量防衛(wèi)兵。歡迎關(guān)注我們獲得更多的好玩實踐 之前分享過 一篇 《Spring Cloud Gateway 原生的接口限流該怎么玩》, 核心是依賴Spring Cloud Gateway 默認(rèn)提供的限流過濾器來實現(xiàn) 原生RequestRateLimiter 的不足 配置方式 spring: clou...
摘要:以流量為切入點,從流量控制熔斷降級系統(tǒng)負(fù)載保護等多個維度保護服務(wù)的穩(wěn)定性分布式系統(tǒng)的流量防衛(wèi)兵。歡迎關(guān)注我們獲得更多的好玩實踐 之前分享過 一篇 《Spring Cloud Gateway 原生的接口限流該怎么玩》, 核心是依賴Spring Cloud Gateway 默認(rèn)提供的限流過濾器來實現(xiàn) 原生RequestRateLimiter 的不足 配置方式 spring: clou...
摘要:常見的限流方式,比如適用線程池隔離,超過線程池的負(fù)載,走熔斷的邏輯。在令牌桶算法中,存在一個桶,用來存放固定數(shù)量的令牌。,令牌桶每秒填充平均速率。 轉(zhuǎn)載請標(biāo)明出處: https://www.fangzhipeng.com本文出自方志朋的博客 在高并發(fā)的系統(tǒng)中,往往需要在系統(tǒng)中做限流,一方面是為了防止大量的請求使服務(wù)器過載,導(dǎo)致服務(wù)不可用,另一方面是為了防止網(wǎng)絡(luò)攻擊。 常見的限流方式,...
摘要:應(yīng)對突發(fā)請求時額外允許的請求數(shù)目。勻速排隊模式下的最長排隊時間,單位是毫秒,僅在勻速排隊模式下生效。和為后續(xù)參數(shù)匹配特性預(yù)留,目前未實現(xiàn)。 1. 前言 4月25號,Sentinel 1.6.0 正式發(fā)布,帶來 Spring Cloud Gateway 支持、控制臺登錄功能、改進的熱點限流和注解 fallback 等多項新特性,該出手時就出手,緊跟時代潮流,昨天剛發(fā)布,今天我就要給大家分...
閱讀 1298·2021-11-23 09:51
閱讀 2693·2021-09-03 10:47
閱讀 2273·2019-08-30 15:53
閱讀 2458·2019-08-30 15:44
閱讀 1405·2019-08-30 15:44
閱讀 1228·2019-08-30 10:57
閱讀 1957·2019-08-29 12:25
閱讀 1119·2019-08-26 11:57