SpringCloud(Hystrix监控数据聚合Turbine)
在复杂的分布式系统中,相同服务的节点经常需要部署上百甚至上千个,很多时候,运维人员希望能够把相同服务的节点状态以一个整体集群的形式展现出来,这样可以更好的把握整个系统的状态。 为此,Netflix提供了一个开源项目(Turbine)来提供把多个hystrix.stream的内容聚合为一个数据源供Dashboard展示。
创建Turbine 创建一个名为Turbine
的Spring Boot
工程
POM 在pom.xml
中添加如下依赖:
<properties > <java.version > 1.8</java.version > <spring-cloud.version > Finchley.RELEASE</spring-cloud.version > </properties > <dependencies > <dependency > <groupId > org.springframework.boot</groupId > <artifactId > spring-boot-starter</artifactId > </dependency > <dependency > <groupId > org.springframework.boot</groupId > <artifactId > spring-boot-starter-test</artifactId > <scope > test</scope > </dependency > <dependency > <groupId > org.springframework.cloud</groupId > <artifactId > spring-cloud-starter-netflix-turbine</artifactId > </dependency > </dependencies > <dependencyManagement > <dependencies > <dependency > <groupId > org.springframework.cloud</groupId > <artifactId > spring-cloud-dependencies</artifactId > <version > ${spring-cloud.version}</version > <type > pom</type > <scope > import</scope > </dependency > </dependencies > </dependencyManagement >
启动类 在启动类上使用@EnableTurbine
注解开启 Turbine
@EnableTurbine @SpringBootApplication public class TurbineApplication { public static void main (String[] args) { SpringApplication.run(TurbineApplication.class, args); } }
配置文件 在 application.yml
加入 Eureka
和 Turbine
的相关配置
spring: application: name: hystrix-dashboard-turbine server: port: 28087 management: port: 28088 eureka: client: service-url: defaultZone: http://localhost:28081/eureka/ turbine: app-config: eureka-consumer cluster-name-expression: new String("default") combine-host-port: true
参数:
turbine.app-config
参数指定了需要收集监控信息的服务名;
turbine.cluster-name-expression
参数指定了集群名称为 default
,当我们服务数量非常多的时候,可以启动多个 Turbine 服务来构建不同的聚合集群,而该参数可以用来区分这些不同的聚合集群,同时该参数值可以在 Hystrix 仪表盘中用来定位不同的聚合集群,只需要在 Hystrix Stream 的 URL 中通过 cluster 参数来指定;
turbine.combine-host-port
参数设置为true
,可以让同一主机上的服务通过主机名与端口号的组合来进行区分,默认情况下会以 host 来区分不同的服务,这会使得在本地调试的时候,本机上的不同服务聚合成一个服务来统计。
其中:new String("default")
这个一定要用 String 来包一下,否则启动的时候会抛出异常:
org.springframework.expression.spel.SpelEvaluationException: EL1008E: Property or field 'default' cannot be found on object of type 'com.netflix.appinfo.InstanceInfo' - maybe not public or not valid?
测试 启动服务,访问http://localhost:28086/hystrix ,开启对http://localhost:28087/turbine.stream
的监控,能够看到针对服务eureka-consumer
的聚合监控数据。
此时的服务架构如下图:
参考