1.前言
在复杂的分布式系统中,相同服务的节点经常需要部署上百甚至上千个,很多时候,运维人员希望能够把相同服务的节点状态以一个整体集群的形式展现出来,这样可以更好的把握整个系统的状态。 为此,Netflix 提供了一个开源项目(Turbine)来提供把多个 hystrix.stream 的内容聚合为一个数据源供 Dashboard 展示。
上一节:SpringCloud进击 | 五深入:断路器监控(Hystrix Dashboard)【Finchley版本】
2.准备
- 一个服务注册中心:wei-eureka-server,端口 8090(无需修改,正常启动)
- 一个服务提供者:wei-service-provider,端口 8010(无需修改,正常启动)
- 两个服务消费者:(改造模块,两个聚合监控实例)
3.1. 将上节的模块 wei-consumer-ribbon 改名为 wei-consumer-ribbon-hystrix-dashboard,端口 8027
3.2. 将上节的模块 wei-consumer-feign 改名为 wei-consumer-feign-hystrix-dashboard,端口 8037 - 新建一个标准的 Spring Boot 模块,命名为:wei-consumer-turbine,端口 8070 (新建模块)
这里我们用两个消费实例来实现断路器监控,新建一个模块用来聚合监控。
3.进击
3.1.Ribbon服务消费者改造
将上节的模块 wei-consumer-ribbon 改名为【wei-consumer-ribbon-hystrix-dashboard】,并进行以下改造:
3.1.1.POM依赖改造
引入以下核心依赖:
<!--Hystrix起步依赖,在Ribbon使用断路器-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>
<!--Hystrix 监控面板-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix-dashboard</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
当前模块完整依赖如下:
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<!--客户端负载均衡-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
</dependency>
<!--Hystrix起步依赖,在Ribbon使用断路器-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>
<!--Hystrix 监控面板-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix-dashboard</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
3.1.2.配置文件改造
配置文件 application.yml 添加以下配置:
management:
endpoints:
web:
exposure:
include: '*'
当前模块完整配置如下:
server:
port: 8027
spring:
application:
name: wei-consumer-ribbon-hystrix-dashboard # 指定进行服务注册时该服务的名称,服务与服务之间相互调用一般都是根据这个name
eureka:
client:
service-url:
defaultZone: http://localhost:8090/eureka/ # 指定进行服务注册的地址
management:
endpoints:
web:
exposure:
include: '*'
3.1.3.启动类改造
在启动类上面引入注解 @EnableHystrixDashboard,启用 Hystrix Dashboard 断路器监控面板功能。
package com.wei;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.cloud.netflix.hystrix.EnableHystrix;
import org.springframework.cloud.netflix.hystrix.dashboard.EnableHystrixDashboard;
import org.springframework.context.annotation.Bean;
import org.springframework.web.client.RestTemplate;
/**
* 注解@EnableHystrix,开启Hystrix熔断功能
* 注解@EnableHystrixDashboard,开启创建 Hystrix Dashboard 断路器监控面板
*/
@SpringBootApplication
@EnableEurekaClient
@EnableHystrix
@EnableHystrixDashboard
public class WeiConsumerRibbonApplication {
public static void main(String[] args) {
SpringApplication.run(WeiConsumerRibbonApplication.class, args);
}
/**
* 注解@Bean,向程序注入一个Bean
* 注解@LoadBalanced,开启RestTemplate的负载均衡功能
* 初始化RestTemplate,用来发起 REST 请求
*/
@Bean
@LoadBalanced
public RestTemplate restTemplate() {
return new RestTemplate();
}
}
好了,服务消息者【wei-consumer-ribbon-hystrix-dashboard】改造完成,其它文件不用动。
这时,如果你已经正常启动了准备工作里面的 服务注册中心 和 服务提供者,则可以先验证一下该服务消费者的监控是否可以在 Hystrix DashBoard 上正常展示。如下:
3.1.4.Hystrix DashBoard验证
1)Eureka Server验证:http://localhost:8090/
2)Hystrix DashBoard 主页:http://localhost:8027/hystrix
Hystrix Stream 栏输入监控URL:http://localhost:8027/actuator/hystrix.stream,然后,点击 Monitor Stream 按钮。
3)Hystrix DashBoard 监控流
因为还没有发过请求,监控面板则会一直显示 “Loading…”
浏览器多次请求URL:http://localhost:8027/demo/info?name=tester
返回结果:
Hi,tester,我是服务,我被调用了,服务名为:wei-service-provider,端口为:8010[Ribbon + REST]
发完请求,再看 Hystrix Dashboard,监控面板展示如下:
到此,第一个单应用验证正常。
3.2.Feign服务消费者改造
将上节的模块 wei-consumer-feign 改名为【wei-consumer-feign-hystrix-dashboard】,并进行以下改造:
3.2.1.POM依赖改造
引入以下核心依赖:
<!--Hystrix 监控面板-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix-dashboard</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
当前模块完整依赖如下:
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<!--Feign实现声明式HTTP客户端-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<!--Hystrix 监控面板-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix-dashboard</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
3.2.2.配置文件改造
配置文件 application.yml 添加以下配置:
management:
endpoints:
web:
exposure:
include: '*'
当前模块完整配置如下:
server:
port: 8037
spring:
application:
name: wei-consumer-feign-hystrix-dashboard # 指定进行服务注册时该服务的名称,服务与服务之间相互调用一般都是根据这个name
eureka:
client:
service-url:
defaultZone: http://localhost:8090/eureka/ # 指定进行服务注册的地址
feign:
hystrix:
enabled: true # 开启Hystrix熔断功能
management:
endpoints:
web:
exposure:
include: '*'
3.2.3.启动类改造
在启动类上面引入注解 @EnableHystrixDashboard,启用 Hystrix Dashboard 断路器监控面板功能。
package com.wei;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.circuitbreaker.EnableCircuitBreaker;
import org.springframework.cloud.netflix.hystrix.EnableHystrix;
import org.springframework.cloud.netflix.hystrix.dashboard.EnableHystrixDashboard;
import org.springframework.cloud.openfeign.EnableFeignClients;
/**
* 注解@EnableDiscoveryClient,向服务中心注册(Eureka2.0已经不需要)
* 注解@EnableFeignClients,开启Feign客户端功能
*/
@SpringBootApplication
@EnableFeignClients
@EnableHystrix
@EnableHystrixDashboard
@EnableCircuitBreaker
public class WeiConsumerFeignApplication {
public static void main(String[] args) {
SpringApplication.run(WeiConsumerFeignApplication.class, args);
}
}
好了,服务消息者【wei-consumer-feign-hystrix-dashboard】改造完成,其它文件不用动。
这时,如果你已经正常启动了准备工作里面的 服务注册中心 和 服务提供者,则可以先验证一下该服务消费者的监控是否可以在 Hystrix DashBoard 上正常展示。
3.2.4.Hystrix DashBoard验证
1)Eureka Server验证:http://localhost:8090/
2)Hystrix DashBoard 主页:http://localhost:8037/hystrix
Hystrix Stream 栏输入监控URL:http://localhost:8037/actuator/hystrix.stream,然后,点击 Monitor Stream 按钮。
3)Hystrix DashBoard 监控流
如果还没有发过请求,监控面板则会一直显示 “Loading…”
浏览器多次请求URL:http://localhost:8037/demo/info?name=tester,返回结果:Hi,tester,我是服务,我被调用了,服务名为:wei-service-provider,端口为:8010[Feign]
然后再看过来:
到此,第二个单应用验证正常。
3.3.断路器聚合监控(Hystrix Turbine)
这里我们需要在工程下新建一个标准的 Spring Boot 模块,命名为:wei-consumer-turbine
3.3.1.POM依赖
引入以下核心依赖:
<!--Hystrix 监控数据聚合-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-turbine</artifactId>
</dependency>
当前模块完整依赖如下:
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<!--Hystrix 监控数据聚合-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-turbine</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
3.3.2.配置文件
当前配置文件 application.yml 完整配置如下:
spring:
application:
name: wei-consumer-turbine # 指定进行服务注册时该服务的名称,服务与服务之间相互调用一般都是根据这个name
server:
port: 8070
eureka:
client:
service-url:
defaultZone: http://localhost:8090/eureka/ # 指定进行服务注册的地址
management:
endpoints:
web:
exposure:
include: "*"
cors:
allowed-origins: "*"
allowed-methods: "*"
turbine:
app-config: wei-consumer-ribbon-hystrix-dashboard,wei-consumer-feign-hystrix-dashboard
clusterNameExpression: new String("default")
combine-host-port: true
instanceUrlSuffix:
default: actuator/hystrix.stream
3.3.3.启动类
在启动类上面引入注解 @EnableTurbine,Turbine 聚合监控。
package com.wei;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.turbine.EnableTurbine;
/**
* 注解@EnableTurbine,开启 Turbine 聚合监控
*/
@SpringBootApplication
@EnableTurbine
public class WeiConsumerTurbineApplication {
public static void main(String[] args) {
SpringApplication.run(WeiConsumerTurbineApplication.class, args);
}
}
好了,服务消息者【wei-consumer-turbine】完成。
启动。
4.测试
确认已经正常启动准备工作中的 服务注册中心一个、服务提供者一个、服务消费者两个。
4.1.Hystrix Turbine DashBoard验证
4.1.1.启动日志:
4.1.2.Eureka Server验证:http://localhost:8090/
4.1.3.Hystrix DashBoard主页
这里我们打开URL:http://localhost:8037/hystrix,
在这里的 Hystrix Dashboard 栏中输入聚合地址:http://localhost:8070/turbine.stream,然后,点击 Monitor Stream 按钮。
4.1.4.Turbine 聚合监控验证
到此,Turbine 聚合监控的实现及验证全部完成。
5.总结
5.1.配置说明
聚合监控在 application.yml 加入 Turbine 的相关配置说明:
- 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?
5.2.此时架构
6.系列
SpringCloud进击 | 一浅出:服务注册与发现(Eureka)【Finchley版本】
SpringCloud进击 | 二浅出:服务消费者(Ribbon+REST)【Finchley版本】
SpringCloud进击 | 三浅出:服务消费者(Feign)【Finchley版本】
SpringCloud进击 | 四浅出:断路器与容错(Hystrix)【Finchley版本】
SpringCloud进击 | 五浅出:服务网关 - 路由(Zuul Router)【Finchley版本】
SpringCloud进击 | 六浅出:服务网关 - 过滤器(Zuul Filter)【Finchley版本】
SpringCloud进击 | 七浅出:配置中心(Git配置与更新)【Finchley版本】
SpringCloud进击 | 一深入:配置中心(服务化与高可用)【Finchley版本】
SpringCloud进击 | 二深入:配置中心(消息总线)【Finchley版本】
SpringCloud进击 | 三深入:服务链路跟踪(Spring Cloud Sleuth)【Finchley版本】
SpringCloud进击 | 四深入:服务链路跟踪(Sleuth+Zipkin+RabbitMQ整合)【Finchley版本】
SpringCloud进击 | 五深入:断路器监控(Hystrix Dashboard)【Finchley版本】
SpringCloud进击 | 六深入:断路器聚合监控(Hystrix Turbine)【Finchley版本】
SpringCloud进击 | 七深入:高可用的服务注册中心【Finchley版本】