Hystrix-服務熔斷

一、熔斷原理

熔斷器,也叫斷路器,其英文單詞爲: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毫秒
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章