在复杂的分布式系统中,相同服务的节点经常需要部署上百甚至上千个,很多时候,运维人员希望能够把相同服务的节点状态以一个整体集群的形式展现出来,这样可以更好的把握整个系统的状态。 为此,Netflix 提供了一个开源项目(Turbine)来提供把多个 hystrix.stream 的内容聚合为一个数据源供 Dashboard 展示。
上一节:SpringCloud进击 | 五深入:断路器监控(Hystrix Dashboard)【Finchley版本】
这里我们用两个消费实例来实现断路器监控,新建一个模块用来聚合监控。
将上节的模块 wei-consumer-ribbon 改名为【wei-consumer-ribbon-hystrix-dashboard】,并进行以下改造:
引入以下核心依赖:
org.springframework.cloud
spring-cloud-starter-netflix-hystrix
org.springframework.cloud
spring-cloud-starter-netflix-hystrix-dashboard
org.springframework.boot
spring-boot-starter-actuator
当前模块完整依赖如下:
org.springframework.cloud
spring-cloud-starter-netflix-eureka-client
org.springframework.cloud
spring-cloud-starter-netflix-ribbon
org.springframework.cloud
spring-cloud-starter-netflix-hystrix
org.springframework.cloud
spring-cloud-starter-netflix-hystrix-dashboard
org.springframework.boot
spring-boot-starter-actuator
org.springframework.boot
spring-boot-starter-web
org.springframework.boot
spring-boot-starter-test
test
配置文件 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: '*'
在启动类上面引入注解 @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 上正常展示。如下:
1)Eureka Server验证:http://localhost:8090/
【Eureka Server验证】
2)Hystrix DashBoard 主页:http://localhost:8027/hystrix
【Hystrix DashBoard 主页】Hystrix Stream 栏输入监控URL:http://localhost:8027/actuator/hystrix.stream,然后,点击 Monitor Stream 按钮。
3)Hystrix DashBoard 监控流
【 Hystrix DashBoard - Loading】
因为还没有发过请求,监控面板则会一直显示 “Loading…”
浏览器多次请求URL:http://localhost:8027/demo/info?name=tester
返回结果:
Hi,tester,我是服务,我被调用了,服务名为:wei-service-provider,端口为:8010[Ribbon + REST]
发完请求,再看 Hystrix Dashboard,监控面板展示如下:
【 Hystrix DashBoard 监控流】
到此,第一个单应用验证正常。
将上节的模块 wei-consumer-feign 改名为【wei-consumer-feign-hystrix-dashboard】,并进行以下改造:
引入以下核心依赖:
org.springframework.cloud
spring-cloud-starter-netflix-hystrix
org.springframework.cloud
spring-cloud-starter-netflix-hystrix-dashboard
org.springframework.boot
spring-boot-starter-actuator
当前模块完整依赖如下:
org.springframework.cloud
spring-cloud-starter-netflix-eureka-client
org.springframework.cloud
spring-cloud-starter-openfeign
org.springframework.cloud
spring-cloud-starter-netflix-hystrix
org.springframework.cloud
spring-cloud-starter-netflix-hystrix-dashboard
org.springframework.boot
spring-boot-starter-actuator
org.springframework.boot
spring-boot-starter-web
org.springframework.boot
spring-boot-starter-test
test
配置文件 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: '*'
在启动类上面引入注解 @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 上正常展示。
1)Eureka Server验证:http://localhost:8090/
【 Eureka Server验证】
2)Hystrix DashBoard 主页:http://localhost:8037/hystrix
【 Hystrix DashBoard 主页】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]
然后再看过来:
【 Hystrix DashBoard 监控流】
到此,第二个单应用验证正常。
这里我们需要在工程下新建一个标准的 Spring Boot 模块,命名为:wei-consumer-turbine
引入以下核心依赖:
org.springframework.cloud
spring-cloud-starter-netflix-turbine
当前模块完整依赖如下:
org.springframework.cloud
spring-cloud-starter-netflix-eureka-client
org.springframework.cloud
spring-cloud-starter-netflix-turbine
org.springframework.boot
spring-boot-starter-test
test
当前配置文件 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
在启动类上面引入注解 @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.1.1.启动日志:
【Turbine应用启动日志】4.1.2.Eureka Server验证:http://localhost:8090/
【 Eureka Server验证】4.1.3.Hystrix DashBoard主页
【 Hystrix DashBoard主页】这里我们打开URL:http://localhost:8037/hystrix,
在这里的 Hystrix Dashboard 栏中输入聚合地址:http://localhost:8070/turbine.stream,然后,点击 Monitor Stream 按钮。
4.1.4.Turbine 聚合监控验证
【 Turbine 聚合监控】
到此,Turbine 聚合监控的实现及验证全部完成。
聚合监控在 application.yml 加入 Turbine 的相关配置说明:
注意: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?
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版本】