Hystrix中一個主要的特性,就是對每一條
HystrixCommand
操做的各個方面均可以度量檢測。 Hystrix經過一個儀表板頁面來有效的顯示每個斷路器的健康狀態。java
Figure 3. Hystrix Dashboardgit
引入Hystrix須要在工程中引入相關starter: group:
org.springframework.cloud
artifact id :spring-cloud-starter-hystrix-dashboard
。如何構建Cloud工程能夠參見:Spring Cloud Project pagegithub
能夠經過
@EnableHystrixDashboard
註解來開啓儀表板。而後,就能夠經過/hystrix
訪問儀表板頁面;並且儀表板相關數據,也會經過/hystrix.stream
接口提供給客戶端應用。web
其實對於一個實例個體來講,Hystrix的數據對於系統總體健康程度來講並不十分重要。 Turbine提供了一個儀表板頁面來聚合全部
/hystrix.stream
相關數據,同時把全部數據合成到一個/turbine.stream
接口中。spring
在Eureka中,運行Turbine很是簡單,只須要在主類中加上一個
@EnableTurbine
註解。(固然,前提是已經引入spring-cloud-starter-turbine
)app
Turbine完整配置屬性請參見 WIKI。 有一點不一樣的是,
turbine.instanceUrlSuffix
不在須要添加端口配置(端口會自動處理)。若是須要手動配置,須要設置turbine.instanceInsertPort=false
。分佈式
注意: 默認狀況下,Turbine會自動在Eureka集羣中查找全部實例的
homePageUrl
來發現它們的/hystrix.stream
接口。這就意味着若是spring-boot-actuator
運行在同一個端口(默認就是如此),那麼,調用/hystrix.stream
就會失敗。爲了能讓Turbine找到正確的端口,須要在實例的元數據中指定management.port
端口。spring-boot
eureka: instance: metadata-map: management.port: ${management.port:8081}
turbine.appConfig
配置成Eureka的serviceIds
集合,Turbine就會使用這個屬性來發現實例。 Turbine會在Hystrix儀表板頁面使用一個連接:http://my.turbine.sever:8080/turbine.stream?cluster=<CLUSTERNAME>
,若是集羣名字是default
,那能夠省略參數cluster
。參數cluster
必須對應着turbine.aggregator.clusterConfig
配置的一個實體。參數cluster
值爲大寫字符,所以配置的時候須要注意。ui
turbine: aggregator: clusterConfig: CUSTOMERS appConfig: customers
能夠在根實例的
InstanceInfo
中設置turbine.clusterNameExpression
,這樣clusterName
可使用SPEL表達式來配置。 默認值是appName
,意味着Eureka的serviceId是以集羣key做爲命名的。(例如:customers的InstanceInfo
有一個CUSTOMERS
的appName
)code
下面這個例子
turbine.clusterNameExpression=aSGName
,展現了另外一種狀況。使用AWS的ASG做爲集羣名。
turbine: aggregator: clusterConfig: SYSTEM,USER appConfig: customers,stores,ui,admin clusterNameExpression: metadata['cluster']
在這種狀況下,4個服務會從元數據中拉去集羣名。預期中的值就會包括:
SYSTEM
和USER
。
若是須要使用"default"做爲全部應用的集羣名,須要一個字符串直譯表達式(在YAML中是雙引號加上一層單引號):
turbine: appConfig: customers,stores clusterNameExpression: "'default'"
Spring Cloud提供了一個
spring-cloud-starter-turbine
,其中包含了Turbine服務端運行時的全部依賴。而後,只須要在Spring Boot應用中加上@EnableTurbine
就行。
注意: 默認狀況下,Spring Cloud 容許Turbine使用地址 + 端口來逐個處理主機、集羣的。 若是想要在Turbine中使用Netflix的策略(不容許處理多主機多集羣)(實例ID就是主機名),那能夠設置:
turbine.combineHostPort=false
。
標準Turbine的策略,是從各個分佈式節點中拉取Hystrix命令來獲得相關數據。可是在某些場景中(好比:PaaS),這個策略就不行了。
若是想讓Hystrix命令執行時主動推送數據到Turbine,而且讓Spring Cloud可以處理這些消息。那能夠在客戶端增長一個
spring-cloud-netflix-hystrix-stream
依賴,並在提供的諸多spring-cloud-starter-stream-*
中,選擇一個。
在服務端,只須要在Spring Boot 中經過註解
@EnableTurbineStream
來開啓就行,默認狀況下會啓用8989端口。若是須要的話,能夠經過server.port
或者turbine.stream.port
來指定端口。
若是已經使用了
spring-boot-starter-web
和spring-boot-starter-actuator
,那能夠經過management.port
來指定端口。
能夠設置Hystrix儀表板使用Turbine Stream Server來替代Hystrix Stream。 假設Turbine Stream運行在主機名:myhost 的8989端口,那麼能夠經過
http://myhost:8989
做爲Hystrix儀表板的數據來源。鏈路中個節點將使用<serviceId>.<name>
做爲節點名。
Spring Cloud 提供了一個
spring-cloud-starter-turbine-stream
,其包括了Turbine Stream服務運行時全部的依賴。使用時,只須要選擇一個Stream實現便可。例如:spring-cloud-starter-stream-rabbit
(這東東是基於最新Netty實現的,因此須要java 8)