這篇文章主要介紹“怎么理解Spring Cloud Hystrix熔斷”,在日常操作中,相信很多人在怎么理解Spring Cloud Hystrix熔斷問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”怎么理解Spring Cloud Hystrix熔斷”的疑惑有所幫助!接下來,請跟著小編一起來學(xué)習(xí)吧!
創(chuàng)新互聯(lián)長期為數(shù)千家客戶提供的網(wǎng)站建設(shè)服務(wù),團隊從業(yè)經(jīng)驗10年,關(guān)注不同地域、不同群體,并針對不同對象提供差異化的產(chǎn)品和服務(wù);打造開放共贏平臺,與合作伙伴共同營造健康的互聯(lián)網(wǎng)生態(tài)環(huán)境。為碑林企業(yè)提供專業(yè)的成都做網(wǎng)站、成都網(wǎng)站制作,碑林網(wǎng)站改版等技術(shù)服務(wù)。擁有十多年豐富建站經(jīng)驗和眾多成功案例,為您定制開發(fā)。
在一個家庭中有各種各樣的家電,我們假設(shè)每個家電都沒有保險絲,一旦有一天某個家電出現(xiàn)短路,造成整個電路短路然后很有可能就把整個家庭的電器及電路給燒壞了。但如果每個家電入口線路都有一個保險絲(斷路器),那么不管那個家電發(fā)生短路這個家電的保險絲就會快速熔斷(斷開電路),從而保護了整個電路及電路上其它的家電的正常運行。
軟件行業(yè)里面的熔斷機制與這個一致,在整個微服務(wù)集群中,由于其中一個或者幾個微服務(wù)出現(xiàn)故障或堵塞,若沒有快速的熔斷機制,就會造成整個微服務(wù)集群的擁堵最終整個微服務(wù)出現(xiàn)雪崩被拖死。熔斷機制的核心機制就是在確保某個微服務(wù)出現(xiàn)故障的時候?qū)崿F(xiàn)快速熔斷(斷路)或者服務(wù)降級快速失敗,避免擁堵。從而保證其它業(yè)務(wù)其它服務(wù)的正常運行。
防止單個服務(wù)的故障,耗盡整個系統(tǒng)服務(wù)的容器(比如tomcat)的線程資源,避免分布式環(huán)境里大量級聯(lián)失敗。通過第三方客戶端訪問(通常是通過網(wǎng)絡(luò))依賴服務(wù)出現(xiàn)失敗、拒絕、超時或短路時執(zhí)行回退邏輯。
用快速失敗代替排隊(每個依賴服務(wù)維護一個小的線程池或信號量,當(dāng)線程池滿或信號量滿,會立即拒絕服務(wù)而不會排隊等待)和優(yōu)雅的服務(wù)降級;當(dāng)依賴服務(wù)失效后又恢復(fù)正常,快速恢復(fù)。
提供接近實時的監(jiān)控和警報,從而能夠快速發(fā)現(xiàn)故障和修復(fù)。監(jiān)控信息包括請求成功,失?。蛻舳藪伋龅漠惓#瑫r和線程拒絕。如果訪問依賴服務(wù)的錯誤百分比超過閾值,斷路器會跳閘,此時服務(wù)會在一段時間內(nèi)停止對特定服務(wù)的所有請求。
將所有請求外部系統(tǒng)(或請求依賴服務(wù))封裝到HystrixCommand或HystrixObservableCommand對象中,然后這些請求在一個獨立的線程中執(zhí)行。使用隔離技術(shù)來限制任何一個依賴的失敗對系統(tǒng)的影響。每個依賴服務(wù)維護一個小的線程池(或信號量),當(dāng)線程池滿或信號量滿,會立即拒絕服務(wù)而不會排隊等待。
請求熔斷: 當(dāng)Hystrix Command請求后端服務(wù)失敗數(shù)量超過一定比例(默認50%), 斷路器會切換到開路狀態(tài)(Open). 這時所有請求會直接失敗而不會發(fā)送到后端服務(wù). 斷路器保持在開路狀態(tài)一段時間后(默認5秒), 自動切換到半開路狀態(tài)(HALF-OPEN)。這時會判斷下一次請求的返回情況, 如果請求成功, 斷路器切回閉路狀態(tài)(CLOSED), 否則重新切換到開路狀態(tài)(OPEN). Hystrix的斷路器就像我們家庭電路中的保險絲, 一旦后端服務(wù)不可用, 斷路器會直接切斷請求鏈, 避免發(fā)送大量無效請求影響系統(tǒng)吞吐量, 并且斷路器有自我檢測并恢復(fù)的能力。
服務(wù)降級:Fallback相當(dāng)于是降級操作. 對于查詢操作, 我們可以實現(xiàn)一個fallback方法, 當(dāng)請求后端服務(wù)出現(xiàn)異常的時候, 可以使用fallback方法返回的值. fallback方法的返回值一般是設(shè)置的默認值或者來自緩存。
依賴隔離(采用艙壁模式,Docker就是艙壁模式的一種):在Hystrix中, 主要通過線程池來實現(xiàn)資源隔離. 通常在使用的時候我們會根據(jù)調(diào)用的遠程服務(wù)劃分出多個線程池.比如說,一個服務(wù)調(diào)用另外兩個服務(wù),你如果調(diào)用兩個服務(wù)都用一個線程池,那么如果一個服務(wù)卡在哪里,資源沒被釋放后面的請求又來了,導(dǎo)致后面的請求都卡在哪里等待,導(dǎo)致你依賴的A服務(wù)把你卡在哪里,耗盡了資源,也導(dǎo)致了你另外一個B服務(wù)也不可用了。這時如果依賴隔離,某一個服務(wù)調(diào)用A B兩個服務(wù),如果這時我有100個線程可用,我給A服務(wù)分配50個,給B服務(wù)分配50個,這樣就算A服務(wù)掛了,我的B服務(wù)依然可以用。
請求緩存:比如一個請求過來請求我userId=1的數(shù)據(jù),你后面的請求也過來請求同樣的數(shù)據(jù),這時我不會繼續(xù)走原來的那條請求鏈路了,而是把第一次請求緩存過了,把第一次的請求結(jié)果返回給后面的請求(參考@CacheResult、@CacheKey、@CacheRemove注解)。
請求合并:我依賴于某一個服務(wù),我要調(diào)用N次,比如說查數(shù)據(jù)庫的時候,我發(fā)了N條請求發(fā)了N條SQL然后拿到一堆結(jié)果,這時候我們可以把多個請求合并成一個請求,發(fā)送一個查詢多條數(shù)據(jù)的SQL的請求,這樣我們只需查詢一次數(shù)據(jù)庫,提升了效率。
在Hystrix 中我們用的比較多的是前三點,后面兩點并不適用于所有業(yè)務(wù)。
添加 `spring-cloud-starter-hystrix`模塊,實際使用過程中我們使用了Feign后已經(jīng)包含了Hystrix模塊及Ribbon模塊,不需要單獨引入。
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-hystrix</artifactId> </dependency>
在啟動類中加入@EnableCircuitBreaker注解,表示允許斷路器。如下代碼所示:
//允許斷路器 @EnableCircuitBreaker public class Application { ... }
在spring cloud 項目中使用 `@SpringCloudApplication` 注解后已經(jīng)包含了`@EnableCircuitBreaker` 注解及其它微服務(wù)注解,看源碼:
@Target({ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) @Documented @Inherited @SpringBootApplication @EnableDiscoveryClient @EnableCircuitBreaker public @interface SpringCloudApplication { }
Spring cloud 采用http進行通訊,spring cloud 結(jié)合Eureka針對http請求響應(yīng)操作做了封裝,支持兩種方式,RestTemplate 及 Feign 模式,F(xiàn)eign模式參考其它章節(jié),這里簡單介紹RestTemplate模式。
@Service public class HelloService { @Autowired private RestTemplate restTemplate; //請求熔斷注解,當(dāng)服務(wù)出現(xiàn)問題時候會執(zhí)行fallbackMetho屬性的名為helloFallBack的方法 @HystrixCommand(fallbackMethod = "helloFallBack") public String helloService() throws ExecutionException, InterruptedException { return restTemplate.getForEntity("http://HELLO-SERVICE/hello",String.class).getBody(); } public String helloFallBack(){ return "error"; } }
這是一個外部服務(wù)調(diào)用的restTemplate實現(xiàn),通過 @HystrixCommand(fallbackMethod = "helloFallBack") 標志這個方法開啟熔斷機制, 指定熔斷后服務(wù)降級方法為:helloFallBack()。此時若被調(diào)用方異常,接下來請求都會進入服務(wù)降級實現(xiàn)(回調(diào)方法)并快速失敗。@HystrixCommand 也可以指定其它配置:
public @interface HystrixCommand { String groupKey() default ""; String commandKey() default ""; String threadPoolKey() default ""; String fallbackMethod() default ""; HystrixProperty[] commandProperties() default {}; HystrixProperty[] threadPoolProperties() default {}; Class<? extends Throwable>[] ignoreExceptions() default {}; ObservableExecutionMode observableExecutionMode() default ObservableExecutionMode.EAGER; HystrixException[] raiseHystrixExceptions() default {}; String defaultFallback() default ""; }
讓我們來逐個介紹下@HystrixCommand注解的各個參數(shù):
commandKey:配置全局唯一標識服務(wù)的名稱,比如,庫存系統(tǒng)有一個獲取庫存服務(wù),那么就可以為這個服務(wù)起一個名字來唯一識別該服務(wù),如果不配置,則默認是@HystrixCommand注解修飾的函數(shù)的函數(shù)名。
groupKey:一個比較重要的注解,配置全局唯一標識服務(wù)分組的名稱,比如,庫存系統(tǒng)就是一個服務(wù)分組。通過設(shè)置分組,Hystrix會根據(jù)組來組織和統(tǒng)計命令的告、儀表盤等信息。Hystrix命令默認的線程劃分也是根據(jù)命令組來實現(xiàn)。默認情況下,Hystrix會讓相同組名的命令使用同一個線程池,所以我們需要在創(chuàng)建Hystrix命令時為其指定命令組來實現(xiàn)默認的線程池劃分。此外,Hystrix還提供了通過設(shè)置threadPoolKey來對線程池進行設(shè)置。建議最好設(shè)置該參數(shù),使用threadPoolKey來控制線程池組。
threadPoolKey:對線程池進行設(shè)定,細粒度的配置,相當(dāng)于對單個服務(wù)的線程池信息進行設(shè)置,也可多個服務(wù)設(shè)置同一個threadPoolKey構(gòu)成線程組。
fallbackMethod:@HystrixCommand注解修飾的函數(shù)的回調(diào)函數(shù),@HystrixCommand修飾的函數(shù)必須和這個回調(diào)函數(shù)定義在同一個類中,因為定義在了同一個類中,所以fackback method可以是public/private均可。
commandProperties:配置該命令的一些參數(shù),如executionIsolationStrategy配置執(zhí)行隔離策略,默認是使用線程隔離,此處我們配置為THREAD,即線程池隔離。參見:com.netflix.hystrix.HystrixCommandProperties中各個參數(shù)的定義。
threadPoolProperties:線程池相關(guān)參數(shù)設(shè)置,具體可以設(shè)置哪些參數(shù)請見:com.netflix.hystrix.HystrixThreadPoolProperties
ignoreExceptions:調(diào)用服務(wù)時,除了HystrixBadRequestException之外,其他@HystrixCommand修飾的函數(shù)拋出的異常均會被Hystrix認為命令執(zhí)行失敗而觸發(fā)服務(wù)降級的處理邏輯(調(diào)用fallbackMethod指定的回調(diào)函數(shù)),所以當(dāng)需要在命令執(zhí)行中拋出不觸發(fā)降級的異常時來使用它,通過這個參數(shù)指定,哪些異常拋出時不觸發(fā)降級(不去調(diào)用fallbackMethod),而是將異常向上拋出。
observableExecutionMode:定義hystrix observable command的模式;
raiseHystrixExceptions:任何不可忽略的異常都包含在HystrixRuntimeException中;
defaultFallback:默認的回調(diào)函數(shù),該函數(shù)的函數(shù)體不能有入?yún)?,返回值類型與@HystrixCommand修飾的函數(shù)體的返回值一致。如果指定了fallbackMethod,則fallbackMethod優(yōu)先級更高。
給個例子:
@HystrixCommand(commandKey = "testCommand", groupKey = "testGroup", threadPoolKey = "testThreadKey", fallbackMethod = "hiConsumerFallBack", ignoreExceptions = {NullPointerException.class}, threadPoolProperties = { @HystrixProperty(name = "coreSize", value = "30"), @HystrixProperty(name = "maxQueueSize", value = "101"), @HystrixProperty(name = "keepAliveTimeMinutes", value = "2"), @HystrixProperty(name = "queueSizeRejectionThreshold", value = "15"), @HystrixProperty(name = "metrics.rollingStats.numBuckets", value = "12"), @HystrixProperty(name = "metrics.rollingStats.timeInMilliseconds", value = "1440") } )
到此,關(guān)于“怎么理解Spring Cloud Hystrix熔斷”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識,請繼續(xù)關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編會繼續(xù)努力為大家?guī)砀鄬嵱玫奈恼拢?/p>
分享名稱:怎么理解SpringCloudHystrix熔斷
轉(zhuǎn)載來源:http://jinyejixie.com/article26/pgeocg.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供建站公司、網(wǎng)站導(dǎo)航、網(wǎng)站改版、網(wǎng)站營銷、品牌網(wǎng)站建設(shè)、網(wǎng)站收錄
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)