使用包装Ribbon客户端的Hystrix命令时,要确保将Hystrix超时配置为长于配置的Ribbon超时,包括可能进行的任何可能的重试,例如,如果你的Ribbon连接超时为一秒,并且Ribbon客户端可能会重试该请求三次,那么你的Hystrix超时应该略大于三秒。
要在项目中包含Hystrix仪表板,请使用组ID为 org.springframework.cloud
和工件ID为 spring-cloud-starter-netflix-hystrix-dashboard
的启动器。
要运行Hystrix仪表板,请使用 @EnableHystrixDashboard
注解Spring Boot主类,然后访问 /hystrix
并将仪表板指向Hystrix客户端应用程序中的单个实例的 /hystrix.stream
端点。
连接到使用HTTPS的 /hystrix.stream
端点时,JVM必须信任服务器使用的证书,如果证书不受信任,则必须将证书导入JVM,以便Hystrix仪表板成功连接到流端点。
查看单个实例的Hystrix数据在系统整体运行状况方面不是很有用, Turbine
是一个应用程序,它将所有相关的 /hystrix.stream
端点聚合到一个组合的 /turbine.stream
中,以便在Hystrix仪表板中使用,从Eureka定位单个实例。运行Turbine需要使用 @EnableTurbine
注解来注解主类(例如,通过使用 spring-cloud-starter-netflix-turbine
来设置类路径), Turbine 1 wiki
中所有记录的配置属性均适用。唯一的区别是 turbine.instanceUrlSuffix
不需要前置端口,因为除非 turbine.instanceInsertPort=false
,否则会自动处理。
默认情况下,Turbine在注册实例上查找 /hystrix.stream
端点,方法是查找它在Eureka中的 hostName
和 port
条目,然后将 /hystrix.stream
附加到它。如果实例的元数据包含 management.port
,则使用它来代替 /hystrix.stream
端点的 port
值。默认情况下,名为 management.port
的元数据条目等于 management.port
配置属性,可以通过以下配置覆盖它:
eureka: instance: metadata-map: management.port: ${management.port:8081}
turbine.appConfig
配置键是turbine用于查找实例的Eureka serviceId列表,然后,turbine流在Hystrix仪表板中使用,其URL类似于以下内容:
http://my.turbine.server:8080/turbine.stream?cluster=CLUSTERNAME
如果名称是 default
,则可以省略 cluster
参数, cluster
参数必须与 turbine.aggregator.clusterConfig
中的条目匹配,从Eureka返回的值是大写的,因此,如果有一个名为 customers
的应用程序在Eureka注册,则以下示例有效:
turbine: aggregator: clusterConfig: CUSTOMERS appConfig: customers
如果需要自定义Turbine应使用的集群名称(因为你不希望在 turbine.aggregator.clusterConfig
配置中存储集群名称),请提供 TurbineClustersProvider
类型的Bean。
clusterName
可以通过 turbine.clusterNameExpression
中的SPEL表达式进行自定义,其中根用作 InstanceInfo
的实例,默认值为 appName
,这意味着Eureka serviceId
成为群集键(即, customers
的 InstanceInfo
的 appName
为 CUSTOMERS
)。另一个示例是 turbine.clusterNameExpression=aSGName
,它从AWS ASG名称获取集群名称,以下清单显示了另一个示例:
turbine: aggregator: clusterConfig: SYSTEM,USER appConfig: customers,stores,ui,admin clusterNameExpression: metadata['cluster']
在前面的示例中,来自四个服务的集群名称是从其元数据映射中提取的,并且应该具有包含 SYSTEM
和 USER
的值。
要为所有应用程序使用“default”群集,你需要一个字符串文字表达式(如果它在YAML中,则使用单引号并使用双引号进行转义):
turbine: appConfig: customers,stores clusterNameExpression: "'default'"
Spring Cloud提供了一个 spring-cloud-starter-netflix-turbine
,它具有运行Turbine服务器所需的所有依赖关系,要添加Turbine,请创建一个Spring Boot应用程序并使用 @EnableTurbine
对其进行注解。
默认情况下,Spring Cloud允许Turbine使用主机和端口来允许每个主机、每个集群有多个进程,如果你希望Turbine内置的原生Netflix行为不允许每个主机、每个群集有多个进程(实例ID的键是主机名),请设置 turbine.combineHostPort=false
。
在某些情况下,了解Turbine中配置了哪些集群可能对其他应用程序有用,为了支持这一点,你可以使用 /clusters
端点,它将返回所有已配置集群的JSON数组。
[ { "name": "RACES", "link": "http://localhost:8383/turbine.stream?cluster=RACES" }, { "name": "WEB", "link": "http://localhost:8383/turbine.stream?cluster=WEB" } ]
可以通过将 turbine.endpoints.clusters.enabled
设置为 false
来禁用此端点。
在某些环境中(例如在PaaS设置中),从所有分布式Hystrix命令中提取指标的经典Turbine模型不起作用,在这种情况下,你可能希望让Hystrix命令将指标推送到Turbine,Spring Cloud通过消息传递实现这一点。要在客户端上实现这一点,请添加依赖 spring-cloud-netflix-hystrix-stream
和你选择的 spring-cloud-starter-stream-*
。有关代理以及如何配置客户端凭据的详细信息,请参阅Spring Cloud Stream文档,对于本地代理,这应该是开箱即用的。
在服务器端,创建一个Spring Boot应用程序并使用 @EnableTurbineStream
注解它,Turbine Stream服务器需要使用Spring Webflux,因此 spring-boot-starter-webflux
需要包含在你的项目中,默认情况下,在将 spring-cloud-starter-netflix-turbine-stream
添加到你的应用程序时,会包含 spring-boot-starter-webflux
。
然后,你可以将Hystrix仪表板指向Turbine Stream Server而不是单独的Hystrix流,如果Turbine Stream在 myhost
上的端口 8989
上运行,则将 http://myhost:8989
放入Hystrix仪表板的流输入字段中,Circuit的前缀是各自的 serviceId
,后跟一个点( ·
),然后是Circuit名称。
Spring Cloud提供了 spring-cloud-starter-netflix-turbine-stream
,它具有运行Turbine Stream服务器所需的所有依赖关系,然后,你可以添加你选择的流绑定器 — 例如 spring-cloud-starter-stream-rabbit
。
Turbine Stream服务器还支持 cluster
参数,与Turbine服务器不同,Turbine Stream使用eureka serviceId作为集群名称,这些不可配置。
如果Turbine Stream服务器在 my.turbine.server
上的 8989
端口上运行,并且你的环境中有两个eureka serviceId为 customers
和 products
,则你的Turbine Stream服务器上将提供以下URL, default
和空集群名将提供Turbine Stream服务器接收的所有指标。
http://my.turbine.sever:8989/turbine.stream?cluster=customers http://my.turbine.sever:8989/turbine.stream?cluster=products http://my.turbine.sever:8989/turbine.stream?cluster=default http://my.turbine.sever:8989/turbine.stream
因此,你可以将eureka serviceId用作Turbine仪表板(或任何兼容的仪表板)的集群名称,你无需为Turbine Stream服务器配置任何属性,如 turbine.appConfig
、 turbine.clusterNameExpression
和 turbine.aggregator.clusterConfig
。
Turbine Stream服务器使用Spring Cloud Stream从配置的输入通道收集所有指标,这意味着它不会从每个实例主动收集Hystrix指标,它只能提供每个实例已经收集到输入通道中的指标。