摘要:還提供來對線程池進(jìn)行設(shè)置,通過它可以實(shí)現(xiàn)更細(xì)粒度的線程池劃分。通常情況下,我們盡量使用來指定線程池的劃分。注解使用注解時(shí)只需要設(shè)置注解的以及屬性即可,他分別表示了命令名稱分組以及線程池劃分。
異常處理 異常傳播
在HystrixCommand實(shí)現(xiàn)的run()方法中拋出異常時(shí),除了HystrixBadRequestException之外,其他異常均會(huì)被Hystrix認(rèn)為命令執(zhí)行失敗并觸發(fā)服務(wù)降級(jí)的處理邏輯,所以當(dāng)需要在命令執(zhí)行中拋出不觸發(fā)服務(wù)降級(jí)的異常時(shí)來選擇它。
在使用注解配置實(shí)現(xiàn)Hystrix命令時(shí),可以忽略指定的異常類型,只需要通過設(shè)置@HystrixCommand注解的ignoreExceptions參數(shù),如下:
@HystrixCommand(fallbackMethod = "getDefaultUser", ignoreExceptions = NullPointerException.class) public User findUserById(Long id) { return restTemplate.getForObject("http://USER-SERVICE/users/{1}", User.class, id); }
當(dāng)上述方法拋出NullPointerException的異常時(shí),不會(huì)觸發(fā)后續(xù)的fallback邏輯。
異常獲取在傳統(tǒng)的繼承實(shí)現(xiàn)Hystrix命令時(shí),可以在getFallback()方法中通過getExecutionException()方法來獲取具體的異常,然后通過判斷來進(jìn)入不同的處理邏輯。
在注解配置方式中,只需要在fallback實(shí)現(xiàn)方法的參數(shù)中增加Throwable e對象的定義,這樣在方法內(nèi)部就可以獲取觸發(fā)服務(wù)降級(jí)的具體異常內(nèi)容。
命令名稱、分組和線程池劃分 繼承實(shí)現(xiàn)自定義命令public UserCommand(RestTemplate restTemplate, Long id) { super(Setter.withGroupKey(HystrixCommandGroupKey.Factory.asKey("GroupName")).andCommandKey(HystrixCommandKey.Factory.asKey("CommandName"))); this.restTemplate = restTemplate; this.id = id; }
從上面的代碼中可以看出,我們并沒有直接設(shè)置命令名稱,而是先調(diào)用了withGroupKey來設(shè)置命令組名,然后才通過調(diào)用andCommandKey來設(shè)置命令名。
在Setter中只有withGroupKey靜態(tài)函數(shù)可以創(chuàng)建Setter的實(shí)例,因此GroupKey是每個(gè)Setter必須的參數(shù),而CommandKey則是一個(gè)可選參數(shù)。
通過設(shè)置命令組,Hystrix會(huì)根據(jù)組來組織和統(tǒng)計(jì)命令的告警、儀表盤等信息。除了上述可以統(tǒng)計(jì)信息之外,Hystrix命令默認(rèn)的線程劃分也是根據(jù)命令分組來實(shí)現(xiàn)的。默認(rèn)情況下,Hystrix會(huì)讓相同組名的命令使用同一個(gè)線程池,所以我們需要在創(chuàng)建Hystrix命令時(shí)為其指定命令組名來實(shí)現(xiàn)默認(rèn)的線程池劃分。
Hystrix還提供HystrixThreadPoolKey來對線程池進(jìn)行設(shè)置,通過它可以實(shí)現(xiàn)更細(xì)粒度的線程池劃分。
public UserCommand(RestTemplate restTemplate, Long id) { super(Setter.withGroupKey(HystrixCommandGroupKey.Factory.asKey("GroupName")) .andCommandKey(HystrixCommandKey.Factory.asKey("CommandName")) .andThreadPoolKey(HystrixThreadPoolKey.Factory.asKey("ThreadPoolKey"))); this.restTemplate = restTemplate; this.id = id; }
在沒有指定HystrixThreadPoolKey的情況下,會(huì)使用命令組的方式來劃分線程池。通常情況下,我們盡量使用HystrixThreadPoolKey來指定線程池的劃分。因?yàn)槎鄠€(gè)不同的命令可能從業(yè)務(wù)邏輯上來看屬于同一個(gè)組,但是往往從實(shí)現(xiàn)本身上需要跟其他命令來進(jìn)行隔離。
@HystrixCommand注解使用注解時(shí)只需要設(shè)置注解的commandKey、groupKey以及threadPoolKey屬性即可,他分別表示了命令名稱、分組以及線程池劃分。
@HystrixCommand(fallbackMethod = "getDefaultUser", ignoreExceptions = NullPointerException.class, commandKey = "findUserById", groupKey = "UserGroup", threadPoolKey = "findUserByIdThread") public User findUserById(Long id) { return restTemplate.getForObject("http://USER-SERVICE/users/{1}", User.class, id); }代碼地址
spring-cloud-example
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/77034.html
摘要:在艙壁模式中可以隔離每個(gè)遠(yuǎn)程資源,并分配各自的線程池,使之互不影響。 springcloud 總集:https://www.tapme.top/blog/detail/2019-02-28-11-33 本次用到全部代碼見文章最下方。 一、為什么要有客戶端彈性模式 ??所有的系統(tǒng)都會(huì)遇到故障,分布式系統(tǒng)單點(diǎn)故障概率更高。如何構(gòu)建應(yīng)用程序來應(yīng)對故障,是每個(gè)軟件開發(fā)人員工作的關(guān)鍵部分。但是通...
摘要:斷路器本身是一種開關(guān)裝置,用于在電路上保護(hù)線路過載,當(dāng)線路中有電器發(fā)生短路時(shí),斷路器能夠及時(shí)的切斷故障電路,防止發(fā)生過載發(fā)熱甚至起火等嚴(yán)重后果。具備擁有回退機(jī)制和斷路器功能的線程和信號(hào)隔離,請求緩存和請求打包,以及監(jiān)控和配置等功能。 轉(zhuǎn)載請注明出處 http://www.paraller.com 代碼機(jī)制:熔斷 & Fallback & 資源隔離 熔斷 概念: 在微服務(wù)架構(gòu)中,我們將系...
摘要:服務(wù)雪崩效應(yīng)是一種因服務(wù)提供者的不可用導(dǎo)致服務(wù)消費(fèi)者的不可用并將不可用逐漸放大的過程。這種代理能夠記錄最近調(diào)用發(fā)生錯(cuò)誤的次數(shù),然后決定使用允許操作繼續(xù),或者立即返回錯(cuò)誤。這個(gè)自己持有的上下文默認(rèn)實(shí)現(xiàn)類也是。 ?????本篇集成Hystrix,繼續(xù)搭建demo。 雪崩效應(yīng):在微服務(wù)架構(gòu)中通常會(huì)有多個(gè)服務(wù)層調(diào)用,基礎(chǔ)服務(wù)的故障可能會(huì)導(dǎo)致級(jí)聯(lián)故障,進(jìn)而造成整個(gè)系統(tǒng)不可用的情況,這種現(xiàn)象被稱為...
閱讀 2256·2021-09-24 10:31
閱讀 3910·2021-09-22 15:16
閱讀 3426·2021-09-22 10:02
閱讀 1051·2021-09-22 10:02
閱讀 1869·2021-09-08 09:36
閱讀 2020·2019-08-30 14:18
閱讀 636·2019-08-30 10:51
閱讀 1896·2019-08-29 11:08