利用Spring Cloud實(shí)現(xiàn)微服務(wù)(八)- 熔斷機(jī)制

1. 熔斷機(jī)制介紹

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


扇出

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

在Spring Cloud框架里,熔斷機(jī)制通過Hystrix實(shí)現(xiàn)。Hystrix會監(jiān)控微服務(wù)間調(diào)用的狀況,當(dāng)失敗的調(diào)用到一定閾值,缺省是5秒內(nèi)20次調(diào)用失敗,就會啟動熔斷機(jī)制。熔斷機(jī)制的注解是@HystrixCommand,Hystrix會找有這個注解的方法,并將這類方法關(guān)聯(lián)到和熔斷器連在一起的代理上。當(dāng)前,@HystrixCommand僅當(dāng)類的注解為@Service或@Component時才會發(fā)揮作用。

上一節(jié)中,我們提到,微服務(wù)之間的調(diào)用可以通過兩種方式,一個是RestTemplate,另一個是Feign。相對應(yīng),在這兩種調(diào)用方式下,都有Hystrix調(diào)用方法。

2. 代碼實(shí)現(xiàn)及驗(yàn)證

本次代碼實(shí)現(xiàn)對RestTemplate和Feign兩種微服務(wù)調(diào)用場景下,使用Hystrix驗(yàn)證Spring Cloud的熔斷機(jī)制。

2.1 RestTemplate的微服務(wù)調(diào)用場景

在第五節(jié)負(fù)載均衡,我們使用了RestTemplate實(shí)現(xiàn)了服務(wù)之間的調(diào)用。我們基于這一部分的代碼,增加Hystrix,實(shí)現(xiàn)熔斷機(jī)制。

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

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

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

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

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

5) 重新啟動LOADBALANCE-SERVICE, 再次進(jìn)入負(fù)載均衡驗(yàn)證頁面,輸入請求參數(shù)/v1/lb/testport?name=bookingcar-service,我們發(fā)現(xiàn)熔斷機(jī)制已經(jīng)發(fā)揮作用:

2.2 Feign的微服務(wù)調(diào)用場景

上一節(jié),我們利用Feign實(shí)現(xiàn)了微服務(wù)間的內(nèi)部調(diào)用,F(xiàn)eign中也內(nèi)置了對Hystrix的支持。

1) 運(yùn)行Report,同樣不要啟動BOOKINGCAR-SERVICE

點(diǎn)擊REPORTING-SERVICE后面鏈接,進(jìn)入Feign驗(yàn)證頁面,輸入?yún)?shù)v1/order/1,我們可以看到如下的錯誤提醒頁面:

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

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

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

5) 在OrderClient.java里Feign的注解里,添加回調(diào)函數(shù)的參數(shù)

6) 添加一個新的類OrderClientHystrix,當(dāng)調(diào)用微服務(wù)發(fā)生錯誤時,進(jìn)行處理,本示例中,會返回“Hystrix works in Feign”的信息。

7)重新運(yùn)行Report,點(diǎn)擊REPORTING-SERVICE后面鏈接,輸入請求參數(shù)v1/order/1,我們發(fā)現(xiàn)熔斷機(jī)制已經(jīng)發(fā)揮作用,顯示如下:

3. 總結(jié):

微服務(wù)本身是一種分布式架構(gòu),當(dāng)調(diào)用鏈路過長時,系統(tǒng)的可用性是很大的挑戰(zhàn)。Spring Cloud框架的Hystrix提供了熔斷機(jī)制,在RestTemplate和Feign兩種對微服務(wù)調(diào)用的場景下都可以使用,當(dāng)調(diào)用鏈路出現(xiàn)問題時可以快速進(jìn)行服務(wù)降級處理,為我們提高微服務(wù)架構(gòu)的可用性提供了很大的幫助。

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

利用Spring Cloud實(shí)現(xiàn)微服務(wù)(七)- 內(nèi)部調(diào)用

利用Spring Cloud實(shí)現(xiàn)微服務(wù)(六)- 服務(wù)網(wǎng)關(guān)

利用Spring Cloud實(shí)現(xiàn)微服務(wù)(五)- 負(fù)載均衡

利用Spring Cloud實(shí)現(xiàn)微服務(wù)(四)- 微服務(wù)實(shí)現(xiàn)與注冊

利用Spring Cloud實(shí)現(xiàn)微服務(wù)(三)- 業(yè)務(wù)領(lǐng)域驅(qū)動微服務(wù)設(shè)計(jì)

利用Spring Cloud實(shí)現(xiàn)微服務(wù)(二)--領(lǐng)域驅(qū)動設(shè)計(jì)

利用Spring Cloud實(shí)現(xiàn)微服務(wù)(一):Eureka服務(wù)器

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容