成人无码视频,亚洲精品久久久久av无码,午夜精品久久久久久毛片,亚洲 中文字幕 日韩 无码

資訊專欄INFORMATION COLUMN

Hystrix異常處理及線程池劃分

Codeing_ls / 2738人閱讀

摘要:還提供來對線程池進行設(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

相關(guān)文章

  • springCloud學習3(Netflix Hystrix彈性客戶端)

    摘要:在艙壁模式中可以隔離每個遠程資源,并分配各自的線程池,使之互不影響。 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)鍵部分。但是通...

    yagami 評論0 收藏0
  • Hystrix基礎(chǔ)入門和特性講解

    摘要:斷路器本身是一種開關(guān)裝置,用于在電路上保護線路過載,當線路中有電器發(fā)生短路時,斷路器能夠及時的切斷故障電路,防止發(fā)生過載發(fā)熱甚至起火等嚴重后果。具備擁有回退機制和斷路器功能的線程和信號隔離,請求緩存和請求打包,以及監(jiān)控和配置等功能。 轉(zhuǎn)載請注明出處 http://www.paraller.com 代碼機制:熔斷 & Fallback & 資源隔離 熔斷 概念: 在微服務(wù)架構(gòu)中,我們將系...

    dkzwm 評論0 收藏0
  • SpringCloud學習(3)

    摘要:服務(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)象被稱為...

    monw3c 評論0 收藏0

發(fā)表評論

0條評論

閱讀需要支付1元查看
<