天天看點

hystrix原理_Spring Cloud-熔斷器Hystrix學習筆記

hystrix原理_Spring Cloud-熔斷器Hystrix學習筆記

一.簡介

1.什麼是Hystrix

在分布式環境中,許多服務依賴中的一些必然會失敗。Hystrix是一個通過添加延遲容忍和容錯邏輯來幫助您控制這些分布式服務之間的互動的庫。Hystrix通過隔離服務之間的通路點、停止跨服務的級聯故障并提供回退選項來實作這一點,所有這些都可以提高系統的整體彈性。

2.Hystrix解決什麼問題(github)

複雜分布式體系結構中的應用程式具有數十種依賴關系,每種依賴關系不可避免地會在某個時刻失敗。如果主機應用程式未與這些外部故障隔離開來,則可能會被淘汰。

例如,對于依賴于30個服務的應用程式,其中每個服務的正常運作時間為99.99%,您可以期望:

99.99 30 = 99.7%的正常運作時間

10億個請求中的0.3%= 3,000,000次故障

/每月2小時以上的停機時間,即使所有依賴項都具有出色的正常運作時間。

現實通常更糟。

即使您沒有對整個系統進行永續性設計,即使所有依賴項都能很好地執行,即使0.01%的停機時間對數十種服務中的每一項的總影響也等于一個月可能停機數小時。在微服務系統中,一個使用者請求可能需要調用幾個服務才能完成,如圖1,在所有的服務都處于可用狀态時,一個使用者請求需要調用A、H、I和P。

hystrix原理_Spring Cloud-熔斷器Hystrix學習筆記

圖1 正常情況下一個請求的狀态(網絡圖)

當一個服務,例如服務I,出現網絡延遲或者故障,即使服務A、H、P可用,整個系統也會出現阻塞現象并等待服務I的響應。如圖2。

hystrix原理_Spring Cloud-熔斷器Hystrix學習筆記

圖2 當某個服務出現故障(網絡圖)

在高并發的情況下,單個服務的延遲會導緻整個請求都處于延遲狀态,可能在幾秒就使整個服務處于線程飽和狀态。某個服務的單個點的請求故障會導緻使用者的請求處于阻塞狀态,最終的結果就是整個服務的線程資源消耗殆盡。由于服務的依賴性,會導緻依賴于該故障服務的其他服務也處于線程阻塞狀态,最終導緻這些服務的現成資源消耗殆盡,直到不可用,進而導緻整個微服務系統的不可用,即雪崩效應。

源碼位址:https://github.com/Netflix/Hystrix

3.Hystrix的設計原理

  1. 防止單個服務的故障耗盡整個服務的Servlet容器的線程資源
  2. 快速失敗機制,如果某個服務出現了故障,則調用該服務的請求快速失敗,而不是線程等等
  3. 提供回退(fallback)方案,在請求發生故障時,提供設定好的回退方案
  4. 使用熔斷機制,防止故障擴散到其它服務
  5. 提供熔斷器的監控元件Hystrix Dashboard,可以實時監控熔斷器的狀态

4.Hystrix的工作機制

hystrix原理_Spring Cloud-熔斷器Hystrix學習筆記

圖3 熔斷器機制

當服務的某個API接口的失敗次數在一定時間内小于設定的門檻值時,熔斷器出于關閉狀态,該API接口正常提供服務。當該API接口處理請求的失敗次數大于設定的門檻值時,Hystrix判定該API端口出現了故障,打開熔斷器,這時請求該API接口會執行快速失敗的邏輯(即fallback回退的邏輯),不執行業務邏輯,請求的線程不會出于阻塞狀态。處于打開狀态的熔斷器,一段時間後會出于半打開狀态,并将一定數量的請求執行正常邏輯。剩餘的請求會執行快速失敗,若執行正常邏輯的請求失敗了,則熔斷器繼續打開;若成功了,則熔斷器關閉。這樣熔斷器就具備了自我修複的能力。

二.Hystrix使用執行個體

1.RestTemplate和Ribbon使用執行個體

基于eureka-service、eureka-client、ribbon三個子產品進行測試。首先引入pom,Hystrix配置。

<
           

設定啟動類:

@EnableHystrix
           

配置RibbonService:

@Service
           

啟動三個項目,當正常通路http://localhost:8070/hello/ribbon 列印:Hello World!。關閉eureka-client時,列印:error!。可見當關閉eureka-client時,通路http://localhost:8070/hello/ribbon,eureka-client沒有反應,開啟了熔斷器,最後進入fallbackMethod的邏輯。進入快速失敗,請求得到及時處理,線程不在阻塞。

2.Feign使用執行個體

在feign-client項目的application.yml配置檔案添加啟動Hystrix的功能配置:

feign: 
  
           

添加TestHystrix:

@Component
           

修改FeignClientService:

@FeignClient
           

通路http://localhost:8060/hello/feign 列印:Hello World!test。當關掉eureka-client時,列印:hello,test,sorry error!。即:當eureka-client不可用時,feign-client進入了fallback的邏輯,由這個類來執行熔斷器打開是的處理邏輯。

三.Hystrix Dashboard的使用

1.在RestTemplate中使用Hystrix Dashboard

引入依賴:

<
           

開啟Hystrix Dashboard功能:

@EnableHystrixDashboard
           

通路:http://localhost:8070/hystrix.stream 浏覽器上面會列印熔斷器的資料名額。

hystrix原理_Spring Cloud-熔斷器Hystrix學習筆記

圖4 熔斷器資料名額

通路:http://localhost:8070/hystrix 進入Dashboard首頁。

hystrix原理_Spring Cloud-熔斷器Hystrix學習筆記

圖5 Hystrix Dashboard首頁

在上面分别輸入http://localhost:8070/hystrix.stream,2000,test會出現如下資料分析圖。

hystrix原理_Spring Cloud-熔斷器Hystrix學習筆記

圖6 Hystrix Dashboard展示圖

2.feign中使用Hystrix Dashboard

同上!!!

四.Turbine聚合監控

Turbine用于集合多個Hystrix Dashboard,将多個Hystrix Dashboard放在一個頁面展示,進行集中監控。

添加依賴pom.xml

<
           

配置application.yml檔案:

spring: