利用Spring Cloud实现微服务- 熔断机制
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é)點微服務(wù)的調(diào)用,快速返回錯誤的響應(yīng)信息。當(dāng)檢測到該節(jié)點微服務(wù)調(diào)用響應(yīng)正常后,恢復(fù)調(diào)用鏈路。
在Spring Cloud框架里,熔斷機(jī)制通過Hystrix實現(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. 代碼實現(xiàn)及驗證
本次代碼實現(xiàn)對RestTemplate和Feign兩種微服務(wù)調(diào)用場景下,使用Hystrix驗證Spring Cloud的熔斷機(jī)制。
2.1 RestTemplate的微服務(wù)調(diào)用場景
在第五節(jié)負(fù)載均衡,我們使用了RestTemplate實現(xiàn)了服務(wù)之間的調(diào)用。我們基于這一部分的代碼,增加Hystrix,實現(xiàn)熔斷機(jī)制。
1) 啟動Eureka-Server及LOADBALANCE-SERVICE,不要啟動Bookingcar-Service
點擊"LOADBALANCE-SERVICE"后面鏈接,進(jìn)入負(fù)載均衡驗證頁面,輸入請求參數(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ù)載均衡驗證頁面,輸入請求參數(shù)/v1/lb/testport?name=bookingcar-service,我們發(fā)現(xiàn)熔斷機(jī)制已經(jīng)發(fā)揮作用:
2.2 Feign的微服務(wù)調(diào)用場景
在上一節(jié),我們利用Feign實現(xiàn)了微服務(wù)間的內(nèi)部調(diào)用,F(xiàn)eign中也內(nèi)置了對Hystrix的支持。
1) 運(yùn)行Report,同樣不要啟動BOOKINGCAR-SERVICE
點擊REPORTING-SERVICE后面鏈接,進(jìn)入Feign驗證頁面,輸入?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,點擊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實現(xiàn)微服務(wù)(七)- 內(nèi)部調(diào)用
利用Spring Cloud實現(xiàn)微服務(wù)(六)- 服務(wù)網(wǎng)關(guān)
利用Spring Cloud實現(xiàn)微服務(wù)(五)- 負(fù)載均衡
利用Spring Cloud實現(xiàn)微服務(wù)(四)- 微服務(wù)實現(xiàn)與注冊
利用Spring Cloud實現(xiàn)微服務(wù)(三)- 業(yè)務(wù)領(lǐng)域驅(qū)動微服務(wù)設(shè)計
利用Spring Cloud實現(xiàn)微服務(wù)(二)--領(lǐng)域驅(qū)動設(shè)計
利用Spring Cloud實現(xiàn)微服務(wù)(一):Eureka服務(wù)器
作者:書興
鏈接:http://www.jianshu.com/p/0d53a9101ec6
來源:簡書
著作權(quán)歸作者所有。商業(yè)轉(zhuǎn)載請聯(lián)系作者獲得授權(quán),非商業(yè)轉(zhuǎn)載請注明出處。
總結(jié)
以上是生活随笔為你收集整理的利用Spring Cloud实现微服务- 熔断机制的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 团购网火了?
- 下一篇: 如何设置虚拟内存,让电脑运行的更快