一、基本原理
之前的入門文章裡面已經詳細介紹過,這裡就不再贅述,不懂的可以參考之前的文章:
今天,我們是以實戰代碼的形式模擬一些異常,演練這些原理
二、實戰演練
我們來演示什麼場景呢?
- 演示熔斷器三種狀態的轉換(close——half-open——open)
- 演示熔斷器下的降級策略
1、構建熔斷器策略
- withMetricsRollingStatisticalWindowBuckets
注意:這裡設置的窗口大小一定要 >= withCircuitBreakerRequestVolumeThreshold,否則斷路器始終open不了。默認滑動窗口大小:10
- withMetricsRollingStatisticalWindowInMilliseconds
默認滑動窗口時間窗:10s。
- withCircuitBreakerRequestVolumeThreshold
滑動窗口時間窗內,經過短路器的流量超過了一定的閾值,才執行短路。默認是20次
- withCircuitBreakerErrorThresholdPercentage
滑動窗口時間窗內,斷路器統計到的異常調用的佔比超過了一定的閾值,才執行短路,默認是50%。
- withCircuitBreakerSleepWindowInMilliseconds
open到half-open狀態(試探服務)的時間。默認值:5000ms
本次我們採用的熔斷器策略為:我們以該策略來模擬場景驗證
.withMetricsRollingStatisticalWindowBuckets(2)
.withMetricsRollingStatisticalWindowInMilliseconds(6000)
.withCircuitBreakerRequestVolumeThreshold(2)
.withCircuitBreakerErrorThresholdPercentage(40)
.withCircuitBreakerSleepWindowInMilliseconds(6000))
簡而言之:無非就掌握三種狀態的轉換(open——half——open)
- open:在滑動窗口內(2個窗),滑動窗口時間窗內(6s),經過斷路器的流量 >= 2,且錯誤比例>40%
- open ~ half-open:再經過6s的時間
- half-open ~ close:成功訪問一次
2、異常模擬
if(adId.equals(-1L)) {
// 如果調用失敗了,報錯了,那麼就會去調用fallback降級機制
throw new Exception();
}
即:AdId=-1的請求為異常請求
3、單元測試類
依賴系統啟動:spring-boot-hystrix-ad
項目名:spring-boot-hystrix-circuit-breaker
實驗實錄:
1)open close狀態
2)異常統計信息
2)open狀態
3)open ~ half-open and half-open ~ close
4、結合hystrix-dashboard測試熔斷器原理
啟動我們的Tomcat,打開我們的監控儀表盤:http://localhost:8080/hystrix-dashboard/
基本配置:http://localhost:8022/hystrix.stream
從界面上觀察熔斷器的狀態轉換:
從界面上,我們可以觀察如下幾點變化:
- Circuit:Closed ~ Open(界面上是看不到half-open)
- Success:10
- Failure:3
- Reject:3
- Success:3
閱讀更多 極客慧 的文章