中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

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

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

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

發布時間:2021-12-08 09:23:14 來源:億速云 閱讀:258 作者:小新 欄目:云計算

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

Hystrix屬性配置與回退

屬性配置

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

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

        以上的配置僅對該命令生效,設置了命令的超時時間為500毫秒,該配置項的默認值為1秒,如果想對全局生效,可以使用以下的代碼片斷:

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

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

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

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

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

        以下的代碼片斷,分別設置以上的3個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的配置眾多,后面章節的案例會涉及部分的配置,讀者如果想了解更多的配置,可到以下的地址查看:https://github.com/Netflix/Hystrix/wiki/Configuration

回退

        根據前面章節的流程圖可知,至少會有3種情況觸發回退(fallback):

  • 斷路器被打開。

  •  線程池、隊列、信號量滿載。

  • 實際執行命令失敗。

        在命令中,實現父類(HystrixCommand)的getFallback()方法,即可實現回退,當以上的情況發生時,將會執行回退方法。前面的例子中,已經展示了“執行命令失敗”的回退,下面測試一下斷路器被打開時的回退,詳細請見代碼清單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) {
        // 斷路器被強制打開
        ConfigurationManager.getConfigInstance().setProperty(
                "hystrix.command.default.circuitBreaker.forceOpen", "true");
        FallbackCommand c = new FallbackCommand();
        c.execute();
        // 創建第二個命令,斷路器關閉
        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"));
        }

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

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

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

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

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

回退的模式

        Hystrix的回退機制比較靈活,你可以在A命令的回退方法中執行B命令,如果B命令也執行失敗,同樣也會觸發B命令的回退,這樣就形成一種鏈式的命令執行,例如以下代碼片斷:

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

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

        還有其他較為復雜的例子,例如銀行轉賬,假設一個轉賬命令包含調用A銀行扣款、B銀行加款兩個命令,其中一個命令失敗后,再執行轉賬命令的回退,如圖6-4所示。

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

圖6-4 多命令回退

        要做到圖6-4的多命令只執行一次回退的效果,CommandA與CommandB,不能有回退方法,如果CommandA命令執行失敗,并且該命令有回退方法,此時將不會執行“MainCommand”的回退方法。除了上面所提到的鏈式的回退以及多命令回退,讀者還可以根據實際情況來設計回退。

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

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

塔河县| 陈巴尔虎旗| 武强县| 老河口市| 珠海市| 奉化市| 碌曲县| 象州县| 乡宁县| 琼海市| 桐梓县| 辽宁省| 唐河县| 军事| 长治县| 庄河市| 临武县| 安多县| 乌苏市| 车险| 太谷县| 元氏县| 奇台县| 博野县| 华阴市| 志丹县| 榕江县| 广水市| 乡宁县| 禄丰县| 漯河市| 密山市| 陕西省| 恩平市| 铜陵市| 金塔县| 封丘县| 凤冈县| 平泉县| 安远县| 五指山市|