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實現微服務(三)- 業務領域驅動微服務設計
作者:書興
鏈接:http://www.jianshu.com/p/0d53a9101ec6
來源:簡書
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。