15.4 聚合多个Hystrix流

15.4 聚合多个Hystrix流

Hystrix dashboard一次只能监控一个流。因为每个微服务实例都发布它们自己的Hystrix,所以几乎不可能对整个应用的健康状况历史有一个整体的了解。

幸运的是,Netflix的另一个项目Turbine提供了将所有微服务的所有Hystrix流聚合到一个Hystrix流中的办法,这样Hystrix dashboard就能对其进行监控了。SpringCloud Netflix支持以类似于创建其他Spring Cloud服务的方式创建Turbine服务。要创建Turbine服务,我们需要创建一个新的Spring Boot项目并将Turbine starter依赖添加到构建文件中:

1
2
3
4
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-turbine</artifactId>
</dependency>
注意:作为一个新项目,最简单的方式是在创建新Spring Boot项目的时候在Initializr中选中Turbine复选框。

在创建完新项目之后,我们需要启用Turbine。为了实现这一点,我们需要在应用的主配置类上添加@EnableTurbine注解:

1
2
3
4
5
6
7
@SpringBootApplication
@EnableTurbine
public class TurbineServerApplication {
public static void main(String[] args) {
SpringApplication.run(TurbineServerApplication.class, args);
}
}

在开发阶段,我们会和Taco Cloud应用的其他服务一起在本地运行Turbine。为了避免端口冲突,我们需要为Turbine选择一个唯一的端口,这样就不会与其他的服务产生冲突了。你可以选择任意的端口,不过我倾向于选择8989:

1
2
server:
port: 8989

Turbine会消费多个微服务的流并将它们的断路器指标合并到一个流中。它会作为Eureka的客户端,发现那些需要聚合到自己的流的服务。但是,Turbine并不想聚合Eureka中注册的所有流,所以我们必须配置Turbine,告诉它都要使用哪些服务。

turbine.app-config属性会接受一个由逗号分隔的服务名称列表,Turbine会在Eureka中查找它们并聚合它们的Hystrix流。对Taco Cloud应用来讲,我们需要注册在Eureka中的4个服务,即ingredient-service、taco-service、order-service和user-service。如下的application.yml配置条目展现了如何设置turbine.app-config:

1
2
3
turbine:
app-config: ingredient-service,taco-service,order-service,user-service
cluster-name-expression: "'default'"

注意,除了turbine.app-config之外,我们还将turbine.cluster-name-expression属性设置成了“’default’”。这表明Turbine会收集名为default的集群中的所有聚合流。设置这个属性是非常重要的,否则Turbine中不会包含任何特定应用的聚合流数据。

现在,启动Turbine服务器并让Hystrix dashboard访问http://localhost:8989/turbine.stream地址上的流,特定应用的所有断路器都将会展现在断路器dashboard上,如图15.6所示。

image-20211023223822490

图15.6 当访问聚合的Turbine流时Hystrix dashboard会显示所有服务的所有断路器

Hystrix dashboard能够展现所有服务的所有断路器要归功于Turbine。这样,我们就能够一站式地监控Taco Cloud应用所有断路器的健康状况了。