利用Spring Cloud實現微服務- 熔斷機制


1. 熔斷機制介紹

在介紹熔斷機制之前,我們需要了解微服務的雪崩效應。在微服務架構中,微服務是完成一個單一的業務功能,這樣做的好處是可以做到解耦,每個微服務可以獨立演進。但是,一個應用可能會有多個微服務組成,微服務之間的數據交互通過遠程過程調用完成。這就帶來一個問題,假設微服務A調用微服務B和微服務C,微服務B和微服務C又調用其它的微服務,這就是所謂的“扇出”。如果扇出的鏈路上某個微服務的調用響應時間過長或者不可用,對微服務A的調用就會占用越來越多的系統資源,進而引起系統崩潰,所謂的“雪崩效應”。

熔斷機制是應對雪崩效應的一種微服務鏈路保護機制。我們在各種場景下都會接觸到熔斷這兩個字。高壓電路中,如果某個地方的電壓過高,熔斷器就會熔斷,對電路進行保護。股票交易中,如果股票指數過高,也會采用熔斷機制,暫停股票的交易。同樣,在微服務架構中,熔斷機制也是起着類似的作用。當扇出鏈路的某個微服務不可用或者響應時間太長時,會進行服務的降級,進而熔斷該節點微服務的調用,快速返回錯誤的響應信息。當檢測到該節點微服務調用響應正常后,恢復調用鏈路。

在Spring Cloud框架里,熔斷機制通過Hystrix實現。Hystrix會監控微服務間調用的狀況,當失敗的調用到一定閾值,缺省是5秒內20次調用失敗,就會啟動熔斷機制。熔斷機制的注解是@HystrixCommand,Hystrix會找有這個注解的方法,並將這類方法關聯到和熔斷器連在一起的代理上。當前,@HystrixCommand僅當類的注解為@Service或@Component時才會發揮作用。

上一節中,我們提到,微服務之間的調用可以通過兩種方式,一個是RestTemplate,另一個是Feign。相對應,在這兩種調用方式下,都有Hystrix調用方法。



2. 代碼實現及驗證

本次代碼實現對RestTemplate和Feign兩種微服務調用場景下,使用Hystrix驗證Spring Cloud的熔斷機制。

2.1 RestTemplate的微服務調用場景

在第五節負載均衡,我們使用了RestTemplate實現了服務之間的調用。我們基於這一部分的代碼,增加Hystrix,實現熔斷機制。

1) 啟動Eureka-Server及LOADBALANCE-SERVICE,不要啟動Bookingcar-Service


 

點擊"LOADBALANCE-SERVICE"后面鏈接,進入負載均衡驗證頁面,輸入請求參數/v1/lb/testport?name=bookingcar-service,我們會在頁面上得到以下的錯誤提示:


 

2)  在pom.xml里,添加對Hystrix的依賴


 

3)在ribbon-service入口程序RibbonServiceApplication.java處添加注解@EnableCircuitBreaker,開啟熔斷器功能,如下所示:


 

4) 在LoadBalanceService.java里,使用了@Service注解聲明了LoadBalanceService類。我們在LoadBalanceService類里通過@HystrixCommand注解引入對TestPort調用的熔斷機制,@HystrixCommand注解里可以添加回調函數,如@HystrixCommand(callbackCommand = "XXX“),當無法調用TestPort服務時,熔斷機制的回調函數就會發生作用,對錯誤進行快速處理。


 

5) 重新啟動LOADBALANCE-SERVICE, 再次進入負載均衡驗證頁面,輸入請求參數/v1/lb/testport?name=bookingcar-service,我們發現熔斷機制已經發揮作用:


 

2.2 Feign的微服務調用場景

上一節,我們利用Feign實現了微服務間的內部調用,Feign中也內置了對Hystrix的支持。

1) 運行Report,同樣不要啟動BOOKINGCAR-SERVICE


 

點擊REPORTING-SERVICE后面鏈接,進入Feign驗證頁面,輸入參數v1/order/1,我們可以看到如下的錯誤提醒頁面:


 

2) 在application.properties里,添加feign.hystrix.enabled=true,使能Feign對hystrix的支持,如下所示:


 

3)在pom.xml里,添加對Hystrix的依賴


 

4) 在Report的入口程序ReportsApplication里,添加注解@EnableCircuitBreaker,開啟熔斷器功能,如下所示:


 

5) 在OrderClient.java里Feign的注解里,添加回調函數的參數


 

6) 添加一個新的類OrderClientHystrix,當調用微服務發生錯誤時,進行處理,本示例中,會返回“Hystrix works in Feign”的信息。


 

7)重新運行Report,點擊REPORTING-SERVICE后面鏈接,輸入請求參數v1/order/1,我們發現熔斷機制已經發揮作用,顯示如下:


 

3. 總結:

微服務本身是一種分布式架構,當調用鏈路過長時,系統的可用性是很大的挑戰。Spring Cloud框架的Hystrix提供了熔斷機制,在RestTemplate和Feign兩種對微服務調用的場景下都可以使用,當調用鏈路出現問題時可以快速進行服務降級處理,為我們提高微服務架構的可用性提供了很大的幫助。

代碼:https://github.com/shuxingliu/microservices

利用Spring Cloud實現微服務(七)- 內部調用

利用Spring Cloud實現微服務(六)- 服務網關

利用Spring Cloud實現微服務(五)- 負載均衡

利用Spring Cloud實現微服務(四)- 微服務實現與注冊

利用Spring Cloud實現微服務(三)- 業務領域驅動微服務設計

利用Spring Cloud實現微服務(二)--領域驅動設計

利用Spring Cloud實現微服務(一):Eureka服務器



作者:書興
鏈接:http://www.jianshu.com/p/0d53a9101ec6
來源:簡書
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。
 
       


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM