溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Spring Cloud中Hystrix屬性配置與回退的示例分析

發(fā)布時(shí)間:2021-12-08 09:23:14 來源:億速云 閱讀:249 作者:小新 欄目:云計(jì)算

這篇文章給大家分享的是有關(guān)Spring Cloud中Hystrix屬性配置與回退的示例分析的內(nèi)容。小編覺得挺實(shí)用的,因此分享給大家做個(gè)參考,一起跟隨小編過來看看吧。

Hystrix屬性配置與回退

屬性配置

        使用Hystrix時(shí),可以為命令設(shè)置屬性,以下的代碼片斷,為一個(gè)命令設(shè)置了執(zhí)行的超時(shí)時(shí)間:

public MyCommand(boolean isTimeout) {
    super(
        Setter.withGroupKey(HystrixCommandGroupKey.Factory.asKey("ExampleGroup"))
        .andCommandPropertiesDefaults(HystrixCommandProperties.Setter()
            .withExecutionTimeoutInMilliseconds(500))
     );
}

        以上的配置僅對(duì)該命令生效,設(shè)置了命令的超時(shí)時(shí)間為500毫秒,該配置項(xiàng)的默認(rèn)值為1秒,如果想對(duì)全局生效,可以使用以下的代碼片斷:

ConfigurationManager
        .getConfigInstance()
        .setProperty(
        "hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds", 
        500);

        以上的代碼片斷,同樣設(shè)置了命令超時(shí)時(shí)間為500毫秒,但對(duì)全局有效。除了超時(shí)的配置外,還需要了解一下命令的相關(guān)名稱,可以為命令設(shè)置以下名稱:

  • 命令組名稱(GroupKey):必須提供命令組名稱,默認(rèn)情況下,全局維護(hù)的線程池Map以該值作為key,該Map的value為執(zhí)行命令的線程池。

  • 命令名稱(CommandKey):可選參數(shù)。

  • 線程池名稱(ThreadPoolKey):指定了線程的key后,全局維護(hù)的線程池Map將以該值作為key。

        以下的代碼片斷,分別設(shè)置以上的3個(gè)Key:

public RunCommand(String msg) {
    super(
            Setter.withGroupKey(
                    HystrixCommandGroupKey.Factory.asKey("group-key"))
                    .andCommandKey(HystrixCommandKey.Factory.asKey("command-key"))
                    .andThreadPoolKey(HystrixThreadPoolKey.Factory.asKey("pool-key"))
            
            );
}

        Hystrix的配置眾多,后面章節(jié)的案例會(huì)涉及部分的配置,讀者如果想了解更多的配置,可到以下的地址查看:https://github.com/Netflix/Hystrix/wiki/Configuration

回退

        根據(jù)前面章節(jié)的流程圖可知,至少會(huì)有3種情況觸發(fā)回退(fallback):

  • 斷路器被打開。

  •  線程池、隊(duì)列、信號(hào)量滿載。

  • 實(shí)際執(zhí)行命令失敗。

        在命令中,實(shí)現(xiàn)父類(HystrixCommand)的getFallback()方法,即可實(shí)現(xiàn)回退,當(dāng)以上的情況發(fā)生時(shí),將會(huì)執(zhí)行回退方法。前面的例子中,已經(jīng)展示了“執(zhí)行命令失敗”的回退,下面測(cè)試一下斷路器被打開時(shí)的回退,詳細(xì)請(qǐng)見代碼清單6-7。

        代碼清單6-7:

        06\6.2\first-hnystrix-client\src\main\java\org\crazyit\cloud\fallback\FallbackTest.java

public class FallbackTest {

    public static void main(String[] args) {
        // 斷路器被強(qiáng)制打開
        ConfigurationManager.getConfigInstance().setProperty(
                "hystrix.command.default.circuitBreaker.forceOpen", "true");
        FallbackCommand c = new FallbackCommand();
        c.execute();
        // 創(chuàng)建第二個(gè)命令,斷路器關(guān)閉
        ConfigurationManager.getConfigInstance().setProperty(
                "hystrix.command.default.circuitBreaker.forceOpen", "false");
        FallbackCommand c2 = new FallbackCommand();
        c2.execute();
    }

    static class FallbackCommand extends HystrixCommand<String> {
        public FallbackCommand() {
            super(HystrixCommandGroupKey.Factory.asKey("ExampleGroup"));
        }

        /**
         * 斷路器被強(qiáng)制打開,該方法不會(huì)執(zhí)行
         */
        protected String run() throws Exception {
            System.out.println("命令執(zhí)行");
            return "";
        }

        /**
         * 回退方法,斷路器打開后會(huì)執(zhí)行回退
         */
        protected String getFallback() {
            System.out.println("執(zhí)行回退方法");
            return "fallback";
        }
    }
}

        如果讓斷路器打開,需要符合一定的條件,本例為了簡(jiǎn)單起見,在代碼清單中,使用了配置管理類(ConfigurationManager)將斷路器強(qiáng)制打開與關(guān)閉,在打開斷路器后,F(xiàn)allbackCommand總會(huì)執(zhí)行回退(getFallback)方法,將斷路器關(guān)閉,命令執(zhí)行正常。如果斷路器被打開,而命令中沒有提供回退方法,將拋出以下異常:

com.netflix.hystrix.exception.HystrixRuntimeException: 
FallbackCommand short-circuited and no fallback available.

        另外,需要注意的是,命令執(zhí)行后,不管是否會(huì)觸發(fā)回退,都會(huì)去計(jì)算整個(gè)鏈路的健康狀況,根據(jù)健康狀況來判斷是否要打開斷路器,如果命令僅僅失敗了一次,是不足以打開斷路器的,關(guān)于斷路器的邏輯將在后面章節(jié)講述。

回退的模式

        Hystrix的回退機(jī)制比較靈活,你可以在A命令的回退方法中執(zhí)行B命令,如果B命令也執(zhí)行失敗,同樣也會(huì)觸發(fā)B命令的回退,這樣就形成一種鏈?zhǔn)降拿顖?zhí)行,例如以下代碼片斷:

static class CommandA extends HystrixCommand<String> {
    …省略其他代碼
    protected String run() throws Exception {
        throw new RuntimeException();
    }

    protected String getFallback() {
        return new CommandB().execute();
    }    
}

        還有其他較為復(fù)雜的例子,例如銀行轉(zhuǎn)賬,假設(shè)一個(gè)轉(zhuǎn)賬命令包含調(diào)用A銀行扣款、B銀行加款兩個(gè)命令,其中一個(gè)命令失敗后,再執(zhí)行轉(zhuǎn)賬命令的回退,如圖6-4所示。

Spring Cloud中Hystrix屬性配置與回退的示例分析

圖6-4 多命令回退

        要做到圖6-4的多命令只執(zhí)行一次回退的效果,CommandA與CommandB,不能有回退方法,如果CommandA命令執(zhí)行失敗,并且該命令有回退方法,此時(shí)將不會(huì)執(zhí)行“MainCommand”的回退方法。除了上面所提到的鏈?zhǔn)降幕赝艘约岸嗝罨赝耍x者還可以根據(jù)實(shí)際情況來設(shè)計(jì)回退。

感謝各位的閱讀!關(guān)于“Spring Cloud中Hystrix屬性配置與回退的示例分析”這篇文章就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,讓大家可以學(xué)到更多知識(shí),如果覺得文章不錯(cuò),可以把它分享出去讓更多的人看到吧!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI