SpringCloud进击 | 六深入:断路器聚合监控(Hystrix Turbine)【Finchley版本】

1.前言

在复杂的分布式系统中,相同服务的节点经常需要部署上百甚至上千个,很多时候,运维人员希望能够把相同服务的节点状态以一个整体集群的形式展现出来,这样可以更好的把握整个系统的状态。 为此,Netflix 提供了一个开源项目(Turbine)来提供把多个 hystrix.stream 的内容聚合为一个数据源供 Dashboard 展示。

上一节:SpringCloud进击 | 五深入:断路器监控(Hystrix Dashboard)【Finchley版本】

 

2.准备

  1. 一个服务注册中心:wei-eureka-server,端口 8090(无需修改,正常启动)
  2. 一个服务提供者:wei-service-provider,端口 8010(无需修改,正常启动)
  3. 两个服务消费者:(改造模块,两个聚合监控实例)
    3.1. 将上节的模块 wei-consumer-ribbon 改名为 wei-consumer-ribbon-hystrix-dashboard,端口 8027
    3.2. 将上节的模块 wei-consumer-feign 改名为 wei-consumer-feign-hystrix-dashboard,端口 8037
  4. 新建一个标准的 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/

【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 监控流】

 

到此,第一个单应用验证正常。


 

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/

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 监控流】

 

到此,第二个单应用验证正常。


 

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.启动日志:

【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 聚合监控的实现及验证全部完成。

 

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.此时架构

Turbine 聚合监控架构

 

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版本】

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值