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 中查找其hostNameport条目,然后将/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具有CUSTOMERSappName)。另一个示例是turbine.clusterNameExpression=aSGName,它从 AWS ASG 名称获取集群名称。以下清单显示了另一个示例:

turbine:
  aggregator:
    clusterConfig: SYSTEM,USER
  appConfig: customers,stores,ui,admin
  clusterNameExpression: metadata['cluster']

在前面的示例中,来自四个服务的群集名称从它们的元数据 Map 中拉出,并且期望具有包括SYSTEMUSER的值。

要对所有应用程序使用"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 customersproducts,则以下 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.appConfigturbine.clusterNameExpressionturbine.aggregator.clusterConfig

Note

Turbine Stream 服务器使用 Spring Cloud Stream 从配置的 Importing 通道收集所有 Metrics。这意味着它不会主动从每个实例收集 HystrixMetrics。它只能提供每个实例已经收集到 Importing 通道中的度量。