天天看點

springcloud學習之hystrix機制

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類中尋找。

繼續閱讀