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