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)