首頁>技術>

熔斷Jeecgboot對於Hystrix使用熔斷路由全域性配置demo測試

呼叫過程

內部服務之間呼叫透過feign呼叫

閘道器服務呼叫過程Hystrix熔斷原理分析

功能

執行緒池隔離或訊號量隔離
限制呼叫分散式服務的資源使用 某一個呼叫服務出現問題 不會影響到其他服務的呼叫
降級機制
超時、資源不足(執行緒或訊號量)降級後可以配合降級介面返回託底資料
熔斷
當失敗率達到閾值自動觸發降級(如因網路故障/超時造成的失敗率高)熔斷器觸發的快速失敗會進行快速恢復
快取
提供了請求快取、請求合併實現支援實時監控、報警、控制(修改配置)

四種呼叫方式

toObservable
未做訂閱 只是返回一個Observable
observe
呼叫 toObservable 方法 並向Observable註冊rx.subjects.ReplaySubject發起訂閱
queueexecute

主要的執行邏輯

官方提供的流程圖

流程再梳理

限流全域性配置限流方式限流RequestRateLimiter原理分析

令牌桶演算法來控制請求速率

令牌流與令牌桶

系統會以一定的速度生成令牌,並將其放置到令牌桶中,可以將令牌桶想象成一個緩衝區(可以用佇列這種資料結構來實現),當緩衝區填滿的時候,新生成的令牌會被扔掉。 這裡有兩個變數很重要第一個是生成令牌的速度,一般稱為 rate 。比如,我們設定 rate = 2 ,即每秒鐘生成 2 個令牌,也就是每 1/2 秒生成一個令牌第二個是令牌桶的大小,一般稱為 burst 。比如,我們設定 burst = 10 ,即令牌桶最大隻能容納 10 個令牌

資料流

資料流是真正的進入系統的流量,對於介面來講,如果平均每秒鐘會呼叫2次,則認為速率為 2次/s

演算法原理

系統接收到一個單位資料(對於網路傳輸,可以是一個包或者一個位元組;對於微服務,可以是一個請求)後,從令牌桶中取出一個令牌,然後對資料或請求進行處理。如果令牌桶中沒有令牌了,會直接將資料或者請求丟棄。當然,對於微服務,就不能是丟棄這麼簡單了:可以返回一個異常訊息,用於提示使用者其請求速率超過了系統限制。有以下三種情形可能發生:1、資料流的速率 等於 令牌流的速率。這種情況下,每個到來的資料包或者請求都能對應一個令牌,然後無延遲地透過佇列;2、資料流的速率 小於 令牌流的速率。透過佇列的資料包或者請求只消耗了一部分令牌,剩下的令牌會在令牌桶裡積累下來,直到桶被裝滿。剩下的令牌可以在突發請求的時候消耗掉。3、資料流的速率 大於 令牌流的速率。這意味著桶裡的令牌很快就會被耗盡。導致服務中斷一段時間,如果資料包或者請求持續到來,將發生丟包或者拒絕響應。
redis-rate-limiter.replenishRate
允許使用者每秒執行多少請求,而不丟棄任何請求令牌桶的填充速率即每秒生成的令牌數
redis-rate-limiter.burstCapacity
使用者在一秒鐘內執行的最大請求數這是令牌桶可以儲存的令牌數將此值設定為零將阻止所有請求burstCapacity=0 拒絕所有請求
redis-rate-limiter.requestedTokens
每個請求消耗多少個令牌,預設是1
穩定速率
透過在replenishRate(補充令牌速度)和burstCapacity(令牌桶容量)中設定相同的值來實現的
突發流量
可透過設定burstCapacity高於replenishRate來允許臨時突發流量限流器需要在兩次突發之間留出一段時間(根據replenishRate)因為連續兩次突發將導致請求丟失 (HTTP 429 - Too Many Requests).
限制每秒一個請求
可以將replenishRate 允許使用者每秒處理多少個請求requestedTokens 令牌桶的容量,允許在一秒鐘內完成的最大請求數burstCapacity為replenishRate * requestedTokensreplenishRate=1requestedTokens=60burstCapacity=60令牌產生的速度是每秒1個桶中可儲存60個令牌每個請求消耗60個令牌一個請求消耗了60個 所以要產生60個 需要1分鐘 所以該配置是1分鐘一個請求replenishRate=10burstCapacity=20requestedTokens=1令牌產生速度是每秒 10 個桶中可儲存 20 個令牌(能處理的突發請求數,下一秒則只能處理 10 個請求)每個請求消耗 1 個令牌
下載jemeter
https://downloads.apache.org//jmeter/binaries/apache-jmeter-5.4.tgz
使用jemeter

開啟介面

apache-jmeter-5.4/bin/jmeter

選擇語言

建立一個測試計劃

新增一個執行緒組

1秒併發20個執行緒

新增Http請求預設值

新增一個Http請求

找一個介面來測試一下

就它了

測試結果展示方式

CSV資料檔案設定

如果壓測的介面是有引數的 例如壓測登入功能時模擬真實登入場景,使用者名稱和密碼應該是多個,如果有token則也是各不相同的透過新建一個txt檔案,在檔案中寫上變數值在下圖框起來的位置選擇新建的檔案在上圖變數名的位置填寫每列對應的變數名這個變數名可以在第三步新建的HTTP請求中的Parameters部分使用

獲取驗證碼這個介面 不需要引數 所以先把CSV資料檔案設定去掉

最終配置效果對應的檔案執行命令
./apache-jmeter-5.4/bin/jmeter.sh -n -t 測試計劃.jmx -l result.jtl -e -o output/n:非GUI模式執行JMeter;t: 指令碼檔案(.jmx檔案)的路徑;l: 指定生成測試結果的儲存檔案(.jtl格式),此檔案必須不存在;e:測試結束後,生成測試報告;o:用於存放測試報告的路徑;
生成的測試報告

開啟jtl檔案

檢視限流配置

閘道器配置的是 1分鐘只能透過一個請求但實際上 1秒鐘10個請求併發 卻有2個請求成功訪問了?

這裡知道原因的朋友們 請新增我的微信:15900411193 咱們交流下哦

7
  • BSA-TRITC(10mg/ml) TRITC-BSA 牛血清白蛋白改性標記羅丹明
  • 東哥手把手帶你刷二叉樹(第一期)