hystrix解決雪崩問題的手段有兩個:線程隔離與服務熔斷
線程隔離:預設開啟線程隔離,為每個服務單獨開啟自己的thread池。當自己線程池跑滿之後不用影響到其他服務的程序。如果沒有線程隔離,當一個服務無限制被阻塞的時候,伺服器的記憶體将被占滿,會影響到整個項目。
服務熔斷:當一些服務符合熔斷的機制後,該服務會被熔斷,其他服務來通路的時候會快速傳回我們自定義的fallback方法,防止線程阻塞。
簡單使用hystrix:
1、引入相關依賴
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>
2、在啟動類上增加注釋@EnableCircuitBreaker
提示:如果同時使用hystrix、eureka和ribbon可将啟動類上的@SpringBootApplication 更換成@SpringCloudApplication 。因為@SpringCloudApplication 包含了這個必要的注釋。
3、使用範圍:
在方法上使用:
增加@HystrixCommand(fallbackMethod = "fallback")注解,fallbackMethod指定一個自定義方法,用來做熔斷時執行的方法。
fallback方法的傳回值與參數必須要該方法保持一直,不然會找不到該fallback方法。
在類上使用:
增加@DefaultProperties(defaultFallback = "fallback")注解,defaultFallback與fallbackMethod原理一樣,但是自定義的方法不需要參數,傳回值預設為String,這樣保證符合整個類中的所有方法。
4、由于熔斷的請求時間預設為1s,1s無法響應則算入失敗計數(熔斷原理5)。我們可以更改整個預設時長。
針對不同方法更改時長:
@HystrixCommand(commandProperties = {
@HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds",value = "3000")
})
針對類更改時長:在@DefaultProperties注解上增加commandProperties,寫法與方法上一緻。
針對全局更改時長:在配置檔案中
hystrix:
command:
default:
execution:
isolation:
thread:
timeoutInMilliseconds: 5000
一般我們隻需要更改整個參數即可,當然還有其他參數可以更改,見相關配置6
5、熔斷原理
預設20次請求有百分之50的逾時,就會打開熔斷器。斷路器狀态:
關閉狀态:所有請求正常通路。
打開狀态:所有請求會被降級。Hystrix會對請求情況計數,當一定時間内失敗請求百分比達到門檻值,則觸發熔斷,斷路器會完全關閉。
半開狀态:斷路打開不是永久的,打開後會進入休眠時間(預設5s),放一定請求通過,再次計數。如果正常則關閉,如果不正常繼續保持打開。
6、相關配置
可以更改預設請求次數,百分比等。
@HystrixProperty(name = "circuitBreaker.errorThresholdPercentage",value = "60"),
@HystrixProperty(name = "circuitBreaker.requestVolumeThreshold",value = "10"),
@HystrixProperty(name = "circuitBreaker.sleepWindowInMilliseconds",value = "10000")
其他配置項可以進入hystrix包下的HystrixCommandProperties類中尋找。