SpringCloud 使用 Turbine 聚合监控 Hystrix 健康状态

Hystrix 的降级熔断只是被迫的折中方案,并不是我们所期望的结果,我们还是期望系统能够永远健康运行。绝大多数情况下,一个系统有很多微服务组成,高峰期很可能个别微服务会发生降级熔断,我们必须能够通过监控才行,这样才能快速发现并解决问题。

Hystrix 是 Netflix 的产品,其提供的仪表盘监控功能,仅仅监控一个微服务的健康状态,这显然不能满足我们的需求。于是 Netflix 推出了 Turbine 聚合监控组件,可以收集并监控多个微服务的健康状态,非常简单且实用。

本篇博客在上一篇博客的 Demo 的基础上,介绍如何搭建 Turbine 进行监控【客户端消费者】和【服务端提供者】的健康状态,在本篇博客的最后会提供源代码的下载。


一、搭建 Turbine 监控工程

采用 Maven 搭建 springcloud_hystrix4 父工程,下面包含 4 个子工程:

image

对于 eureka_app、cusumer_app、provider_app 这 3 个工程,直接从上篇博客的 Demo 中复制过来。本篇博客重点介绍红框中的 hystrix_monitor 工程,也就是我们要搭建的 Turbine 监控工程,用于监控 consumer_app 和 provider_app 的健康运行状态。

从上图中 hystrix_monitor 搭建后的工程结构可以发现,对于 Turbine 的搭建非常简单,主要是通过以下步骤实现:

1 在 pom 文件中引入 Turbine 的相关依赖

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
         http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>springcloud_hystrix4</artifactId>
        <groupId>com.jobs</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>hystrix_monitor</artifactId>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <!--hystrix 仪表盘-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-hystrix-dashboard</artifactId>
        </dependency>

        <!--turbine 依赖包-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-turbine</artifactId>
        </dependency>

        <!--springboot 信息监控依赖包-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>

        <!--eureka 客户端依赖-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>
    </dependencies>
</project>

2 添加 application.yml 配置文件,对 Turbine 进行配置

server:
  port: 8769

eureka:
  instance:
    # 配置主机名
    hostname: hystix-monitor
    # 显示 ip 地址,代替显示主机名
    prefer-ip-address: true
    # 所注册服务实例名称的显示形式
    instance-id: ${eureka.instance.hostname}:${server.port}
    # 每隔 3 秒发一次心跳包
    lease-renewal-interval-in-seconds: 3
    # 如果 15 秒没有发送心跳包,就让 eureka 把自己从服务列表中移除
    lease-expiration-duration-in-seconds: 15
  client:
    serviceUrl:
      defaultZone: http://localhost:8761/eureka

spring:
  application:
    name: hystrix-monitor

turbine:
  combine-host-port: true
  # 配置要监控的服务名称列表(多个服务之间用英文逗号分隔)
  app-config: consumer-App,provider-App
  cluster-name-expression: "'default'"
  aggregator:
    cluster-config: default

# 让 hystrix 的仪表盘允许收集所有的监控数据流
hystrix:
  dashboard:
    proxy-stream-allow-list: "*"

3 创建启动类,添加两个注解(@EnableHystrixDashboard 和 @EnableTurbine)

package com.jobs.monitor;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.hystrix.dashboard.EnableHystrixDashboard;
import org.springframework.cloud.netflix.turbine.EnableTurbine;

//开启 hystrix 仪表盘监控显示功能
@EnableHystrixDashboard
//开启 turbine 聚合 hystrix 仪表盘监控显示功能
@EnableTurbine
@SpringBootApplication
public class HystrixMonitorApp {
    public static void main(String[] args) {
        SpringApplication.run(HystrixMonitorApp.class, args);
    }
}

OK ,我们已经完成了 hystrix_monitor 工程的搭建,实现了对 consumer-App 和 provider-App 的监控。


二、消费者和提供者的改造

对于 consumer-App(客户端消费者)和 provider-App(服务端提供者)需要修改以下几个地方:

1 在 pom 文件中导入相关的依赖包(如果遇到个别重复的依赖包的话,可以不用导入)

<!--springboot 信息监控依赖包-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

<!--hystrix 依赖包-->
<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>

2 注册 hystrix 监控数据获取的 servlet 的 bean 对象(本博客 Demo 中将其跟启动类放在了一起)

3 在启动类上添加 @EnableHystrixDashboard 注解

以服务提供者为例,下面仅列出 provider-App 启动类的代码:

package com.jobs.provider;

import com.netflix.hystrix.contrib.metrics.eventstream.HystrixMetricsStreamServlet;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.servlet.ServletRegistrationBean;
import org.springframework.cloud.netflix.hystrix.EnableHystrix;
import org.springframework.cloud.netflix.hystrix.dashboard.EnableHystrixDashboard;
import org.springframework.context.annotation.Bean;

//启用 hystrix 仪表盘监控显示功能
@EnableHystrixDashboard
@EnableHystrix
@SpringBootApplication
public class ProviderApp {
    public static void main(String[] args) {
        SpringApplication.run(ProviderApp.class, args);
    }

    //注册 hystrix 监控数据获取的 servlet 的 bean 对象
    @Bean
    public ServletRegistrationBean getServlet() {
        HystrixMetricsStreamServlet streamServlet = new HystrixMetricsStreamServlet();
        ServletRegistrationBean registrationBean = new ServletRegistrationBean(streamServlet);
        registrationBean.setLoadOnStartup(1);
        registrationBean.addUrlMappings("/actuator/hystrix.stream");
        registrationBean.setName("HystrixMetricsStreamServlet");
        return registrationBean;
    }
}

OK,通过以上 3 个步骤,就完成了对【客户端消费者】和【服务端提供者】的改造。


三、验证搭建成果

启动 eureka_app、cusumer_app、provider_app、hystrix_monitor 这 4 个 SpringBoot 程序。

首先访问 eureka 注册中心,localhost:8761 发现 hystrix-monitor 已经注册成功

image

我们对于 hystrix_monitor 的 Turbine 搭建的端口号是 8769,所以访问 localhost:8769/hystrix 打开 Turbine 页面

image

在界面中输入监控的 url 地址 http://localhost:8769/turbine.stream

延迟时间默认为 2000 ms ,这里就不修改了,然后填写上 Title,这里填写为 Jobs Turbine Test

然后点击 Monitor Stream 进入监控页面,你可以频繁请求【服务端】和【客户端】提供的接口,来查看监控界面

服务端提供了 2 个接口:

  • localhost:8200/provider/test1/{id} 接口,每次调用都会正常运行,不会发生服务端降级
  • localhost:8200/provider/test1/{id} 接口,当 id 为 1 时故意代码运行抛出异常,所以在服务端会产生降级,达到熔断条件后就会熔断,熔断期间调用此接口,id 传入非 1 的值,仍然会返回降级结果,直到熔断结束后才会返回正常结果

客户端提供了 2 个接口,用于验证服务提供者的熔断效果:

  • localhost:8100/consumer/test1/{id} 接口,每次都能够正常调用成功,不会因为其它接口发生熔断而导致自己无法调用。
  • localhost:8100/consumer/test2/{id} 接口,调用服务端接口时,当传入 id 为 1 时,服务端返回降级结果,此时不停的进行调用,当服务熔断掉后,此时 id 值传入非 1 的参数值时,也会返回服务端降级结果,直到熔断结束后才会返回正常结果。

image

如上图所示:当降级次数太多,满足熔断条件时,接口的 Circuit 状态变为 Open,熔断结束后,再次请求如果成功,接口的状态就会恢复到正常状态。

image

有关 Turbine 聚合监控的界面上各个信息很好理解,大家可以详细研究一下,相信很容易就能够研究清楚。

上面的图,只是部分截图,想要看到完整的界面,大家就亲手搭建一下吧,正好借此机会提升一下自身能力。


OK,有关 Turbine 工程搭建,用于对多个微服务进行 Hystrix 降级熔断的监控,已经介绍完毕。

本篇博客的源代码地址:https://files.cnblogs.com/files/blogs/699532/springcloud_hystrix4.zip

posted @ 2022-10-05 12:23  乔京飞  阅读(10128)  评论(0编辑  收藏  举报