乐趣区

Spring-Cloud-参考文档Hystrix超时和Ribbon客户端

Hystrix 超时和 Ribbon 客户端

使用包装 Ribbon 客户端的 Hystrix 命令时,要确保将 Hystrix 超时配置为长于配置的 Ribbon 超时,包括可能进行的任何可能的重试,例如,如果你的 Ribbon 连接超时为一秒,并且 Ribbon 客户端可能会重试该请求三次,那么你的 Hystrix 超时应该略大于三秒。

如何包含 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 仪表板成功连接到流端点。

Turbine

查看单个实例的 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 中的 hostNameport条目,然后将 /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 成为群集键(即,customersInstanceInfoappNameCUSTOMERS)。另一个示例是turbine.clusterNameExpression=aSGName,它从 AWS ASG 名称获取集群名称,以下清单显示了另一个示例:

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

在前面的示例中,来自四个服务的集群名称是从其元数据映射中提取的,并且应该具有包含 SYSTEMUSER的值。

要为所有应用程序使用“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 数组。

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 来禁用此端点。

Turbine 流

在某些环境中(例如在 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 为 customersproducts,则你的 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.appConfigturbine.clusterNameExpressionturbine.aggregator.clusterConfig

Turbine Stream 服务器使用 Spring Cloud Stream 从配置的输入通道收集所有指标,这意味着它不会从每个实例主动收集 Hystrix 指标,它只能提供每个实例已经收集到输入通道中的指标。

退出移动版