1. 熔斷機(jī)制介紹
在介紹熔斷機(jī)制之前筑悴,我們需要了解微服務(wù)的雪崩效應(yīng)终娃。在微服務(wù)架構(gòu)中味廊,微服務(wù)是完成一個(gè)單一的業(yè)務(wù)功能蒸甜,這樣做的好處是可以做到解耦,每個(gè)微服務(wù)可以獨(dú)立演進(jìn)余佛。但是柠新,一個(gè)應(yīng)用可能會(huì)有多個(gè)微服務(wù)組成,微服務(wù)之間的數(shù)據(jù)交互通過遠(yuǎn)程過程調(diào)用完成辉巡。這就帶來一個(gè)問題恨憎,假設(shè)微服務(wù)A調(diào)用微服務(wù)B和微服務(wù)C,微服務(wù)B和微服務(wù)C又調(diào)用其它的微服務(wù)郊楣,這就是所謂的“扇出”憔恳。如果扇出的鏈路上某個(gè)微服務(wù)的調(diào)用響應(yīng)時(shí)間過長(zhǎng)或者不可用,對(duì)微服務(wù)A的調(diào)用就會(huì)占用越來越多的系統(tǒng)資源净蚤,進(jìn)而引起系統(tǒng)崩潰钥组,所謂的“雪崩效應(yīng)”。
熔斷機(jī)制是應(yīng)對(duì)雪崩效應(yīng)的一種微服務(wù)鏈路保護(hù)機(jī)制今瀑。我們?cè)诟鞣N場(chǎng)景下都會(huì)接觸到熔斷這兩個(gè)字程梦。高壓電路中,如果某個(gè)地方的電壓過高橘荠,熔斷器就會(huì)熔斷屿附,對(duì)電路進(jìn)行保護(hù)。股票交易中哥童,如果股票指數(shù)過高挺份,也會(huì)采用熔斷機(jī)制,暫停股票的交易贮懈。同樣匀泊,在微服務(wù)架構(gòu)中,熔斷機(jī)制也是起著類似的作用朵你。當(dāng)扇出鏈路的某個(gè)微服務(wù)不可用或者響應(yīng)時(shí)間太長(zhǎng)時(shí)探赫,會(huì)進(jìn)行服務(wù)的降級(jí),進(jìn)而熔斷該節(jié)點(diǎn)微服務(wù)的調(diào)用撬呢,快速返回錯(cuò)誤的響應(yīng)信息。當(dāng)檢測(cè)到該節(jié)點(diǎn)微服務(wù)調(diào)用響應(yīng)正常后妆兑,恢復(fù)調(diào)用鏈路魂拦。
在Spring Cloud框架里,熔斷機(jī)制通過Hystrix實(shí)現(xiàn)搁嗓。Hystrix會(huì)監(jiān)控微服務(wù)間調(diào)用的狀況芯勘,當(dāng)失敗的調(diào)用到一定閾值,缺省是5秒內(nèi)20次調(diào)用失敗腺逛,就會(huì)啟動(dòng)熔斷機(jī)制荷愕。熔斷機(jī)制的注解是@HystrixCommand,Hystrix會(huì)找有這個(gè)注解的方法,并將這類方法關(guān)聯(lián)到和熔斷器連在一起的代理上安疗。當(dāng)前抛杨,@HystrixCommand僅當(dāng)類的注解為@Service或@Component時(shí)才會(huì)發(fā)揮作用。
上一節(jié)中荐类,我們提到怖现,微服務(wù)之間的調(diào)用可以通過兩種方式,一個(gè)是RestTemplate玉罐,另一個(gè)是Feign屈嗤。相對(duì)應(yīng),在這兩種調(diào)用方式下吊输,都有Hystrix調(diào)用方法饶号。
2. 代碼實(shí)現(xiàn)及驗(yàn)證
本次代碼實(shí)現(xiàn)對(duì)RestTemplate和Feign兩種微服務(wù)調(diào)用場(chǎng)景下,使用Hystrix驗(yàn)證Spring Cloud的熔斷機(jī)制季蚂。
2.1 RestTemplate的微服務(wù)調(diào)用場(chǎng)景
在第五節(jié)負(fù)載均衡茫船,我們使用了RestTemplate實(shí)現(xiàn)了服務(wù)之間的調(diào)用。我們基于這一部分的代碼癣蟋,增加Hystrix透硝,實(shí)現(xiàn)熔斷機(jī)制。
1) 啟動(dòng)Eureka-Server及LOADBALANCE-SERVICE疯搅,不要啟動(dòng)Bookingcar-Service
點(diǎn)擊"LOADBALANCE-SERVICE"后面鏈接濒生,進(jìn)入負(fù)載均衡驗(yàn)證頁面,輸入請(qǐng)求參數(shù)/v1/lb/testport?name=bookingcar-service幔欧,我們會(huì)在頁面上得到以下的錯(cuò)誤提示:
2)? 在pom.xml里罪治,添加對(duì)Hystrix的依賴
3)在ribbon-service入口程序RibbonServiceApplication.java處添加注解@EnableCircuitBreaker,開啟熔斷器功能礁蔗,如下所示:
4) 在LoadBalanceService.java里觉义,使用了@Service注解聲明了LoadBalanceService類。我們?cè)贚oadBalanceService類里通過@HystrixCommand注解引入對(duì)TestPort調(diào)用的熔斷機(jī)制浴井,@HystrixCommand注解里可以添加回調(diào)函數(shù)晒骇,如@HystrixCommand(callbackCommand = "XXX“),當(dāng)無法調(diào)用TestPort服務(wù)時(shí)磺浙,熔斷機(jī)制的回調(diào)函數(shù)就會(huì)發(fā)生作用洪囤,對(duì)錯(cuò)誤進(jìn)行快速處理。
5) 重新啟動(dòng)LOADBALANCE-SERVICE撕氧, 再次進(jìn)入負(fù)載均衡驗(yàn)證頁面瘤缩,輸入請(qǐng)求參數(shù)/v1/lb/testport?name=bookingcar-service,我們發(fā)現(xiàn)熔斷機(jī)制已經(jīng)發(fā)揮作用:
2.2 Feign的微服務(wù)調(diào)用場(chǎng)景
在上一節(jié)伦泥,我們利用Feign實(shí)現(xiàn)了微服務(wù)間的內(nèi)部調(diào)用剥啤,F(xiàn)eign中也內(nèi)置了對(duì)Hystrix的支持锦溪。
1) 運(yùn)行Report,同樣不要啟動(dòng)BOOKINGCAR-SERVICE
點(diǎn)擊REPORTING-SERVICE后面鏈接府怯,進(jìn)入Feign驗(yàn)證頁面刻诊,輸入?yún)?shù)v1/order/1,我們可以看到如下的錯(cuò)誤提醒頁面:
2) 在application.properties里富腊,添加feign.hystrix.enabled=true坏逢,使能Feign對(duì)hystrix的支持月而,如下所示:
3)在pom.xml里惹谐,添加對(duì)Hystrix的依賴
4) 在Report的入口程序ReportsApplication里,添加注解@EnableCircuitBreaker拭嫁,開啟熔斷器功能民假,如下所示:
5) 在OrderClient.java里Feign的注解里浮入,添加回調(diào)函數(shù)的參數(shù)
6) 添加一個(gè)新的類OrderClientHystrix,當(dāng)調(diào)用微服務(wù)發(fā)生錯(cuò)誤時(shí)羊异,進(jìn)行處理事秀,本示例中,會(huì)返回“Hystrix works in Feign”的信息野舶。
7)重新運(yùn)行Report易迹,點(diǎn)擊REPORTING-SERVICE后面鏈接,輸入請(qǐng)求參數(shù)v1/order/1,我們發(fā)現(xiàn)熔斷機(jī)制已經(jīng)發(fā)揮作用平道,顯示如下:
3. 總結(jié):
微服務(wù)本身是一種分布式架構(gòu)睹欲,當(dāng)調(diào)用鏈路過長(zhǎng)時(shí),系統(tǒng)的可用性是很大的挑戰(zhàn)一屋。Spring Cloud框架的Hystrix提供了熔斷機(jī)制窘疮,在RestTemplate和Feign兩種對(duì)微服務(wù)調(diào)用的場(chǎng)景下都可以使用,當(dāng)調(diào)用鏈路出現(xiàn)問題時(shí)可以快速進(jìn)行服務(wù)降級(jí)處理冀墨,為我們提高微服務(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)與注冊(cè)
利用Spring Cloud實(shí)現(xiàn)微服務(wù)(三)- 業(yè)務(wù)領(lǐng)域驅(qū)動(dòng)微服務(wù)設(shè)計(jì)
利用Spring Cloud實(shí)現(xiàn)微服務(wù)(二)--領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)