Spring Cloud Hystrix實(shí)現(xiàn)服務(wù)容錯(cuò)的方法
Hystrix概述:
作為Spring Cloud體系內(nèi)實(shí)現(xiàn)熔斷機(jī)制的關(guān)鍵組件,Hystrix承擔(dān)著服務(wù)容錯(cuò)保護(hù)的重要職責(zé)。
它由Netflix開(kāi)源,旨在為分布式系統(tǒng)提供延遲處理和容錯(cuò)解決方案。
其核心作用在于引入延遲容忍與容錯(cuò)邏輯,精細(xì)管理分布式服務(wù)間的交互,確保系統(tǒng)的高可用性和魯棒性。
在復(fù)雜分布式系統(tǒng)環(huán)境中,往往涉及數(shù)十個(gè)應(yīng)用,這些應(yīng)用依賴于多個(gè)項(xiàng)目。
不可避免地,每個(gè)依賴項(xiàng)目都有可能在某個(gè)時(shí)刻遭遇失敗并觸發(fā)故障。
若未對(duì)這些故障實(shí)施有效隔離措施,整個(gè)分布式系統(tǒng)可能面臨崩潰風(fēng)險(xiǎn)。
在分布式系統(tǒng)中,當(dāng)某個(gè)環(huán)節(jié)出現(xiàn)延遲時(shí),可能會(huì)阻塞整個(gè)用戶請(qǐng)求。
特別是在高流量情況下,后端依賴的延遲可能迅速導(dǎo)致全部服務(wù)資源在短短幾秒內(nèi)耗盡,從而無(wú)法處理后續(xù)請(qǐng)求,使應(yīng)用發(fā)生故障。
更嚴(yán)重的是,這些問(wèn)題還可能引發(fā)服務(wù)間延遲累積,占用備份隊(duì)列、線程等關(guān)鍵資源,觸發(fā)連鎖反應(yīng)般的級(jí)聯(lián)故障。
為應(yīng)對(duì)這些挑戰(zhàn),Hystrix應(yīng)運(yùn)而生。
它通過(guò)封裝每一個(gè)依賴項(xiàng),實(shí)現(xiàn)它們之間的相互隔離。
一旦延遲發(fā)生,問(wèn)題被限制在局部資源中,并包含回退邏輯,該邏輯決定在依賴失敗時(shí)應(yīng)采取何種措施,確保系統(tǒng)的穩(wěn)定性。
第一個(gè)Hystrix程序
步驟1:創(chuàng)建父工程hystrix-1
將搭建的Eureka基本應(yīng)用中的3個(gè)子項(xiàng)目都復(fù)制到hystrix-1父工程中,并依次添加為Maven項(xiàng)目。
步驟2:改造服務(wù)提供者
在服務(wù)提供者eureka-provider中創(chuàng)建controller包,并在該包下創(chuàng)建HystrixController類,該類定義了一個(gè)demo ()方法,用于處理路徑為/demo的請(qǐng)求。
HystrixController類的內(nèi)容如下:
步驟3:改造服務(wù)消費(fèi)者為Hystrix客戶端
流程:
(1)添加Hystrix依賴
(2)添加@EnableHystrix注解
(3)創(chuàng)建Config配置類
(4)創(chuàng)建Service層類
(5)創(chuàng)建Controller層類
(1)添加Hystrix依賴
在項(xiàng)目eureka-consumer的pom文件中添加Hystrix的依賴如下:
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-hystrix</artifactId> </dependency>
添加后重新加載pom文件。
(2)添加@EnableHystrix注解
在啟動(dòng)類EurekaConsumerApplication中添加@EnableHystrix注解啟動(dòng)熔斷功能。
(3)創(chuàng)建Config配置類
在eureka-consumer中創(chuàng)建config包,并在該包下創(chuàng)建類HystrixConfig。在HystrixConfig類中注入restTemplate的Bean對(duì)象。
(4)新建service包
在service包下新建LocalItemService類
被@HystrixCommand注解修飾的demo()方法就啟動(dòng)了Hystrix熔斷器的功能fallbackMethod屬性定義的是處理回退(fallback)邏輯的方法。如果必須在fallback邏輯方法中遠(yuǎn)程調(diào)度其他服務(wù),最好在遠(yuǎn)程調(diào)度其他服務(wù)時(shí),也加上熔斷器。
注:@Autowired注解不能運(yùn)行時(shí)可換成@Resource注解,按Bean的名稱裝配。
(5)新建controller包
在controller包下新建LocalItemController類
步驟4:項(xiàng)目測(cè)試
啟動(dòng)服務(wù)并進(jìn)行測(cè)試。依次啟動(dòng)eureka-server,eureka-provider,eureka-consumer,在瀏覽器輸入http://localhost:7006/demo?name=布說(shuō),觀察瀏覽器顯示的效果。
關(guān)閉服務(wù)提供者eureka-provider,制造服務(wù)不可用的情形。再次請(qǐng)求 以上地址,觀察瀏覽器顯示的效果。
在Feign中使用Hystrix
創(chuàng)建父工程hystrix-2,將上述中的3個(gè)子項(xiàng)目都復(fù)制到hystrix-2父工程中,并依次添加為Maven項(xiàng)目。
步驟1:開(kāi)啟Hystrix熔斷
Feign自帶熔斷功能,默認(rèn)情況下,熔斷功能是關(guān)閉的。如果要開(kāi)啟熔斷,只需在配置文件中將hystrix.enabled設(shè)置為true即可。
開(kāi)啟Hystrix熔斷功能。在eureka-consumer項(xiàng)目的配置文件application.yml中添加開(kāi)啟熔斷的配置:
注:因?yàn)樵贔eign的起步依賴中引入了Hystrix依賴,所以在Feign中使用Hystrix不需要引入任何的依賴,只需要在配置文件中開(kāi)啟即可。
步驟2:開(kāi)啟Feign Client功能
因?yàn)槭褂肍eign組件調(diào)用,需要在eureka-consumer項(xiàng)目的pom文件中加入feign依賴。
在項(xiàng)目eureka-consumer的pom文件中添加Feign的依賴如下:
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> </dependency>
添加后重新加載pom文件。
在eureka-consumer的啟動(dòng)類中添加@EnableFeignClients開(kāi)啟Feign Client功能。
注:使用fallback屬性指定的用于處理回退邏輯的類,必須實(shí)現(xiàn)@FeignClient注解修飾的接口。
步驟3:修改項(xiàng)目中接口
在service包中新建失敗邏輯處理類LocalbushuoServiceImpl,并實(shí)現(xiàn)被@FeignClient修飾的LocalItemService接口。
進(jìn)入項(xiàng)目eureka-consumer,刪除掉之前的LocalItemService類。創(chuàng)建LocalItemService接口,并在上方的@FeignClient注解中,增加fallback屬性配置,指定LocalItemServiceImpl類為失敗邏輯處理類。
注:使用fallback屬性指定的用于處理回退邏輯的類,必須實(shí)現(xiàn)@FeignClient注解修飾的接口。
步驟4:項(xiàng)目測(cè)試
啟動(dòng)服務(wù)并進(jìn)行測(cè)試。依次啟動(dòng)eureka-server,eureka-provider,eureka-consumer,在瀏覽器輸入http://localhost:7006/demo?name=www,觀察瀏覽器顯示的效果。
關(guān)閉服務(wù)提供者eureka-provider,制造服務(wù)不可用的情形。再次請(qǐng)求 以上地址,觀察瀏覽器顯示的效果。
問(wèn)題
1.Hystrix 是怎么實(shí)現(xiàn)服務(wù)容錯(cuò)的?
Hystrix 主要通過(guò)以下幾點(diǎn)實(shí)現(xiàn)服務(wù)容錯(cuò):
斷路器模式:當(dāng)依賴服務(wù)頻繁失敗時(shí),斷路器會(huì)打開(kāi),直接拒絕請(qǐng)求,防止系統(tǒng)因等待響應(yīng)而耗盡資源。當(dāng)服務(wù)恢復(fù)后,斷路器會(huì)進(jìn)入半開(kāi)狀態(tài),逐步恢復(fù)請(qǐng)求。(上述程序就是)
資源隔離:使用線程池或信號(hào)量隔離來(lái)限制依賴服務(wù)的請(qǐng)求,防止一個(gè)服務(wù)的問(wèn)題影響到整個(gè)系統(tǒng)。
Fallback 機(jī)制:當(dāng)依賴服務(wù)不可用時(shí),提供一個(gè)備用響應(yīng)(Fallback),確保請(qǐng)求不會(huì)完全失敗,而是返回一個(gè)默認(rèn)值或備用結(jié)果。
超時(shí)與重試:設(shè)置請(qǐng)求超時(shí)時(shí)間,超出時(shí)間直接返回錯(cuò)誤;對(duì)于臨時(shí)故障,可以配置重試機(jī)制。
2.什么是Hystrix ?
Hystrix 是一個(gè)由 Netflix 開(kāi)發(fā)的開(kāi)源庫(kù),用于提高分布式系統(tǒng)的服務(wù)彈性和可靠性。它通過(guò)增加延遲容忍和容錯(cuò)邏輯來(lái)防止級(jí)聯(lián)故障。
主要功能包括:
斷路器:監(jiān)測(cè)依賴服務(wù)的故障,當(dāng)檢測(cè)到故障時(shí),阻止請(qǐng)求發(fā)送到有問(wèn)題的服務(wù)上,避免級(jí)聯(lián)故障。
資源隔離:使用線程池隔離或信號(hào)量隔離來(lái)限制服務(wù)調(diào)用的資源消耗,防止系統(tǒng)不穩(wěn)定。
Fallback 回退機(jī)制:配置備用響應(yīng)(Fallback),當(dāng)依賴服務(wù)故障時(shí)返回備用結(jié)果,確保請(qǐng)求不會(huì)完全失敗。
監(jiān)控與儀表盤:提供實(shí)時(shí)監(jiān)控?cái)?shù)據(jù),如延遲和錯(cuò)誤率,并通過(guò) Hystrix Dashboard 展示,幫助監(jiān)控系統(tǒng)狀態(tài)。
Hystrix 常與 Spring Cloud 集成,用于構(gòu)建高可用和高彈性的微服務(wù)架構(gòu)。盡管 Netflix 已停止維護(hù) Hystrix,但它在許多現(xiàn)有項(xiàng)目中仍然廣泛使用。
總結(jié)
每個(gè)微服務(wù)都需要獨(dú)立部署,管理多個(gè)環(huán)境和配置,這無(wú)疑增加了部署的復(fù)雜性。
由于系統(tǒng)由眾多微服務(wù)構(gòu)成,一旦發(fā)生故障,定位問(wèn)題的時(shí)間會(huì)相應(yīng)增加,監(jiān)控和故障排查的難度也隨之增大。
此外,不同微服務(wù)對(duì)資源的需求各不相同,需要合理分配以避免資源浪費(fèi)或不足。
到此這篇關(guān)于Spring Cloud Hystrix實(shí)現(xiàn)優(yōu)雅的服務(wù)容錯(cuò)的文章就介紹到這了,更多相關(guān)Spring Cloud Hystrix服務(wù)容錯(cuò)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java查詢時(shí)間段(startTime--endTime)間的數(shù)據(jù)方式
這篇文章主要介紹了Java查詢時(shí)間段(startTime--endTime)間的數(shù)據(jù)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-03-03JDK都出到14了,你有什么理由不會(huì)函數(shù)式編程(推薦)
這篇文章主要介紹了JDK都出到14了,你有什么理由不會(huì)函數(shù)式編程,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-05-05解決SpringBoot log4j日志沒(méi)生成的問(wèn)題
這篇文章主要介紹了解決SpringBoot log4j日志沒(méi)生成的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-07-07在springboot中添加mvc功能的正確姿勢(shì)講解
這篇文章主要介紹了在springboot中添加mvc功能的正確姿勢(shì),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-08-08Java使用BigDecimal精確運(yùn)算浮點(diǎn)數(shù)
這篇文章主要介紹了Java使用BigDecimal精確運(yùn)算浮點(diǎn)數(shù),幫助大家更好的處理浮點(diǎn)數(shù)數(shù)據(jù),感興趣的朋友可以了解下2020-10-10