spring cloud: Hystrix斷路器(熔斷器)

1.Hystrix客戶端

Netflix已經創建了一個名爲Hystrix的庫,實現了斷路器的模式。在microservice架構通常有多個層的服務調用。 
這裏寫圖片描述

低水平的服務的服務失敗會導致級聯故障一直給到用戶。當調用一個特定的服務達到一定閾值(默認5秒失敗20次),打開斷路器。在錯誤的情況下和一個開啓的斷路回滾應可以由開發人員提供。 
這裏寫圖片描述

有一個斷路器阻止級聯失敗並且允許關閉服務一段時間進行癒合。回滾會被其他hystrix保護調用,靜態數據或健全的空值。 
代碼如下:

@SpringBootApplication@EnableCircuitBreakerpublic class Application {

    public static void main(String[] args) {        new SpringApplicationBuilder(Application.class).web(true).run(args);
    }

}123456789123456789
@Componentpublic class StoreIntegration {

    @HystrixCommand(fallbackMethod = "defaultStores")    public Object getStores(Map<String, Object> parameters) {        //do stuff that might fail
    }    public Object defaultStores(Map<String, Object> parameters) {        return /* something useful */;
    }
}123456789101112123456789101112

@HystrixCommand是由Netflix contrib 庫提供,叫做javanica。spring cloud自動包裝Spring bean與註釋的代理連接到Hystrix斷路器。斷路器計算何時打開和關閉斷路,並在失敗的情況下做什麼。 
配置@HystrixCommand可以使用commandProperties屬性的列表@HystrixProperty註釋。詳細請看https://github.com/Netflix/Hystrix/tree/master/hystrix-contrib/hystrix-javanica#configuration 
https://github.com/Netflix/Hystrix/wiki/Configuration

1.1 傳播安全上下文或者使用spring範圍

如果你想要一些線程本地上下文傳播到@HystrixCommand默認聲明將不會工作,因爲它執行線程池中的命令(在超時的情況下)。 
可以切換Hystrix使用一些配置用相同的線程調用者,或直接在註釋,讓它使用不同的“隔離策略”(Isolation Strategy)。 
例如:

@HystrixCommand(fallbackMethod = "stubMyService",
    commandProperties = {
      @HystrixProperty(name="execution.isolation.strategy", value="SEMAPHORE")
    }
)...123456123456

詳細內容請參考https://github.com/Netflix/Hystrix/wiki/Configuration

1.2 健康監控

連接的斷路器的狀態也暴露在調用應用程序的/health端點。

{
    "hystrix": {
        "openCircuitBreakers": [            "StoreIntegration::getStoresByLocationLink"
        ],
        "status": "CIRCUIT_OPEN"
    },
    "status": "UP"}123456789123456789

1.3 Hystrix Metrics Stream(hystrix指標流)

spring-boot-starter-actuator中實現了Hystrix metrics stream。暴露/hystrix.stream作爲一個管理端點。

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-actuator</artifactId>
    </dependency>1234512345

2.Hystrix dashboard

Hystrix的主要好處之一是它收集關於每個HystrixCommand組指標。Hystrix儀表板顯示每個斷路器的健康高效的方式。 
這裏寫圖片描述 
運行Hystrix儀表板需要在spring boot主類上標註@EnableHystrixDashboard。然後訪問/ hystrix查看儀表盤,在hystrix客戶端應用使用/hystrix.stream監控。

2.1 turbine

看一個實例Hystrix數據對於整個系統的健康不是很有用。turbine是一個應用程序,該應用程序彙集了所有相關的/hystrix.stream端點到 /turbine.stream用於Hystrix儀表板。運行turbine使用@EnableTurbine註釋你的主類,使用spring-cloud-starter-turbine這個jar。配置請參考https://github.com/Netflix/Turbine/wiki/Configuration-(1.x) 
唯一的區別是turbine.instanceUrlSuffix不需要端口號前綴,因爲這是自動處理,除非turbine.instanceInsertPort = false。

turbine.appConfig配置是一個eureka服務ID列表,turbine將使用這個配置查詢實例。turbine stream在hystrix dashboard中使用如下的url配置: 
http://my.turbine.server:8080/turbine.stream?cluster=,如果集羣的名稱是default,集羣參數可以忽略)。這個集羣參數必須和turbine.aggregator.clusterConfig匹配。從eureka返回的值都是大寫的,因此我們希望下面的例子可以工作,如果一個app使用eureka註冊,並且被叫做customers:

turbine:
  aggregator:
    clusterConfig: CUSTOMERS
  appConfig: customers12341234

clusterName可以使用SPEL表達式定義,在turbine.clusterNameExpression。 
默認值是appName,意思是eureka服務ID最終將作爲集羣的key,例如customers的InstanceInfo有一個CUSTOMERS的appName。另外一個例子是turbine.clusterNameExpression=aSGName,將從AWS ASG name獲取集羣名稱。

另一個例子:

turbine:
  aggregator:
    clusterConfig: SYSTEM,USER
  appConfig: customers,stores,ui,admin
  clusterNameExpression: metadata['cluster']1234512345

在這種情況下,集羣名稱從4個服務從其元數據映射,期望包含“SYSTEM”和“USER”。

所有的app使用default,你需要一個文字表達式(使用單引號):

turbine:
  appConfig: customers,stores
  clusterNameExpression: 'default'123123

spring cloud提供一個spring-cloud-starter-turbine,所有依賴項你需要運行一個turbine服務器。使用@EnableTurbine創建一個spring boot應用。

2.2 turbine AMQP

在某些環境中(如在PaaS),典型的turbine模型的指標從所有分佈式Hystrix命令不起作用。在這種情況下,你可能想要你Hystrix命令推動指標turbine,和spring cloud,就要使用AMQP消息傳遞。所有您需要做的是在客戶端添加一個依賴spring-cloud-netflix-hystrix-amqp並確保代rabbitmq可用。(有關詳細信息,請參閱彈簧引導文檔如何配置客戶端憑據,但它應該工作的當地代理或雲計算)。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章