Spring Cloud Netflix之Hystrix超时和Ribbon客户端超时及Turbine

端木高卓
2023-12-01

在使用包装Ribbon客户端的Hystrix命令时,您希望确保将您的Hystrix超时配置为比配置的Ribbon超时更长的超时,包括可能进行的任何潜在重试。例如,如果您的Ribbon连接超时为一秒,而Ribbon客户机可能重试请求三次,那么您的Hystrix超时应该略多于三秒。

如何引入Hystrix Dashboard

在项目中引入Hystrix Dashboard,通过starter使用group org.springframework.cloud 和artifact id spring-cloud-starter-netflix-hystrix-dashboard.有关使用当前的Spring Cloud发布系列设置构建系统的详细信息,请参阅Spring Cloud项目页面。

要运行Hystrix仪表板,请使用@EnableHystrixDashboard注解您的Spring启动主类。然后访问/hystrix并将仪表板指向Hystrix客户端应用中的单个实例/hystrix.stream。

连接到a 使用HTTPS的/hystrix.stream端点,服务器使用的证书必须得到JVM的信任。如果证书不受信任,则必须将证书导入JVM,以便Hystrix仪表板成功连接到流端点。

Turbine

查看单个实例的Hystrix数据对于系统的整体健康状况并不是非常有用。Turbine 是一个应用,聚集所有相关的/hystrix.stream 端点到组合/Turbine,用于Hystrix仪表板。单个实例通过Eureka定位。运行Turbine 就像用@EnableTurbine注解您的主类一样简单(例如,使用spring-cloud-starter-netflix-turbine来设置类路径)。可以应用Turbine 1 wiki中记录的所有配置属性。

唯一的区别是 turbine.instanceUrlSuffix不需要预先准备的端口,因为它是自动处理的,除非turbine.instanceInsertPort=false。

在默认情况下,Turbine 寻找在Eureka中查找注册实例的hostName和port,然后追加 /hystrix.stream ,从而获得流端点。如果实例的元数据包含management.port,它将代替/hystrix的端口值。默认情况下,元数据条目management.port等于management.port配置属性,可以通过以下配置覆盖:

eureka:
  instance:
    metadata-map:
      management.port: ${management.port:8081}

配置键turbine.appConfig是一个eureka服务的列表,turbine将使用它来查找实例。然后在Hystrix仪表板中使用一个url使用turbine stream,其url如下所示:http://my.turbine.sever:8080/turbine.stream?cluster=CLUSTERNAME(如果名称为“default”,则可以省略集群参数)。cluster 参数必须匹配turbine.aggregator.clusterConfig中的条目。从eureka返回的值是大写的,因此,如果有一个应用程序在eureka注册名为“customers”,那么我们希望这个例子能够正常工作:

turbine:
  aggregator:
    clusterConfig: CUSTOMERS
  appConfig: customers

如果需要自定义哪些集群名称应该由Turbine使用(您不希望将集群名称存储在turbine.aggregator.clusterConfig配置中。),请提供类型为TurbineClustersProvider的bean。

clusterName可以通过一个在turbine.clusterNameExpression中的SPEL表达式自定义,该表达式位于一个InstanceInfo实例的根目录中。默认值是appName,这意味着Eureka serviceId最终成为集群键(例如,客户的InstanceInfo有一个名为“customers”的应用程序名)。另一个例子是turbine.clusterNameExpression=aSGName,它将从AWS ASG名称获得集群名称。另一个例子:

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

在这种情况下,来自4个服务的集群名称从它们的元数据映射中提取出来,并且预期其值包括“SYSTEM”和“USER”。

要为所有应用程序使用“默认”集群,您需要一个字符串文字表达式(使用单引号,如果在YAML中也使用双引号转义):

turbine:
  appConfig: customers,stores
  clusterNameExpression: "'default'"

Spring Cloud提供了一个spring-cloud-starter-netflix-turbine,它具有运行turbine服务器所需的所有依赖项。只需创建一个Spring引导应用程序并使用@EnableTurbine对其进行注解。

默认情况下,Spring Cloud允许Turbine 使用主机和端口来允许每个主机、每个集群执行多个进程。如果您希望将原生Netflix行为内置于Turbine 中,不允许每个主机、每个集群(实例id的关键是主机名)多个进程,那么设置该属性turbine.combineHostPort=false

Turbine Stream

在某些环境中(例如PaaS设置中),从所有分布式Hystrix命令提取指标的经典Turbine 模型无法工作。在这种情况下,您可能希望您的Hystrix命令将指标推送到Turbine ,Spring Cloud通过消息传递实现了这一点。您需要在客户端上做的就是添加一个依赖项

您在客户机上所需要做的就是向spring-cloud-netflix-hystrix-stream和spring-cloud-starter-stream-*添加一个依赖项(有关代理的详细信息,以及如何配置客户端凭据,请参阅Spring Cloud Stream文档,但是对于本地代理,它应该是开箱即用的).

在服务器端,只需创建一个Spring Boot application,并使用@EnableTurbineStream对其进行注释,默认情况下,它将出现在端口8989上(将您的Hystrix仪表板指向该端口,任何路径)。你可以自定义端口,通过server.port或者turbine.stream.port。

如果类路径上也有spring-boot-starter-web和spring-boot-starter-actuator,那么可以通过提供g一个不同的management.port(默认情况下使用Tomcat)打开Actuator端点。然后您可以将Hystrix仪表板指向Turbine 服务器,而不是单独的Hystrix流。

如果Turbine Stream在myhost上的端口8989上运行,那么在Hystrix仪表板的流输入字段中输入http://myhost:8989。

电路将以它们各自的serviceId作为前缀,后跟一个点,然后是电路名称。

Spring Cloud提供了一个“spring-cloud-starter-netflix-turbine-stream”,它具有运行涡轮流服务器所需的所有依赖项——只需添加您选择的流绑定器,例如:“spring-cloud-starter-stream-rabbit”。您需要Java 8来运行该应用程序,因为它是基于NETTY的。

Turbine Stream服务器也支持集群参数。与Turbine 服务器不同,Turbine 流使用eureka服务id作为集群名称,这些名称是不可配置的。

如果涡轮流服务器在my.turbine上的端口8989上运行。您的环境中有两个eureka服务“customers”和“products”,下面的url将在您的Turbine 流服务器上可用。默认和空集群名称将提供Turbine 流服务器接收到的所有指标。

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

So, you can use eureka serviceIds as cluster names for your Turbine dashboard (or any compatible dashboard). You don’t need to configure any properties like turbine.appConfig, 'turbine.clusterNameExpression' and 'turbine.aggregator.clusterConfig' for your Turbine Stream server.

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

 

 类似资料: