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