1. 程式人生 > >連載:4-spring-cloud-hystrix

連載:4-spring-cloud-hystrix

熔斷器Hystrix
一、什麼是熔斷器
在分散式系統中,服務與服務之間錯綜複雜的呼叫關係很難保證系統一直穩定執行。當某一個服務出現故障,就會導致依賴此服務的其他服務出現遠端排程執行緒阻塞。Hystrix是Netflix公司開源的一個專案,它提供了熔斷器功能,能夠阻止分散式系統中出現聯動故障。Hystrix是通過隔離服務的訪問點阻止聯動故障的,並提供了故障的解決方案,從而避免了整個分散式系統的彈性。
當某個服務出現網路延遲或者故障時,即使依賴的服務依然正常可用,但由於故障服務會使使用者請求處於阻塞狀態。高併發的情況下,單個服務的延遲會導致整個請求都處於延遲狀態,可能在幾秒內就使整個服務處於執行緒負載飽和的狀態,使用者請求處於阻塞,最終導致整個服務的執行緒資源殆盡。由於服務的依賴性,會導致依賴於該故障服務的其他服務也處於執行緒阻塞狀態,最終導致這些服務的資源都消耗殆盡,直到不可用,從而導致整個微服務系統都不可用,這就是雪崩效應。
為了防止雪崩效應,因而產生了熔斷器模型。

二、Hystrix工作原理

  • 當服務的某個API介面的失敗次數在一定時間內小於設定的閥值時,熔斷器處於關閉狀態,該API介面提供正常服務;
  • 當該API介面處理請求的失敗次數大於設定的閥值時,Hystrix判定該API接口出現了故障,打開了熔斷器,這時該API介面會執行快速失敗的邏輯(fallback的邏輯),不執行業務處理,請求執行緒不會處於阻塞狀態。
  • 處於開啟狀態的熔斷器,一段時間後會處於半開啟狀態,並將一定數量的請求執行正常業務邏輯。剩餘的請求會執行快速失敗,若執行正常邏輯的請求依然失敗,熔斷器繼續開啟;若成功,則將熔斷器關閉。
    這樣熔斷器就具有了自我修復的能力。

三、RestTemplate和Ribbon上使用熔斷器
熔斷器機制:
在這裡插入圖片描述
1、pom.xml
在這裡插入圖片描述

2、啟動類application.java,開啟熔斷器 @EnableHystrix
在這裡插入圖片描述

3、service改造
新增@HystrixCommand註解,為方法新增熔斷器,同時,開啟失敗回退邏輯fallback。回退邏輯最好不新增其他業務處理,也不呼叫遠端服務,執行快速失敗,釋放資源。如果一定需要在回撥中遠端排程其他服務,最好在遠端排程其他服務時,也加上熔斷器。
在這裡插入圖片描述

4、啟動
啟動eureka服務端,啟動兩個client和ribbon client,等待所有服務均啟動完成,開發服務端發現兩個client服務和ribbon client。訪問http://localhost:8766/hi,通過ribbon分別訪問兩個client例項,均正常。當關閉其中一個client,會快速執行失敗相應,提示error,但並不影響其他服務的正常執行,執行緒能夠得到及時處理,不會出現執行緒阻塞情況。

四、在Feign上使用熔斷器
由於Feign的起步依賴中已經引入了Hystrix的依賴,所以在Feign中使用Hystrix不需要引入任何的依賴,只需要在application.yml中開啟Hystrix的功能即可。
1、application.yml
在這裡插入圖片描述

2、在EurekaClientFeign檔案的FeignClient註解上新增fallback快速失敗的處理類。
該處理類是作為Feign熔斷器的邏輯處理類,必須實現被@FeignClient修飾的介面,最後以Spring Bean的形式注入Ioc容器中。
在這裡插入圖片描述

3、回退處理邏輯類
回退處理邏輯類需要實現EurekaClientFeign介面,並需要再介面方法裡編寫熔斷處理邏輯,同時需要在類上新增@Compont註解,注入Ioc容器中。
在這裡插入圖片描述

4、啟動服務,同ribbon訪問方式相同,會發現當client不可用時,feign client 進入了fallback的邏輯處理來執行熔斷器開啟的處理邏輯。

五、使用Hystrix Dashboard監控熔斷器的狀態、使用Turbine聚合監控
此部分還沒有深入理解,後續補充。。。