SpringCould中的Hystrix
點擊上方藍色字體,選擇“標星公眾號”
優(yōu)質(zhì)文章,第一時間送達
? 作者?|??MXC肖某某
來源 |? urlify.cn/mIBF3a
一、簡介
源碼地址:https://gitee.com/xiaocheng0902/my-cloud.git
1,定義
Hystrix是一個用于處理分布式系統(tǒng)的延遲和容錯的開源庫,在分布式系統(tǒng)里,許多依賴不可避免的會調(diào)用失敗,比如超時、異常等。Hystrix能夠保證在一個依賴出問題的情況下,不會導(dǎo)致整體服務(wù)失敗,避免級聯(lián)故障,以提高分布式系統(tǒng)的彈性。
"斷路器"本身是一種開關(guān)裝置,當(dāng)某個服務(wù)單元發(fā)生故障之后,通過斷路器的故障監(jiān)控(類似熔斷保險絲),向調(diào)用方返回一個符合預(yù)期的、可處理的備選響應(yīng)(FallBack),而不是長時間的等待或者拋出調(diào)用方無法處理的異常,這樣就保證了服務(wù)調(diào)用方的線程不會被長時間的、不必要地占用,從而避免了故障在分布式系統(tǒng)中的蔓延,乃至雪崩。
2,作用
a)服務(wù)降級
服務(wù)降級是從整個系統(tǒng)的負荷情況出發(fā)和考慮的,對某些負荷會比較高的情況,為了預(yù)防某些功能(業(yè)務(wù)場景)出現(xiàn)負荷過載或者響應(yīng)慢的情況,在其內(nèi)部暫時舍棄對一些非核心的接口和數(shù)據(jù)的請求,而直接返回一個提前準備好的fallback(退路)錯誤處理信息。這樣,雖然提供的是一個有損的服務(wù),但卻保證了整個系統(tǒng)的穩(wěn)定性和可用性
b)服務(wù)熔斷
服務(wù)熔斷的作用類似于我們家用的保險絲,當(dāng)某服務(wù)出現(xiàn)不可用或響應(yīng)超時的情況時,為了防止整個系統(tǒng)出現(xiàn)雪崩,暫時停止對該服務(wù)的調(diào)用。
c)熔斷vs降級
3,使用依賴
???org.springframework.cloud
???spring-cloud-starter-netflix-hystrix
???2.2.1.RELEASE
二、服務(wù)降級
1,服務(wù)提供者(自身)
對應(yīng)源碼:cloud-provider-hystrix-payment8001
在主啟動類Application上注解
@EnableCircuitBreaker
在service的方法中加入
//主方法
@HystrixCommand(fallbackMethod?=?"paymentInfo_TimeOutHandler",commandProperties?=?{?//出現(xiàn)超時,異常調(diào)用fallbackMethod方法
????????@HystrixProperty(name?=?"execution.isolation.thread.timeoutInMilliseconds",value?=?"3000")??//3秒鐘以內(nèi)就是正常的業(yè)務(wù)邏輯
})
public?String?paymentInfo_TimeOut(Integer?id){
????int?timeNumber?=?5;??//1?的時候為正常執(zhí)行當(dāng)前方法
????//throw?new?RuntimeException();??//異常情況會直接跳過進入paymentInfo_TimeOutHandler
????try?{?TimeUnit.SECONDS.sleep(timeNumber);?}catch?(Exception?e)?{e.printStackTrace();}
????return?"線程池:"+Thread.currentThread().getName()+"?? paymentInfo_TimeOut,id:??"+id+"\t"+"嗚嗚嗚"+"?耗時(秒)"+timeNumber;
}
//備選方法
public?String?paymentInfo_TimeOutHandler(Integer?id){
????return?"線程池:"+Thread.currentThread().getName()+"???系統(tǒng)繁忙, 請稍候再試? ,id:??"+id+"\t"+"哭了哇嗚";
}
2,服務(wù)調(diào)用者(fegin消費者)
對應(yīng)源碼:cloud-consumer-feign-hystrix-order80
yaml文件中添加配置
feign:
??hystrix:
????enabled:?true?#如果處理自身的容錯就開啟。開啟方式與生產(chǎn)端不一樣。
??client:
????config:
??????default:
????????connectTimeout:?5000?#?feign?的超時設(shè)置
????????readTimeout:?5000?#同時配置一下feign的讀取?超時
#超時時間配置,此處全局超時配置時間大于@HystrixProperty配置時間后,@HystrixProperty注解中的超時才生效
hystrix:
??command:
????default:
??????execution:
????????isolation:
??????????thread:
????????????timeoutInMilliseconds:?10000
主啟動類Application上加上注解
@EnableHystrix業(yè)務(wù)類controller中加入
//主方法
@GetMapping("/consumer/payment/hystrix/timeout/{id}")
@HystrixCommand(fallbackMethod?=?"paymentTimeOutFallbackMethod",commandProperties?=?{
????????@HystrixProperty(name="execution.isolation.thread.timeoutInMilliseconds",?value="1500")//1.5秒鐘以內(nèi)就是正常的業(yè)務(wù)邏輯
})
public?String?paymentInfo_TimeOut(@PathVariable("id")?Integer?id){
????String?result?=?paymentHystrixService.paymentInfo_TimeOut(id);
????return?result;
}
//備用方法
public?String?paymentTimeOutFallbackMethod(@PathVariable("id")?Integer?id){
????return?"我是消費者80,對付支付系統(tǒng)繁忙請10秒鐘后再試或者自己運行出錯請檢查自己,(┬_┬)";
}
3,全局服務(wù)降級(feign消費端)
對應(yīng)源碼:cloud-consumer-feign-hystrix-order80
解決主方法一個備用方法的代碼冗余。(源碼同上)
yaml文件中添加配置
feign:
??hystrix:
????enabled:?true?#如果處理自身的容錯就開啟。開啟方式與生產(chǎn)端不一樣。
??client:
????config:
??????default:
????????connectTimeout:?5000?#?feign?的超時設(shè)置
????????readTimeout:?5000?#同時配置一下feign的讀取?超時
#超時時間配置,此處全局超時配置時間大于@HystrixProperty配置時間后,@HystrixProperty注解中的超時才生效
hystrix:
??command:
????default:
??????execution:
????????isolation:
??????????thread:
????????????timeoutInMilliseconds:?10000
主啟動類Application上加上注解
@EnableHystrix 業(yè)務(wù)類controller中編碼
@RestController@DefaultProperties(defaultFallback="paymentGobalFallbackMethod",?commandProperties?=?{
????????//如果commandProperties沒有對應(yīng)的內(nèi)容就會走默認的HystrixCommandProperties中的配置
????????@HystrixProperty(name?=?"execution.isolation.thread.timeoutInMilliseconds",?value?=?"1500")})
public?class?OrderHystrixController?{
????@Resource
????private?PaymentHystrixService?paymentHystrixService;
????//主方法
????@GetMapping("/consumer/payment/hystrix/timeout/{id}")
????@HystrixCommand?//標識走全局的備用策略
????public?String?paymentInfo_TimeOut(@PathVariable("id")?Integer?id)?{
????????String?result?=?paymentHystrixService.paymentInfo_TimeOut(id);
????????return?result;
????}
????//全局備用方法
????public?String?paymentGobalFallbackMethod()?{
????????return?"Gobal全局備選方法,對象系統(tǒng)繁忙或者已經(jīng)down機了,請稍后再試";
????}
}
4,降級分離(feign消費端)
對應(yīng)源碼:cloud-consumer-feign-hystrix-order80
yaml文件配置
feign:
??hystrix:
????enabled:?true?#如果處理自身的容錯就開啟。開啟方式與生產(chǎn)端不一樣feign調(diào)用的接口
@Component
@FeignClient(value?=?"CLOUD-PROVIDER-HYSTRIX-PAYMENT",fallback?=?PaymentHystrixFallbackServiceImpl.class)?//配置對應(yīng)的fallback的類
public?interface?PaymentHystrixFallbackService?{
????@GetMapping("/payment/hystrix/ok/{id}")
????public?String?paymentInfo_OK(@PathVariable("id")?Integer?id);
????@GetMapping("/payment/hystrix/timeout/{id}")
????public?String?paymentInfo_TimeOut(@PathVariable("id")?Integer?id);
}
feign調(diào)用接口的實現(xiàn)類
/**
?*?fallback類,用于承載整個類的降級處理
?*/
@Component
public?class?PaymentHystrixFallbackServiceImpl?implements?PaymentHystrixFallbackService?{
????@Override
????public?String?paymentInfo_OK(Integer?id)?{
????????return?"-----PaymentFallbackService?fall?back-paymentInfo_OK?,?(┬_┬)";
????}
????@Override
????public?String?paymentInfo_TimeOut(Integer?id)?{
????????return?"-----PaymentFallbackService?fall?back-paymentInfo_TimeOut?,?(┬_┬)";
????}
}
controller中正常調(diào)用即可
@Slf4j
@RestController
public?class?OrderHystrixControllerFallbackClass?{
????@Resource
????private?PaymentHystrixFallbackService?paymentHystrixFallbackService;
????@Value("${server.port}")
????private?String?serverPort;
????@GetMapping("/consumer_all/payment/hystrix/ok/{id}")
????public?String?paymentInfo_OK(@PathVariable("id")?Integer?id)?{
????????String?result?=?paymentHystrixFallbackService.paymentInfo_OK(id);
????????log.info("*******result:"?+?result);
????????return?result;
????}
????@GetMapping("/consumer_all/payment/hystrix/timeout/{id}")
????public?String?paymentInfo_TimeOut(@PathVariable("id")?Integer?id)?{
????????String?result?=?paymentHystrixFallbackService.paymentInfo_TimeOut(id);
????????return?result;
????}
}
三、服務(wù)熔斷
熔斷機制是應(yīng)對雪崩效應(yīng)的一種微服務(wù)鏈路保護機制。當(dāng)扇出鏈路的某個微服務(wù)出錯不可用或者響應(yīng)時間太長時,會進行服務(wù)的降級,進而熔斷該節(jié)點微服務(wù)的調(diào)用,快速返回錯誤的響應(yīng)信息。當(dāng)檢測到該節(jié)點微服務(wù)調(diào)用響應(yīng)正常后,恢復(fù)調(diào)用鏈路。
1,實例(提供端)
源碼:cloud-provider-hystrix-payment8001
啟動類
@EnableCircuitBreaker?//啟動熔斷
@EnableEurekaClient
@SpringBootApplication
public?class?CloudHystrixPaymentApplicaiton8001{...}service
@Service
public?class?PaymentCircutBreakerService?{
????//服務(wù)熔斷
????@HystrixCommand(fallbackMethod?=?"paymentCircuitBreaker_fallback",commandProperties?=?{
????????????@HystrixProperty(name?=?"circuitBreaker.enabled",value?=?"true"),??//是否開啟斷路器
????????????@HystrixProperty(name?=?"circuitBreaker.requestVolumeThreshold",value?=?"10"),???//請求次數(shù)
????????????@HystrixProperty(name?=?"circuitBreaker.sleepWindowInMilliseconds",value?=?"10000"),??//時間范圍
????????????@HystrixProperty(name?=?"circuitBreaker.errorThresholdPercentage",value?=?"60"),?//失敗率達到多少后跳閘
????})
????public?String?paymentCircuitBreaker(Integer?id){
????????if?(id?0){
????????????throw?new?RuntimeException("*****id?不能負數(shù)");
????????}
????????String?serialNumber?=?IdUtil.simpleUUID();
????????return?Thread.currentThread().getName()+"\t"+"調(diào)用成功,流水號:"+serialNumber;
????}
????public?String?paymentCircuitBreaker_fallback(@PathVariable("id")?Integer?id){
????????return?"id?不能負數(shù),請稍候再試,(┬_┬)/~~?????id:?"?+id;
????}
}
controller
//===服務(wù)熔斷
@GetMapping("/payment/circuit/{id}")
public?String?paymentCircuitBreaker(@PathVariable("id")?Integer?id){
????String?result?=?paymentCircutBreakerService.paymentCircuitBreaker(id);
????log.info("*******result:"+result);
????return?result;
}
測試
http://localhost:8001/payment/circuit/-1??//多次調(diào)用報錯就會開啟熔斷,此時再調(diào)用正確發(fā)現(xiàn)不會立馬返回正確結(jié)果
http://localhost:8001/payment/circuit/12,服務(wù)熔斷原理

a)熔斷類型
熔斷打開:請求不在進行調(diào)用當(dāng)前服務(wù),內(nèi)部設(shè)置始終一般為MTTR(平均故障處理時間),當(dāng)打開時長達到所設(shè)時鐘則進入熔斷狀態(tài)。
熔斷關(guān)閉:熔斷關(guān)閉不會對服務(wù)進行熔斷。
熔斷半開:部分請求根據(jù)規(guī)則調(diào)用當(dāng)前服務(wù),如果請求成功且符合規(guī)則則認為當(dāng)前服務(wù)恢復(fù)正常,關(guān)閉熔斷。
b)斷路器開啟條件
@HystrixCommand(fallbackMethod?=?"paymentCircuitBreaker_fallback",commandProperties?=?{
??????@HystrixProperty(name?=?"circuitBreaker.enabled",value?=?"true"),??//是否開啟斷路器
??????@HystrixProperty(name?=?"circuitBreaker.requestVolumeThreshold",value?=?"10"),???//請求次數(shù)
??????@HystrixProperty(name?=?"circuitBreaker.sleepWindowInMilliseconds",value?=?"10000"),??//時間范圍
??????@HystrixProperty(name?=?"circuitBreaker.errorThresholdPercentage",value?=?"60"),?//失敗率達到多少后跳閘
})
涉及到斷路器的是哪個重要參數(shù):快照時間窗口、請求總數(shù)閾值、錯誤百分比閾值。
1)快照時間:斷路器確定是否打開需要統(tǒng)計一些請求和錯誤數(shù)據(jù),而統(tǒng)計的時間范圍就是快照時間窗,默認為最近的10秒。
2)請求總數(shù)閾值:在快照時間窗內(nèi),必須滿足請求總數(shù)閾值才有資格熔斷。默認為20,意味著在10秒內(nèi),如果該hystrix命令的調(diào)用總次數(shù)不足20次,即使所有的請求都超時或其他原因失敗,斷路器都不會打開。
3)錯誤百分比閾值:當(dāng)請求總數(shù)在快照時間窗內(nèi)超過閾值,比如發(fā)生了30次調(diào)用,如果在這30次調(diào)用中,有15次發(fā)生了超時異常,也就是超過50%的錯誤百分比,在默認設(shè)定50%閾值情況下,這時候就會將斷路器打開。c)斷路器開啟后續(xù)
1,再有請求調(diào)用的時候,將不會調(diào)用主邏輯,而是直接調(diào)用降級fallback。通過斷路器,實現(xiàn)了自動地發(fā)現(xiàn)錯誤并將降級邏輯切換為主邏輯,減少響應(yīng)延遲的效果。
2,原來的主邏輯如何恢復(fù):當(dāng)斷路器打開,對主邏輯進行熔斷之后,hystrix會啟動一個休眠時間窗,在這個窗內(nèi),降級邏輯是臨時的成為主邏輯;當(dāng)休眠時間窗到期,斷路器會進入半開狀態(tài),釋放一次請求到原來的主邏輯上,如果此時請求正常返回,那么斷路器將繼續(xù)閉合,主邏輯恢復(fù),如果這次請求依然有問題,斷路器繼續(xù)進入打開狀態(tài),休眠時間窗重新計時。
d)各種參數(shù)
HystrixCommand:
commandKey:用來標識一個 Hystrix 命令,默認會取被注解的方法名。需要注意:Hystrix 里同一個鍵的唯一標識并不包括 groupKey,建議取一個獨一二無的名字,防止多個方法之間因為鍵重復(fù)而互相影響。
groupKey:一組 Hystrix 命令的集合,?用來統(tǒng)計、報告,默認取類名,可不配置。
threadPoolKey:用來標識一個線程池,如果沒設(shè)置的話會取 groupKey,很多情況下都是同一個類內(nèi)的方法在共用同一個線程池,如果兩個共用同一線程池的方法上配置了同樣的屬性,在第一個方法被執(zhí)行后線程池的屬性就固定了,所以屬性會以第一個被執(zhí)行的方法上的配置為準。
commandProperties:與此命令相關(guān)的屬性。
threadPoolProperties:與線程池相關(guān)的屬性,
observableExecutionMode:當(dāng) Hystrix 命令被包裝成 RxJava 的 Observer 異步執(zhí)行時,此配置指定了 Observable 被執(zhí)行的模式,默認是 ObservableExecutionMode.EAGER,Observable 會在被創(chuàng)建后立刻執(zhí)行,而 ObservableExecutionMode.EAGER模式下,則會產(chǎn)生一個 Observable 被 subscribe 后執(zhí)行。我們常見的命令都是同步執(zhí)行的,此配置項可以不配置。
ignoreExceptions:默認 Hystrix 在執(zhí)行方法時捕獲到異常時執(zhí)行回退,并統(tǒng)計失敗率以修改熔斷器的狀態(tài),而被忽略的異常則會直接拋到外層,不會執(zhí)行回退方法,也不會影響熔斷器的狀態(tài)。
raiseHystrixExceptions:當(dāng)配置項包括 HystrixRuntimeException 時,所有的未被忽略的異常都會被包裝成 HystrixRuntimeException,配置其他種類的異常好像并沒有什么影響。
fallbackMethod:方法執(zhí)行時熔斷、錯誤、超時時會執(zhí)行的回退方法,需要保持此方法與 Hystrix 方法的簽名和返回值一致。
defaultFallback:默認回退方法,當(dāng)配置 fallbackMethod 項時此項沒有意義,另外,默認回退方法不能有參數(shù),返回值要與 Hystrix方法的返回值相同。
commandProperties:
線程隔離(Isolation)
execution.isolation.strategy:?配置請求隔離的方式,有 threadPool(線程池,默認)和 semaphore(信號量)兩種,信號量方式高效但配置不靈活,我們一般采用 Java 里常用的線程池方式。
execution.timeout.enabled:是否給方法執(zhí)行設(shè)置超時,默認為?true。
execution.isolation.thread.timeoutInMilliseconds:方法執(zhí)行超時時間,默認值是 1000,即 1秒,此值根據(jù)業(yè)務(wù)場景配置。
execution.isolation.thread.interruptOnTimeout:execution.isolation.thread.interruptOnCancel:是否在方法執(zhí)行超時/被取消時中斷方法。需要注意在 JVM 中我們無法強制中斷一個線程,如果 Hystrix 方法里沒有處理中斷信號的邏輯,那么中斷會被忽略。
execution.isolation.semaphore.maxConcurrentRequests:默認值是 10,此配置項要在 execution.isolation.strategy 配置為 semaphore 時才會生效,它指定了一個 Hystrix 方法使用信號量隔離時的最大并發(fā)數(shù),超過此并發(fā)數(shù)的請求會被拒絕。信號量隔離的配置就這么一個,也是前文說信號量隔離配置不靈活的原因。
統(tǒng)計器(Metrics)
metrics.rollingStats.timeInMilliseconds:此配置項指定了窗口的大小,單位是 ms,默認值是 1000,即一個滑動窗口默認統(tǒng)計的是 1s 內(nèi)的請求數(shù)據(jù)。
metrics.healthSnapshot.intervalInMilliseconds:它指定了健康數(shù)據(jù)統(tǒng)計器(影響 Hystrix 熔斷)中每個桶的大小,默認是 500ms,在進行統(tǒng)計時,Hystrix 通過 metrics.rollingStats.timeInMilliseconds / metrics.healthSnapshot.intervalInMilliseconds 計算出桶數(shù),在窗口滑動時,每滑過一個桶的時間間隔時就統(tǒng)計一次當(dāng)前窗口內(nèi)請求的失敗率。
metrics.rollingStats.numBuckets:Hystrix 會將命令執(zhí)行的結(jié)果類型都統(tǒng)計匯總到一塊,給上層應(yīng)用使用或生成統(tǒng)計圖表,此配置項即指定了,生成統(tǒng)計數(shù)據(jù)流時滑動窗口應(yīng)該拆分的桶數(shù)。此配置項最易跟上面的 metrics.healthSnapshot.intervalInMilliseconds 搞混,認為此項影響健康數(shù)據(jù)流的桶數(shù)。?此項默認是 10,并且需要保持此值能被 metrics.rollingStats.timeInMilliseconds 整除。
metrics.rollingPercentile.enabled:是否統(tǒng)計方法響應(yīng)時間百分比,默認為?true?時,Hystrix 會統(tǒng)計方法執(zhí)行的 1%,10%,50%,90%,99%?等比例請求的平均耗時用以生成統(tǒng)計圖表。
metrics.rollingPercentile.timeInMilliseconds:統(tǒng)計響應(yīng)時間百分比時的窗口大小,默認為 60000,即一分鐘。
metrics.rollingPercentile.numBuckets:統(tǒng)計響應(yīng)時間百分比時滑動窗口要劃分的桶用,默認為6,需要保持能被metrics.rollingPercentile.timeInMilliseconds 整除。
metrics.rollingPercentile.bucketSize:統(tǒng)計響應(yīng)時間百分比時,每個滑動窗口的桶內(nèi)要保留的請求數(shù),桶內(nèi)的請求超出這個值后,會覆蓋最前面保存的數(shù)據(jù)。默認值為 100,在統(tǒng)計響應(yīng)百分比配置全為默認的情況下,每個桶的時間長度為 10s = 60000ms / 6,但這 10s 內(nèi)只保留最近的 100?條請求的數(shù)據(jù)。
熔斷器(Circuit?Breaker)
circuitBreaker.enabled:是否啟用熔斷器,默認為?true;
circuitBreaker.forceOpen:circuitBreaker.forceClosed:是否強制啟用/關(guān)閉熔斷器,強制啟用關(guān)閉都想不到什么應(yīng)用的場景,保持默認值,不配置即可。
circuitBreaker.requestVolumeThreshold:啟用熔斷器功能窗口時間內(nèi)的最小請求數(shù)。試想如果沒有這么一個限制,我們配置了 50%?的請求失敗會打開熔斷器,窗口時間內(nèi)只有 3 條請求,恰巧兩條都失敗了,那么熔斷器就被打開了,5s 內(nèi)的請求都被快速失敗。此配置項的值需要根據(jù)接口的 QPS 進行計算,值太小會有誤打開熔斷器的可能,值太大超出了時間窗口內(nèi)的總請求數(shù),則熔斷永遠也不會被觸發(fā)。建議設(shè)置為 QPS *?窗口秒數(shù)?* 60%。
circuitBreaker.errorThresholdPercentage:在通過滑動窗口獲取到當(dāng)前時間段內(nèi) Hystrix 方法執(zhí)行的失敗率后,就需要根據(jù)此配置來判斷是否要將熔斷器打開了。?此配置項默認值是 50,即窗口時間內(nèi)超過 50%?的請求失敗后會打開熔斷器將后續(xù)請求快速失敗。
circuitBreaker.sleepWindowInMilliseconds:熔斷器打開后,所有的請求都會快速失敗,但何時服務(wù)恢復(fù)正常就是下一個要面對的問題。熔斷器打開時,Hystrix 會在經(jīng)過一段時間后就放行一條請求,如果這條請求執(zhí)行成功了,說明此時服務(wù)很可能已經(jīng)恢復(fù)了正常,那么會將熔斷器關(guān)閉,如果此請求執(zhí)行失敗,則認為服務(wù)依然不可用,熔斷器繼續(xù)保持打開狀態(tài)。此配置項指定了熔斷器打開后經(jīng)過多長時間允許一次請求嘗試執(zhí)行,默認值是 5000。
其他(Context/Fallback)
requestCache.enabled:是否啟用請求結(jié)果緩存。默認是?true,但它并不意味著我們的每個請求都會被緩存。緩存請求結(jié)果和從緩存中獲取結(jié)果都需要我們配置 cacheKey,并且在方法上使用?@CacheResult 注解聲明一個緩存上下文。
requestLog.enabled:是否啟用請求日志,默認為?true。
fallback.enabled:是否啟用方法回退,默認為?true?即可。
fallback.isolation.semaphore.maxConcurrentRequests:回退方法執(zhí)行時的最大并發(fā)數(shù),默認是10,如果大量請求的回退方法被執(zhí)行時,超出此并發(fā)數(shù)的請求會拋出 REJECTED_SEMAPHORE_FALLBACK 異常。
threadPoolProperties:
coreSize:核心線程池的大小,默認值是 10,一般根據(jù) QPS * 99% cost + redundancy count 計算得出。
allowMaximumSizeToDivergeFromCoreSize:是否允許線程池擴展到最大線程池數(shù)量,默認為?false;
maximumSize:線程池中線程的最大數(shù)量,默認值是 10,此配置項單獨配置時并不會生效,需要啟用 allowMaximumSizeToDivergeFromCoreSize 項。
maxQueueSize:作業(yè)隊列的最大值,默認值為?-1,設(shè)置為此值時,隊列會使用 SynchronousQueue,此時其 size 為0,Hystrix 不會向隊列內(nèi)存放作業(yè)。如果此值設(shè)置為一個正的 int 型,隊列會使用一個固定 size 的 LinkedBlockingQueue,此時在核心線程池內(nèi)的線程都在忙碌時,會將作業(yè)暫時存放在此隊列內(nèi),但超出此隊列的請求依然會被拒絕。
queueSizeRejectionThreshold:由于 maxQueueSize 值在線程池被創(chuàng)建后就固定了大小,如果需要動態(tài)修改隊列長度的話可以設(shè)置此值,即使隊列未滿,隊列內(nèi)作業(yè)達到此值時同樣會拒絕請求。此值默認是 5,所以有時候只設(shè)置了 maxQueueSize 也不會起作用。
keepAliveTimeMinutes:由上面的 maximumSize,我們知道,線程池內(nèi)核心線程數(shù)目都在忙碌,再有新的請求到達時,線程池容量可以被擴充為到最大數(shù)量,等到線程池空閑后,多于核心數(shù)量的線程還會被回收,此值指定了線程被回收前的存活時間,默認為 2,即兩分鐘。
四、Hystrix dashboard
源碼:cloud-consumer-hystrix-dashboard9001
1,yaml文件
#指定端口號即可
server:
??port:?9001
2,application啟動類
@SpringBootApplication
@EnableHystrixDashboard
public?class?HystrixDashboardMain9001?{
????public?static?void?main(String[]?args)?{
????????SpringApplication.run(HystrixDashboardMain9001.class,args);
????}
}
3,被監(jiān)控類(provider服務(wù))
pom文件
?
????org.springframework.boot
????spring-boot-starter-actuator
application啟動類中添加
//SpringCloud升級方便使用hystrix的dashboard監(jiān)控
@Bean
public?ServletRegistrationBean?getServlet(){
????HystrixMetricsStreamServlet?streamServlet?=?new?HystrixMetricsStreamServlet();
????ServletRegistrationBean?registrationBean?=?new?ServletRegistrationBean(streamServlet);
????registrationBean.setLoadOnStartup(1);
????registrationBean.addUrlMappings("/hystrix.stream");
????registrationBean.setName("HystrixMetricsStreamServlet");
????return?registrationBean;
}
4,啟動并使用
訪問地址:http://localhost:9001/hystrix
? ??
?
?應(yīng)用說明
? ? ? ??
粉絲福利:Java從入門到入土學(xué)習(xí)路線圖
???

?長按上方微信二維碼?2 秒
感謝點贊支持下哈?
