熔斷器的狀态
熔斷器有三個狀态 CLOSED 、 OPEN 、 HALF_OPEN 熔斷器預設關閉狀态,當觸發熔斷後狀态變更為
OPEN ,在等待到指定的時間,Hystrix會放請求檢測服務是否開啟,這期間熔斷器會變為 HALF_OPEN 半
開啟狀态,熔斷探測服務可用則繼續變更為 CLOSED 關閉熔斷器。

Closed :關閉狀态(斷路器關閉),所有請求都正常通路。代理類維護了最近調用失敗的次數,
如果某次調用失敗,則使失敗次數加1。如果最近失敗次數超過了在給定時間内允許失敗的門檻值,
則代理類切換到斷開(Open)狀态。此時代理開啟了一個逾時時鐘,當該時鐘超過了該時間,則切
換到半斷開(Half-Open)狀态。該逾時時間的設定是給了系統一次機會來修正導緻調用失敗的錯
誤。
Open :打開狀态(斷路器打開),所有請求都會被降級。Hystix會對請求情況計數,當一定時間
内失敗請求百分比達到門檻值,則觸發熔斷,斷路器會完全關閉。預設失敗比例的門檻值是50%,請求
次數最少不低于20次。
Half Open :半開狀态,open狀态不是永久的,打開後會進入休眠時間(預設是5S)。随後斷路
器會自動進入半開狀态。此時會釋放1次請求通過,若這個請求是健康的,則會關閉斷路器,否則
繼續保持打開,再次進行5秒休眠計時。
//由于這是個Fegin是以會逾時
@HystrixCommand(fallbackMethod = "buyCallBack")
@RequestMapping(value = "/buy/{id}",method = RequestMethod.GET)
public Product findById(@PathVariable Long id) {
Product product = null;
if(id !=1 ) {
throw new RuntimeException("太忙了");
}
//product = restTemplate.getForObject("http://service-product/product/1",Product.class);
product = productFeignClient.findById(id);
return product;
}
熔斷器的預設觸發門檻值是20次請求,不好觸發。休眠時間時5秒,時間太短,不易觀察,為了測試方
便,我們可以通過配置修改熔斷政策:
hystrix:
command:
default:
execution:
isolation:
thread:
timeoutInMilliseconds: 6000 #預設的連接配接逾時時間1秒,若1秒沒有傳回資料,自動的觸發降級邏輯
circuitBreaker:
enabled: true
requestVolumeThreshold: 5
errorThresholdPercentage: 10
sleepWindowInMilliseconds: 10000
我們瘋狂通路id為1的請求時(超過10次),就會觸發熔斷。斷路器會端口,一切請求都會被降級處理。
此時你通路id為2的請求,會發現傳回的也是失敗,而且失敗時間很短,隻有20毫秒左右:
注:方法上一定要有降級的方法,不然監控不到。而且假如是HystrixCommand這個注解都支援,假如是
和Fegin結合的話,報錯的地方互動的後面,前面是沒有用的
熔斷器的隔離政策
微服務使用Hystrix熔斷器實作了服務的自動降級,讓微服務具備自我保護的能力,提升了系統的穩定
性,也較好的解決雪崩效應。其使用方式目前支援兩種政策:
線程池隔離政策: 使用一個線程池來存儲目前的請求,線程池對請求作處理,設定任務傳回處理超
時時間,堆積的請求堆積入線程池隊列。這種方式需要為每個依賴的服務申請線程池,有一定的資
源消耗,好處是可以應對突發流量(流量洪峰來臨時,處理不完可将資料存儲到線程池隊裡慢慢處理)
信号量隔離政策: 使用一個原子計數器(或信号量)來記錄目前有多少個線程在運作,請求來先判
斷計數器的數值,若超過設定的最大線程個數則丢棄改類型的新請求,若不超過則執行計數操作請
求來計數器+1,請求傳回計數器-1。這種方式是嚴格的控制線程且立即傳回模式,無法應對突發
流量(流量洪峰來臨時,處理的線程超過數量,其他的請求會直接傳回,不繼續去請求依賴的服
務)
線程池和型号量兩種政策功能支援對比如下: