Spring中使用Hystrix實(shí)現(xiàn)熔斷詳解
Hystrix實(shí)現(xiàn)熔斷
在使用Hystrix實(shí)現(xiàn)熔斷的過(guò)程中遇到了兩個(gè)問(wèn)題
1、在修改了熔斷配置之后不生效的問(wèn)題
2、熔斷后不恢復(fù)的問(wèn)題
對(duì)于第一個(gè)問(wèn)題,查看hystrix源碼可以看到,如果有緩存配置是優(yōu)先使用的緩存的,因此如果配置更新,必須要更新緩存,不能使用Hystrix.reset()方法來(lái)更新緩存,這個(gè)方法清理全局緩存,會(huì)影響其他commandkey的熔斷狀態(tài)。
public static HystrixCircuitBreaker getInstance(HystrixCommandKey key, HystrixCommandGroupKey group, HystrixCommandProperties properties, HystrixCommandMetrics metrics) { // this should find it for all but the first time HystrixCircuitBreaker previouslyCached = circuitBreakersByCommand.get(key.name()); if (previouslyCached != null) { return previouslyCached; }
官方提供的方法是通過(guò)archaius動(dòng)態(tài)更新
Hystrix uses Archaius for the default implementation of properties for configuration.
實(shí)現(xiàn)接口com.netflix.config.PolledConfigurationSource,將對(duì)應(yīng)的commandkey通過(guò)形如下面的key來(lái)放入poll方法響應(yīng)的map中,hystrix會(huì)根據(jù)這個(gè)key自動(dòng)更新緩存
hystrix.command.HystrixCommandKey.execution.isolation.thread.timeoutInMilliseconds
第二個(gè)問(wèn)題經(jīng)過(guò)debughystrix源碼發(fā)現(xiàn)是由于,使用了響應(yīng)式的調(diào)用,hystrix使用的是V1版本的rxjava,而項(xiàng)目使用的是V3版本的rxjava,在V3轉(zhuǎn)V1后響應(yīng)給hystrixcircuitbreaker時(shí),hystrix沒(méi)有收到oncomplete事件,導(dǎo)致沒(méi)有在斷路器半開(kāi)狀態(tài)時(shí)調(diào)用成功關(guān)閉斷路器。
在com.netflix.hystrix.AbstractCommand類中實(shí)現(xiàn)了斷路器的控制邏輯:
可以看到在onCompleted的觀察者邏輯中會(huì)將斷路器markSuccess
private Observable<R> executeCommandAndObserve(final AbstractCommand<R> _cmd) { final HystrixRequestContext currentRequestContext = HystrixRequestContext.getContextForCurrentThread(); final Action1<R> markEmits = new Action1<R>() { @Override public void call(R r) { if (shouldOutputOnNextEvents()) { executionResult = executionResult.addEvent(HystrixEventType.EMIT); eventNotifier.markEvent(HystrixEventType.EMIT, commandKey); } if (commandIsScalar()) { long latency = System.currentTimeMillis() - executionResult.getStartTimestamp(); eventNotifier.markCommandExecution(getCommandKey(), properties.executionIsolationStrategy().get(), (int) latency, executionResult.getOrderedList()); eventNotifier.markEvent(HystrixEventType.SUCCESS, commandKey); executionResult = executionResult.addEvent((int) latency, HystrixEventType.SUCCESS); circuitBreaker.markSuccess(); } } }; final Action0 markOnCompleted = new Action0() { @Override public void call() { if (!commandIsScalar()) { long latency = System.currentTimeMillis() - executionResult.getStartTimestamp(); eventNotifier.markCommandExecution(getCommandKey(), properties.executionIsolationStrategy().get(), (int) latency, executionResult.getOrderedList()); eventNotifier.markEvent(HystrixEventType.SUCCESS, commandKey); executionResult = executionResult.addEvent((int) latency, HystrixEventType.SUCCESS); circuitBreaker.markSuccess(); } } };
目前想到的解決辦法是一種是在接收調(diào)用服務(wù)響應(yīng)時(shí)blockingfirst(),但是這樣會(huì)導(dǎo)致異步調(diào)用變成同步,還有一種是在調(diào)用服務(wù)的Observable的onnext方法中添加onCompleted事件,來(lái)通知hystrix調(diào)用服務(wù)接收到了complete事件,但是這樣就只能接收到單個(gè)onNext事件,兩種都有缺點(diǎn),還有想到更好的解決辦法。
到此這篇關(guān)于Spring中使用Hystrix實(shí)現(xiàn)熔斷詳解的文章就介紹到這了,更多相關(guān)Hystrix實(shí)現(xiàn)熔斷內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- 淺談一下SpringCloud中Hystrix服務(wù)熔斷和降級(jí)原理
- SpringCloud實(shí)現(xiàn)服務(wù)調(diào)用feign與熔斷hystrix和網(wǎng)關(guān)gateway詳細(xì)分析
- SpringCloud Hystrix熔斷器使用方法介紹
- SpringCloud集成Hystrix熔斷過(guò)程分步分解
- SpringCloud微服務(wù)熔斷器Hystrix使用詳解
- Open-Feign整合hystrix降級(jí)熔斷實(shí)戰(zhàn)記錄
- 如何自定義feign調(diào)用實(shí)現(xiàn)hystrix超時(shí)、異常熔斷
相關(guān)文章
Spring Cloud升級(jí)最新Finchley版本的所有坑
這篇文章主要介紹了Spring Cloud升級(jí)最新Finchley版本的所有坑,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-08-08Java數(shù)據(jù)結(jié)構(gòu)之優(yōu)先級(jí)隊(duì)列(堆)圖文詳解
優(yōu)先級(jí)隊(duì)列是比棧和隊(duì)列更專用的結(jié)構(gòu),在多數(shù)情況下都非常有用,下面這篇文章主要給大家介紹了關(guān)于Java數(shù)據(jù)結(jié)構(gòu)之優(yōu)先級(jí)隊(duì)列(堆)的相關(guān)資料,需要的朋友可以參考下2022-03-03mybatis水平分表實(shí)現(xiàn)動(dòng)態(tài)表名的項(xiàng)目實(shí)例
本文主要介紹了mybatis水平分表實(shí)現(xiàn)動(dòng)態(tài)表名的項(xiàng)目實(shí)例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-07-07spring cloud gateway網(wǎng)關(guān)路由分配代碼實(shí)例解析
這篇文章主要介紹了spring cloud gateway網(wǎng)關(guān)路由分配代碼實(shí)例解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-01-01