Spring Cloud Hystrix 服務容錯

1. 背景

在複雜的分佈式 架構 的應用程序有很多的依賴,都會不可避免地在某些時候失敗。高併發的依賴失敗時如果沒有隔離措施,當前應用服務就有被拖垮的風險。服務雪崩效應是一種因 服務提供者 的不可用導致 服務調用者 的不可用,並將不可用 逐漸放大 的過程.如果所示:

A服務調用B服務,B服務調用C服務,由於某種原因,B服務調用C服務不成功,B服務就會一直重試,同步等待會造成資源耗盡,結果B服務也不可用了,A也一直重試調用B服務,最後,A不可用,B不可用,C不可用,導致整個系統都不可用。

雪崩效應,是我們應該極力避免的。而springcloud家族防雪崩的利器是Hystrix

2. 初識Hystrix

  1). 防雪崩利器

  2). 基於Netflix對應的Hystrix

 

  Hystrix的中文意思是豪豬,能保護自己不受天敵的傷害,代表了是一種防禦的機制,這個Hystrix的框架不謀而合,提供一系列的服務容錯保護機制。

3. Hystrix的作用

  1). 服務降級(優先核心服務,非核心服務不可用或者弱可用)

    a. 導入依賴

<!--服務容錯-->
<dependency>
	<groupId>org.springframework.cloud</groupId>
	<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>

    b. 啓動類上加註解

@EnableCircuitBreaker

    c.  使用Hystrix的服務容錯

@HystrixCommand(fallbackMethod = "fallback")
@GetMapping("/getProductInfoList")
public String getProductInfoList(@RequestParam("number") Integer number) {
    RestTemplate restTemplate = new RestTemplate();
    return restTemplate.postForObject("http://localhost:8081/product/listForOrder", Arrays.asList("123456"), String.class);
//     throw new RuntimeException("出異常了!!!");
 }

private String fallback() {
    return "太擁擠了, 請稍後再試~~";
}

      d. 查看效果

    注: 其實在服務容錯使用場景中,最常用的是服務容錯機制的超時設置,因爲有些場景使用的是外網(第三方), 耗時往往比較長,加入註解就可實現

// 超時配置(超時時間: 3000ms)
@HystrixCommand(commandProperties = {
      @HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds", value = "3000")
})

  2). 依賴隔離

  3). 服務熔斷

    a. 核心:Circuit Breaker  斷路器

    b. 重點:微服務和分佈式中,容錯是必不可少的環節,通常的做法有兩種,1. 重試機制:對於預期的短暫的故障可以使用重試是可以解決的,但是對於長時間的服務故障,重試依然沒有任何意義。2. 斷路器模式:將受保護的服務封裝到可以監控故障的斷路器對象中,當故障達到一定的值,就會阻斷,斷路器對象返回錯誤。結合一張圖說明

狀態機的三種狀態:close,open, half open

三種狀態之間的轉換關係:close是熔斷器的關閉狀態,調用失敗次數累計,到了一定的閾值或者一定的比例,就會啓動熔斷機制
open是熔斷器的打開狀態,此時,對服務都返回錯誤,它設計了一個時鐘選項,默認的時鐘到了這個時間之後,就會進入半熔斷狀態,就是half open
允許定量的服務請求,如果調用都成功或者一定的比例,則認爲都回復了,就關閉熔斷器,否則,就認爲還沒好,恢復熔斷器打
開狀態。

@HystrixCommand(commandProperties = {
    // 開啓服務熔斷
    @HystrixProperty(name = "circuitBreaker.enabled", value = "true"),
    //請求數達到後才計算,設置在滾動時間窗口中斷路器的最小請求數,這裏設置的是10條
    @HystrixProperty(name = "circuitBreaker.requestVolumeThreshold", value = "10"),
    //休眠時間窗, 這個休眠時間窗結束以後,會將斷路器設置爲half open,嘗試熔斷請求命令,如果依然失敗,就將斷路器依然設置爲代開狀態,如果成功就設置爲關閉狀態
    @HystrixProperty(name = "circuitBreaker.sleepWindowInMilliseconds", value = "10000"),
    //錯誤率,設置熔斷器打開的錯誤百分比條件,設置的是60,表示在滾動時間窗口中,如果發生了10次調用,在這10次調用中,7次發生了異常,錯誤70>60, 熔斷器就設置爲打開狀態,否則就設置爲關閉狀態
    @HystrixProperty(name = "circuitBreaker.errorThresholdPercentage", value = "60"),
})

 sleepWindowInMilliseconds:  時間窗口,斷路器確定要打開統計一些請求和錯誤數據的時候,它有個時間範圍,時間範圍被稱爲時間窗口,當斷路器打開對主邏輯進行熔斷之後,hystrix回啓動一個休眠時間窗口,在這個時間窗內,降級的臨時邏輯成爲主邏輯,當休眠時間窗到期,短路器將進入半開狀態,釋放一次請求到原來的主邏輯上,如果此次請求正常返回,那麼斷路器繼續閉合,主邏輯恢復,如果這次請求依然有問題,斷路器則繼續進入打開狀態,休眠時間窗則持續計時.

 

4). 監控(Hystrix Dashboard)(對熔斷進行可視化)

a. 導入依賴

<!--服務容錯的可視化界面-->
<dependency>
	<groupId>org.springframework.cloud</groupId>
	<artifactId>spring-cloud-starter-netflix-hystrix-dashboard</artifactId>
</dependency>

b. 在啓動類上加註解

@EnableHystrixDashboard

c. 查看服務頁面

d. 進行服務的監控

幾個顏色需要關注一下:顏色越偏向紅色,代表這個服務越不健康

幾個指標也需要注意:

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章