瘋狂Spring Cloud連載(17)Hystrix屬性配置與回退

 本文節選自《瘋狂Spring Cloud微服務架構實戰》

京東購買地址:https://item.jd.com/12256011.html

噹噹網購買地址:http://product.dangdang.com/25201393.html

Spring Cloud教學視頻http://blog.csdn.net/boxiong86/article/details/78399104

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,該Mapvalue爲執行命令的線程池。

     命令名稱CommandKey可選參數

     線程池名稱ThreadPoolKey指定了線程的key後,全局維護的線程池Map將以該值作爲key

以下的代碼片斷,分別設置以上的3Key

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

     斷路器被打開。

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

     實際執行命令失敗。

在命令中,實現父類(HystrixCommandgetFallback()方法,即可實現回退,當以上的情況發生時,將會執行回退方法。前面的例子中,已經展示了“執行命令失敗”的回退,下面測試一下器被打開時的回退,詳細請見代碼清單6-7

代碼清單6-706\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所示。


6-4多命令回退

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

 

 本文節選自《瘋狂Spring Cloud微服務架構實戰》

Spring Cloud教學視頻http://blog.csdn.net/boxiong86/article/details/78399104

本書代碼共享地址:https://gitee.com/yangenxiong/SpringCloud

發佈了66 篇原創文章 · 獲贊 10 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章