On this page
15. Hystrix 超时和功能区 Client 端
使用用于包装 RibbonClient 端的 Hystrix 命令时,您要确保将 Hystrix 超时配置为比配置的 Ribbon 超时更长,包括可能进行的任何重试。例如,如果您的功能区连接超时为一秒,并且功能区 Client 端可能重试该请求三次,则您的 Hystrix 超时应该稍微超过三秒钟。
15.1 如何包括 Hystrix 仪表板
要将 Hystrix 仪表板包含在您的项目中,请使用具有组 ID org.springframework.cloud和工件 ID spring-cloud-starter-netflix-hystrix-dashboard的启动程序。有关使用当前 Spring Cloud Release Train 设置构建系统的详细信息,请参见Spring Cloud Project 页面。
要运行 Hystrix 仪表板,请使用@EnableHystrixDashboardCommentsSpring Boot 主类。然后访问/hystrix并将仪表板指向 HystrixClient 端应用程序中单个实例的/hystrix.stream端点。
Note
连接到使用 HTTPS 的/hystrix.stream端点时,JVM 必须信任服务器使用的证书。如果证书不受信任,则必须将证书导入 JVM,以使 Hystrix 仪表板成功连接到流端点。
15.2 Turbine
从系统的整体运行状况来看,查看单个实例的 Hystrix 数据不是很有用。 Turbine是将所有相关的/hystrix.stream端点聚合为组合的/turbine.stream以便在 Hystrix 仪表板中使用的应用程序。个别实例通过 Eureka 定位。运行 Turbine 需要使用@EnableTurbineComments 对您的主类进行 Comments(例如,通过使用 spring-cloud-starter-netflix-turbine 来设置 Classpath)。 Turbine1 Wiki中记录的所有配置属性均适用。唯一的区别是turbine.instanceUrlSuffix不需要前置的端口,因为除非turbine.instanceInsertPort=false,否则它将自动处理。
Note
默认情况下,Turbine 通过在 Eureka 中查找其hostName和port条目,然后将/hystrix.stream附加到已注册实例上来寻找/hystrix.stream端点。如果实例的元数据包含management.port,则使用它代替/hystrix.stream端点的port值。默认情况下,名为management.port的元数据条目等于management.port配置属性。可以使用以下配置覆盖它:
eureka:
instance:
metadata-map:
management.port: ${management.port:8081}
turbine.appConfig配置密钥是 Turbine 机用于查找实例的 Eureka 服务 ID 的列表。然后在 Hystrix 仪表板中使用该 Turbine 机流,并使用类似于以下内容的 URL:
http://my.turbine.server:8080/turbine.stream?cluster=CLUSTERNAME
如果名称为default,则可以省略 cluster 参数。 cluster参数必须与turbine.aggregator.clusterConfig中的条目匹配。从 Eureka 返回的值是大写的。因此,如果在 Eureka 上注册了名为customers的应用程序,则以下示例适用:
turbine:
aggregator:
clusterConfig: CUSTOMERS
appConfig: customers
如果您需要定制 Turbine 应该使用哪些集群名称(因为您不想在turbine.aggregator.clusterConfig配置中存储集群名称),请提供TurbineClustersProvider类型的 Bean。
可以通过turbine.clusterNameExpression中的 SPEL 表达式(以 root 为InstanceInfo的实例)来定制clusterName。默认值为appName,这意味着 Eureka serviceId成为群集密钥(即,针对 Client 的InstanceInfo具有CUSTOMERS的appName)。另一个示例是turbine.clusterNameExpression=aSGName,它从 AWS ASG 名称获取集群名称。以下清单显示了另一个示例:
turbine:
aggregator:
clusterConfig: SYSTEM,USER
appConfig: customers,stores,ui,admin
clusterNameExpression: metadata['cluster']
在前面的示例中,来自四个服务的群集名称从它们的元数据 Map 中拉出,并且期望具有包括SYSTEM和USER的值。
要对所有应用程序使用"default"群集,您需要一个字符串 Literals 表达式(如果在 YAML 中,也要使用单引号和双引号进行转义):
turbine:
appConfig: customers,stores
clusterNameExpression: "'default'"
Spring Cloud 提供了一个spring-cloud-starter-netflix-turbine,它具有运行 Turbine 服务器所需的所有依赖项。要添加 Turbine,请创建一个 Spring Boot 应用程序并使用@EnableTurbine对其进行 Comments。
Note
默认情况下,Spring Cloud 允许 Turbine 使用主机和端口来允许每个主机,每个集群多个进程。如果您希望 Turbine 内置的 Netflix 本地行为不允许每个主机,每个群集允许多个进程(实例 ID 的键是主机名),请设置turbine.combineHostPort=false。
15.2.1 群集端点
在某些情况下,其他应用程序了解在 Turbine 中配置了哪些 custers 可能会很有用。为此,您可以使用/clusters端点,该端点将返回所有已配置集群的 JSON 数组。
GET /clusters.
[
{
"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来禁用此端点。
15.3Turbine 流
在某些环境中(例如在 PaaS 设置中),从所有分布式 Hystrix 命令中提取 Metrics 的经典 Turbine 模型不起作用。在这种情况下,您可能想让 Hystrix 命令将度量标准推送到 Turbine。 Spring Cloud 通过消息传递实现了这一点。为此,请在 Client 端上为spring-cloud-netflix-hystrix-stream和您选择的spring-cloud-starter-stream-*添加一个依赖项。有关代理以及如何配置 Client 端凭据的详细信息,请参见Spring Cloud Stream 文档。对于本地代理,它应该开箱即用。
在服务器端,创建一个 Spring Boot 应用程序,并使用@EnableTurbineStream对其进行 Comments。 Turbine Stream 服务器需要使用 Spring Webflux,因此spring-boot-starter-webflux需要包含在您的项目中。默认情况下,将spring-cloud-starter-netflix-turbine-stream添加到您的应用程序时会包含spring-boot-starter-webflux。
然后,您可以将 Hystrix 仪表板而不是单个 Hystrix 流指向 Turbine Stream Server。如果 Turbine Stream 在 myhost 的 8989 端口上运行,则将http://myhost:8989放入 Hystrix 仪表板的流 Importing 字段中。电路以它们各自的serviceId开头,后跟一个点(.),然后是电路名称。
Spring Cloud 提供了一个spring-cloud-starter-netflix-turbine-stream,它具有运行 Turbine Stream 服务器所需的所有依赖项。然后,您可以添加自己选择的 StreamBinder,例如spring-cloud-starter-stream-rabbit。
Turbine Stream 服务器还支持cluster参数。与 Turbine 服务器不同,Turbine Stream 使用 eureka serviceIds 作为群集名称,并且这些名称不可配置。
如果 Turbine Stream 服务器在my.turbine.server的端口 8989 上运行,并且您的环境中有两个 eureka serviceIds customers和products,则以下 URL 将在您的 Turbine Stream 服务器上可用。 default和空集群名称将提供 Turbine Stream 服务器接收的所有 Metrics。
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 serviceIds 用作 Turbine 仪表板(或任何兼容的仪表板)的群集名称。您无需为 Turbine Stream 服务器配置任何属性,例如turbine.appConfig,turbine.clusterNameExpression和turbine.aggregator.clusterConfig。
Note
Turbine Stream 服务器使用 Spring Cloud Stream 从配置的 Importing 通道收集所有 Metrics。这意味着它不会主动从每个实例收集 HystrixMetrics。它只能提供每个实例已经收集到 Importing 通道中的度量。