一、熔斷原理
熔斷器,也叫斷路器,其英文單詞爲:Circuit Breaker
熔斷狀態機3個狀態:
- Closed:關閉狀態,所有請求都正常訪問。
- Open:打開狀態,所有請求都會被降級。Hystix會對請求情況計數,當一定時間內失敗請求百分比達到閾值,則觸發熔斷,斷路器會完全打開。默認失敗比例的閾值是50%,請求次數最少不低於20次。
- Half Open:半開狀態,open狀態不是永久的,打開後會進入休眠時間(默認是5S)。隨後斷路器會自動進入半開狀態。此時會釋放部分請求通過,若這些請求都是健康的,則會完全關閉斷路器,否則繼續保持打開,再次進行休眠計時
二、實踐代碼
爲了能夠精確控制請求的成功或失敗,我們在consumer的調用業務中加入一段邏輯:
@GetMapping("{id}")
@HystrixCommand
public String queryUserById(@PathVariable("id") Long id){
if(id == 1){
throw new RuntimeException("太忙了");
}
String user = this.restTemplate.getForObject("http://service-provider/user/" + id, String.class);
return user;
}
這樣如果參數是id爲1,一定失敗,其它情況都成功。(不要忘了清空service-provider中的休眠邏輯)
我們準備兩個請求窗口:
- 一個請求:http://localhost/consumer/user/1,註定失敗
- 一個請求:http://localhost/consumer/user/2,肯定成功
當我們瘋狂訪問id爲1的請求時(超過20次),就會觸發熔斷。斷路器會斷開,一切請求都會被降級處理。
此時你訪問id爲2的請求,會發現返回的也是失敗,而且失敗時間很短,只有幾毫秒左右:
不過,默認的熔斷觸發要求較高,休眠時間窗較短,爲了測試方便,我們可以通過配置修改熔斷策略:
circuitBreaker.requestVolumeThreshold=10
circuitBreaker.sleepWindowInMilliseconds=10000
circuitBreaker.errorThresholdPercentage=50
解讀:
- requestVolumeThreshold:觸發熔斷的最小請求次數,默認20
- errorThresholdPercentage:觸發熔斷的失敗請求最小佔比,默認50%
- sleepWindowInMilliseconds:休眠時長,默認是5000毫秒