4.4 Circuit Breaker: Hystrix Dashboard
断路器:Hystrix仪表板
Hystrix中一个主要的特性,就是对每一条
HystrixCommand
操作的各个方面都可以度量检测。 Hystrix通过一个仪表板页面来有效的显示每一个断路器的健康状态。
Figure 3. Hystrix Dashboard
4.4.1 How to Include Hystrix Dashboard 如何引入Hystrix仪表板
引入Hystrix需要在工程中引入相关starter: group:
org.springframework.cloud
artifact id :spring-cloud-starter-hystrix-dashboard
。如何构建Cloud工程可以参见:Spring Cloud Project page
可以通过
@EnableHystrixDashboard
注解来开启仪表板。然后,就可以通过/hystrix
访问仪表板页面;而且仪表板相关数据,也会通过/hystrix.stream
接口提供给客户端应用。
4.4.2 Turbine
其实对于一个实例个体来说,Hystrix的数据对于系统整体健康程度来说并不十分重要。 Turbine提供了一个仪表板页面来聚合所有
/hystrix.stream
相关数据,同时把所有数据合成到一个/turbine.stream
接口中。
在Eureka中,运行Turbine非常简单,只需要在主类中加上一个
@EnableTurbine
注解。(当然,前提是已经引入spring-cloud-starter-turbine
)
Turbine完整配置属性请参见 WIKI。 有一点不同的是,
turbine.instanceUrlSuffix
不在需要添加端口配置(端口会自动处理)。如果需要手动配置,需要设置turbine.instanceInsertPort=false
。
注意: 默认情况下,Turbine会自动在Eureka集群中查找所有实例的
homePageUrl
来发现它们的/hystrix.stream
接口。这就意味着如果spring-boot-actuator
运行在同一个端口(默认就是如此),那么,调用/hystrix.stream
就会失败。为了能让Turbine找到正确的端口,需要在实例的元数据中指定management.port
端口。
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
值为大写字符,因此配置的时候需要注意。
turbine:
aggregator:
clusterConfig: CUSTOMERS
appConfig: customers
可以在根实例的
InstanceInfo
中设置turbine.clusterNameExpression
,这样clusterName
可以使用SPEL表达式来配置。 默认值是appName
,意味着Eureka的serviceId是以集群key作为命名的。(例如:customers的InstanceInfo
有一个CUSTOMERS
的appName
)
下面这个例子
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
。
4.4.3 Turbine Stream 实时处理
标准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)