一篇学习Hystrix断路器

Hystrix基础

1.Hystrix断路器(熔断器)

1.1.分布式系统面临的问题

复杂分布式体系结构中的应用程序有数十个依赖关系,每个依赖关系在某些时候将不可避免地失败。
在这里插入图片描述

服务雪崩
多个微服务之间调用的时候,假设微服务A调用微服务B和微服务C,微服务B和微服务C又调用其它的微服务,这就是所谓的“扇出”。如果扇出的链路上某个微服务的调用响应时间过长或者不可用,对微服务A的调用就会占用越来越多的系统资源,进而引起系统崩溃,所谓的“雪崩效应”.

示例:
在微服务架构中通常会有多个服务层调用,基础服务的故障可能会导致级联故障,进而造成整个系统不可用的情况,这种现象被称为服务雪崩效应。服务雪崩效应是一种因“服务提供者”的不可用导致“服务消费者”的不可用,并将不可用逐渐放大的过程。

什么是灾难性的雪崩效应?我们通过结构图来说明,如下
在这里插入图片描述
正常情况下各个节点相互配置,完成用户请求的处理工作
在这里插入图片描述
当某种请求增多,造成"服务T"故障的情况时,会延伸的造成"服务U"不可用,及继续扩展,如下
在这里插入图片描述
最终造成下面这种所有服务不可用的情况
在这里插入图片描述
这就是我们讲的灾难性雪崩!

造成雪崩的原因可以归纳为以下三个:

服务提供者不可用(硬件故障,程序Bug,缓存击穿,用户大量请求)

重试加大流量(用户重试,代码逻辑重试)
服务调用者不可用(同步等待造成的资源耗尽)

最终的结果就是一个服务不可用,导致一系列服务的不可用,而往往这种后果是无法预料的。

1.2.Hystrix概述

Hystrix [hɪst’rɪks]的中文含义是豪猪,因其背上长满了刺而拥有自我保护能力。

Hystix,即熔断器。类似保险丝角色!

主页:https://github.com/Netflix/Hystrix/
在这里插入图片描述

Hystrix是一个用于处理分布式系统的延迟和容错的开源库,在分布式系统里,许多依赖不可避免的会调用失败,比如超时、异常等,Hystrix能够保证在一个依赖出问题的情况下,不会导致整体服务失败,避免级联故障,以提高分布式系统的弹性。

“断路器”本身是一种开关装置,当某个服务单元发生故障之后,通过断路器的故障监控(类似熔断保险丝),向调用方返回一个符合预期的、可处理的备选响应(FallBack),而不是长时间的等待或者抛出调用方无法处理的异常,这样就保证了服务调用方的线程不会被长时间、不必要地占用,从而避免了故障在分布式系统中的蔓延,乃至雪崩。

在这里插入图片描述

1.3.熔断器的工作机制:

在这里插入图片描述

正常工作的情况下,客户端请求调用服务API接口:
在这里插入图片描述

当有服务出现异常时,直接进行失败回滚,服务降级处理:
在这里插入图片描述

当服务繁忙时,如果服务出现异常,不是粗暴的直接报错,而是返回一个友好的提示,虽然拒绝了用户的访问,但是会返回一个结果。

这就好比去买鱼,平常超市买鱼会额外赠送杀鱼的服务。等到逢年过节,超时繁忙时,可能就不提供杀鱼服务了,这就是服务的降级。

系统特别繁忙时,一些次要服务暂时中断,优先保证主要服务的畅通,一切资源优先让给主要服务来使用,在双十一、618时,京东天猫都会采用这样的策略。

2.SpringCloud之Hystrix服务降级

本文我们来演示下Hystrix中解决雪崩效应的第一种方式降级的实现

2.1.场景介绍

先来看下正常服务调用的情况
在这里插入图片描述
当consumer调用provider服务出现问题的情况下:
在这里插入图片描述
此时我们对consumer的服务调用做降级处理
在这里插入图片描述

2.2.服务降级概述

整体资源快不够了,忍痛将某些服务先关掉,待渡过难关,再开启回来。服务降级处理是在客户端实现完成的,与服务端没有关系。

Fallback相当于是降级操作。对于查询操作,我们可以实现一个fallback方法,当请求后端服务出现异常的时候,可以使用fallback方法返回的值。 fallback方法的返回值一般是设置的默认值或者来自缓存。

2.2.2.引入依赖

首先在user-consumer中引入Hystix依赖:

<!--服务熔断组件-->
<dependency>
	<groupId>org.springframework.cloud</groupId>
	<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>
2.2.3.修改之前的Controller

在之前的Controller中添加熔断机制:

@RequestMapping(value = "/get/{id}", method = RequestMethod.GET)
// 一旦调用服务方法失败并抛出了错误信息后,会自动调用@HystrixCommand标注好的fallbackMethod调用类中的指定方法
@HystrixCommand(fallbackMethod = "processHystrix_Get")
public User get(@PathVariable("id") Long id) {
    User u = this.userService.get(id);
    if (null == u) {
        throw new RuntimeException("该ID:" + id + "没有没有对应的信息");
    }
    return u;
}

public User processHystrix_Get(@PathVariable("id") Long id) {
    User u=new User();
    u.setId(110);
    u.setUsername("该ID:" + id + "没有没有对应的信息,null--@HystrixCommand");
    u.setNote("no this database in MySQL");
    return u;
}
2.2.4.修改主启动类

修改consumer并添加新注解@EnableCircuitBreaker

@SpringBootApplication
@EnableDiscoveryClient // 开启EurekaClient功能
@EnableFeignClients // 开启Feign功能
@EnableCircuitBreaker//对hystrixR熔断机制的支持
public class SpringcloudDemoConsumerApplication {

	public static void main(String[] args) {
		SpringApplication.run(SpringcloudDemoConsumerApplication.class, args);
	}
}
2.2.5. 服务熔断测试

3个eureka先启动
主启动类SpringcloudDemoConsumerApplication

访问测试
http://127.0.0.1:88/consumer/get/2
在这里插入图片描述
如果对应的ID:3,数据库里面没有这个记录,我们报错后统一返回。
在这里插入图片描述

2.3. 服务降级优化-彻底解耦

修改microservicecloud-api工程,根据已经有的DeptClientService接口新建一个实现FallbackFactory接口的类DeptClientServiceFallbackFactory

@Component // 不要忘记添加
public class UserClientServiceFallbackFactory implements FallbackFactory<UserClientService> {


    @Override
    public UserClientService create(Throwable throwable) {
        return new UserClientService() {
            @Override
            public List<User> queryUsers() {
                return null;
            }

            @Override
            public User get(Long id) {
                User u=new User();
                u.setId(110);
                u.setUsername("该ID:\" + id + \"没有没有对应的信息,null--服务降级~~");
                u.setNote("no this database in MySQL----服务降级!!!");
                return u;
            }
        };
    }
}
  • 修改consumer工程,UserClientService接口在注解@FeignClient中添加fallbackFactory属性值
@FeignClient(value = "SPRINGCLOUD-DEMO-SERVICE",fallbackFactory=UserClientServiceFallbackFactory.class)
public interface UserClientService {

    @RequestMapping("/all")
    public List<User> queryUsers();

    @RequestMapping("/get/{id}")
    public User get(@PathVariable("id") Long id);
}
  • 修改配置文件
# 开启服务熔断策略
feign.hystrix.enabled=true
2.3.1.测试
- 3个eureka先启动
- 微服务提供者启动
- 微服务消费者启动

正常访问测试:http://127.0.0.1:88/consumer/get/1
在这里插入图片描述
故意关闭微服务提供者
在这里插入图片描述
客户端自己调用提示
此时服务端provider已经down了,但是我们做了服务降级处理,让客户端在服务端不可用时也会获得提示信息而不会挂起耗死服务器。

3.SpringCloud之Hystrix服务熔断

3.1.服务熔断概述

熔断其实是在降级的基础上引入了重试的机制。当某个时间内失败的次数达到了多少次就会触发熔断机制。熔断机制是应对雪崩效应的一种微服务链路保护机制。
在这里插入图片描述

断路器很好理解,当Hystrix Command请求后端服务失败数量超过一定比例(默认50%),断路器会切换到开路状态(Open)。这时所有请求会直接失败而不会发送到后端服务。 断路器保持在开路状态一段时间后(默认5秒),自动切换到半开路状态(HALF-OPEN)。这时会判断下一次请求的返回情况, 如果请求成功,断路器切回闭路状态(CLOSED), 否则重新切换到开路状态(OPEN)。 Hystrix的断路器就像我们家庭电路中的保险丝,一旦后端服务不可用,断路器会直接切断请求链,避免发送大量无效请求影响系统吞吐量, 并且断路器有自我检测并恢复的能力。

熔断器开关相互转换的逻辑图:
在这里插入图片描述
在SpringCloud框架里熔断机制通过Hystrix实现。Hystrix会监控微服务间调用的状况,当失败的调用到一定阈值,缺省是5秒内20次调用失败就会启动熔断机制。熔断机制的注解是@HystrixCommand

我们来说说断路器的工作原理。当我们把服务提供者eureka-client中加入了模拟的时间延迟之后,在服务消费端的服务降级逻辑因为hystrix命令调用依赖服务超时,触发了降级逻辑,但是即使这样,受限于Hystrix超时时间的问题,我们的调用依然很有可能产生堆积。

这个时候断路器就会发挥作用,那么断路器是在什么情况下开始起作用呢?这里涉及到断路器的三个重要参数:快照时间窗请求总数下限错误百分比下限。这个参数的作用分别是:

快照时间窗:断路器确定是否打开需要统计一些请求和错误数据,而统计的时间范围就是快照时间窗,默认为最近的10秒。

请求总数下限:在快照时间窗内,必须满足请求总数下限才有资格根据熔断。默认为20,意味着在10秒内,如果该hystrix命令的调用此时不足20次,即时所有的请求都超时或其他原因失败,断路器都不会打开。

错误百分比下限:当请求总数在快照时间窗内超过了下限,比如发生了30次调用,如果在这30次调用中,有16次发生了超时异常,也就是超过50%的错误百分比,在默认设定50%下限情况下,这时候就会将断路器打开。

那么当断路器打开之后会发生什么呢?

当熔断器在10秒内发现请求总数超过20,并且错误百分比超过50%,这个时候熔断器打开。打开之后,再有请求调用的时候,将不会调用主逻辑,而是直接调用降级逻辑,返回fallback。通过断路器,实现了自动地发现错误并将主逻辑切换为降级逻辑,减少响应延迟的效果。

在断路器打开之后,处理逻辑并没有结束,我们的降级逻辑已经被成了主逻辑,那么原来的主逻辑要如何恢复呢?对于这一问题,hystrix也为我们实现了自动恢复功能。当断路器打开,对主逻辑进行熔断之后,hystrix会启动一个休眠时间窗,在这个时间窗内,降级逻辑是临时的成为主逻辑,当休眠时间窗到期,断路器将进入半开状态,释放一次请求到原来的主逻辑上,如果此次请求正常返回,那么断路器将继续闭合,主逻辑恢复,如果这次请求依然有问题,断路器继续进入打开状态,休眠时间窗重新计时。

通过上面的一系列机制,hystrix的断路器实现了对依赖资源故障的端口、对降级策略的自动切换以及对主逻辑的自动恢复机制。这使得我们的微服务在依赖外部服务或资源的时候得到了非常好的保护,同时对于一些具备降级逻辑的业务需求可以实现自动化的切换与恢复,相比于设置开关由监控和运维来进行切换的传统实现方式显得更为智能和高效。

3.2.服务熔断实现

导入依赖
在基础依赖之外我们只需要导入Hystrix的依赖即可

<!--服务熔断组件-->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>

启动类
添加对应的注解即可

@EnableCircuitBreaker // 开启熔断 断路器
@EnableEurekaClient
@SpringBootApplication
public class SpringcloudEurekaConsumerApplication {

    public static void main(String[] args) {
        SpringApplication.run(SpringcloudEurekaConsumerApplication.class, args);
    }
}

客户端修改
注意@HystrixCommand注解的内容

    @RequestMapping(value = "/get", method = RequestMethod.GET)
    @ResponseBody
    // 一旦调用服务方法失败并抛出了错误信息后,会自动调用@HystrixCommand标注好的fallbackMethod调用类中的指定方法
    @HystrixCommand(fallbackMethod = "processHystrix_Get",
            commandProperties = {
                    //默认 20 个;10s 内请求数大于 20 个时就启动熔断器,当请求符合熔断条件时将触发 getFallback()。
                    @HystrixProperty(name = HystrixPropertiesManager.CIRCUIT_BREAKER_REQUEST_VOLUME_THRESHOLD,
                            value = "10"),
                    //请求错误率大于 50%时就熔断,然后 for 循环发起请求,当请求符合熔断条件时将触发 getFallback()。
                    @HystrixProperty(name = HystrixPropertiesManager.CIRCUIT_BREAKER_ERROR_THRESHOLD_PERCENTAGE,
                            value = "50"),
                    //默认 5 秒;熔断多少秒后去尝试请求
                    @HystrixProperty(name = HystrixPropertiesManager.CIRCUIT_BREAKER_SLEEP_WINDOW_IN_MILLISECONDS,
                            value = "5000"),
            })
    public User get(@RequestParam("id") Integer id) {
        User u = this.userClientService.getUserById(id);
        return u;
    }

    /**
     * 服务降级
     * 返回托底数据的方法
     * @param id
     * @return
     */
    public User processHystrix_Get(@RequestParam("id") Integer id) {
        User u = new User();
        u.setId(110);
        u.setUsername("该ID:" + id + "没有没有对应的信息,null--@HystrixCommand");
        u.setNote("no this database in MySQL");
        return u;
    }

启动provider和consumer访问查看,正常访问,可以从provider获取到数据。
在这里插入图片描述
异常访问。获取到的是托底数据,而且我们快速访问的话5秒内都返回的托底数据(同一个请求),5秒后会尝试重试连接,这个测试的细心点可以看到这个效果的
在这里插入图片描述

3.3.服务降级与熔断的区别

下面通过一个日常的故事来说明一下什么是服务降级,什么是熔断。

故事的背景是这样的:由于小强在工作中碰到一些问题,于是想请教一下业界大牛小壮。于是发生了下面的两个场景:

小强在拿起常用手机拨号时发现该手机没有能够拨通,所以就拿出了备用手机拨通了某A的电话,这个过程就叫做降级(主逻辑失败采用备用逻辑的过程)。

由于每次小壮的解释都属于长篇大论,不太容易理解,所以小强每次找小壮沟通的时候都希望通过常用手机来完成,因为该手机有录音功能,这样自己可以慢慢消化。由于上一次的沟通是用备用电话完成的,小强又碰到了一些问题,于是他又尝试用常用电话拨打,这一次又没有能够拨通,所以他不得不又拿出备用手机给某A拨号,就这样连续的经过了几次在拨号设备选择上的“降级”,小强觉得短期内常用手机可能因为运营商问题无法正常拨通了,所以,再之后一段时间的交流中,小强就不再尝试用常用手机进行拨号,而是直接用备用手机进行拨号,这样的策略就是熔断(常用手机因短期内多次失败,而被暂时性的忽略,不再尝试使用)。

SpringCloud之Hystrix可视化数据监控Dashboard

1.概述

Hystrix提供了准实时的调用监控(Hystrix Dashboard),Hystrix会持续地记录所有通过Hystrix发起的请求的执行信息,并以统计报表和图形的形式展示给用户,包括每秒执行多少请求多少成功,多少失败等。

Hystrix-dashboard 是一款针对 Hystrix 进行准实时监控的工具,通过 Hystrix Dashboard 我们可以在直观地看到各 Hystrix Command 的请求响应时间, 请求成功率等数据。

Netflix通过hystrix-metrics-event-stream项目实现了对以上指标的监控。Spring Cloud也提供了Hystrix Dashboard的整合,对监控内容转化成可视化界面

2.环境搭建步骤

在前面几节中的消费者中添加pom依赖。 我们需要添加Hystrix,Actuator和Hystrix-dashboard的依赖,具体如下

<dependency>
     <groupId>org.springframework.boot</groupId>
     <artifactId>spring-boot-starter-actuator</artifactId>
 </dependency>

 <!-- hystrix和 hystrix-dashboard相关 -->
 <dependency>
     <groupId>org.springframework.cloud</groupId>
     <artifactId>spring-cloud-starter-netflix-hystrix-dashboard</artifactId>
 </dependency>

3.启动类设置

添加@EnableHystrixDashboard 开启Dashboard,如下

@SpringBootApplication
@EnableDiscoveryClient // 开启EurekaClient功能
@EnableFeignClients // 开启Feign功能
@EnableCircuitBreaker//对hystrixR熔断机制的支持
@EnableHystrixDashboard //开启仪表盘
public class SpringcloudFeignProdcutConsumerApplication {

    public static void main(String[] args) {
        SpringApplication.run(SpringcloudFeignProdcutConsumerApplication.class, args);
    }

}

4.注册HystrixMetricsStreamServlet

在2.x之前的版本中,会自动注入该Servlet的,但是在2.x之后的版本,没有自动注册该Servlet。看源码的解释。
在这里插入图片描述所以这里需要我们手动的注册该Servlet到容器中,代码如下:

/**
 * 配置Hystrix.stream的servlet
 * @return
 */
@Bean
public ServletRegistrationBean registrationBean() {
	HystrixMetricsStreamServlet streamServlet = new HystrixMetricsStreamServlet();
	ServletRegistrationBean registrationBean = new ServletRegistrationBean(streamServlet);
	registrationBean.setLoadOnStartup(1);
	registrationBean.addUrlMappings("/hystrix.stream");
	registrationBean.setName("HystrixMetricsStreamServlet");
	return registrationBean;
}

访问http://localhost:80/hystrix 这里是你部署dashboard服务的地址和端口,会出现如下所示界面:
在这里插入图片描述

5.启动服务

启动consumer服务,访问服务

获取监控数据:http://localhost:80/hystrix.stream
在这里插入图片描述

6.可视化监控

上面案例获取的监控数据是纯json数据,可读性不强,我们可以单独创建一个服务来做可视化监控。

然后启动服务,访问此地址:
http://localhost:80/hystrix
在这里插入图片描述
点击"Monitor Stream"进入监控页面

在这里插入图片描述

7.如何查看

  • 7色
  • 1圈 实心圆:
  共有两种含义。
  它通过颜色的变化代表了实例的健康程度,它的健康度从绿色<黄色<橙色<红色递减。
  
  该实心圆除了颜色的变化之外,它的大小也会根据实例的请求流量发生变化,流量越大该实心圆就越大。
  所以通过该实  心圆的展示,就可以在大量的实例中快速的发现故障实例和高压力实例。
  • 1线
  曲线:用来记录2分钟内流量的相对变化,可以通过它来观察到流量的上升和下降趋势。
  面板每个指标所代表的意义:

在这里插入图片描述

SpringCloud之Hystrix多个服务和集群监控Turbine

1.引言

我们在之前讲过,在单个的Hystrix的应用中,我们使用/hystrix.stream可以查看监控数据,如果想以图表的形式更直观的查看监控数据,再结合dashboard就可以了。

但是,如何同时监控多个应用或集群呢?

我们需要使用springcloud提供的Turbine,它是将各个应用的/hystrix.stream进行聚合的组件。我们在dashboard中输入/turbine.stream即可查看所有监控应用的健康情况。

Turbine 是聚合服务器发送事件流数据的一个工具,hystrix 的监控中,只能监控单个节点,实际生产中都为集群,因此可以通过 turbine 来监控集群服务。
在这里插入图片描述

2.案例介绍

本案例中我们启动两个consumer,集成的有dashboard。创建一个新的turbine项目,通过turbine项目类聚合监控数据,然后通过dashboard-view项目来展示可视化的监控数据。

2.1.创建turbine项目

在这里插入图片描述

2.2.添加依赖
<?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>springcloud0310</artifactId>
        <groupId>com.bruceliu.springcloud0310</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>spring-cloud-hystrix-turbine</artifactId>

    <dependencies>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <!-- Eureka客户端 -->
        <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-hystrix</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>

        <!-- hystrix和 hystrix-dashboard相关 -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-hystrix-dashboard</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-turbine</artifactId>
            <exclusions>
                <exclusion>
                    <groupId>org.springframework.cloud</groupId>
                    <artifactId>
                        spring-cloud-starter-netflix-eureka-client
                    </artifactId>
                </exclusion>
            </exclusions>
        </dependency>

    </dependencies>

    <!-- SpringCloud的依赖 -->
    <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>

</project>
2.3.配置文件设置

配置文件中添加turbine的设置

spring:
  application:
    name: spring-cloud-hystrix-turbine
server:
  port: 8810
turbine:
  aggregator:
    #监控所有微服务集群
    #hytrix仪表盘:http://localhost:8810/hystrix/
    #监控地址:http://localhost:8810/turbine.stream
    #在hystrix仪表盘中监控上面的地址即可
    clusterConfig: default
  #要监控的微服务serviceId
  appConfig: springcloud-consumer-turbine-test,springcloud-consumer-demo
  clusterNameExpression: "'default'"
  instanceUrlSuffix: /hystrix.stream

eureka:
  client:
    serviceUrl:
      defaultZone: http://bruceliu:123456@eureka7002.com:7002/eureka,http://bruceliu:123456@eureka7001.com:7001/eureka,http://bruceliu:123456@eureka7003.com:7003/eureka
  instance:
    prefer-ip-address: true
    instanceId: spring-cloud-hystrix-turbine:8810

2.4.启动类修改
import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand;
import com.netflix.hystrix.contrib.metrics.eventstream.HystrixMetricsStreamServlet;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.servlet.ServletRegistrationBean;
import org.springframework.cloud.client.circuitbreaker.EnableCircuitBreaker;
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.cloud.netflix.turbine.EnableTurbine;
import org.springframework.context.annotation.Bean;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;


@SpringBootApplication
@EnableEurekaClient
@RestController
@EnableHystrix
@EnableHystrixDashboard
@EnableCircuitBreaker
@EnableTurbine
public class TurbineApplication {

    public static void main(String[] args) {
        SpringApplication.run(TurbineApplication.class, args);
    }

    /**
     * springboot 版本如果是2.0则需要添加 ServletRegistrationBean
     * 因为springboot的默认路径不是 "/hystrix.stream"
     * @return
     */
    @Bean
    public ServletRegistrationBean getServlet() {
        HystrixMetricsStreamServlet streamServlet = new HystrixMetricsStreamServlet();
        ServletRegistrationBean registrationBean = new ServletRegistrationBean(streamServlet);
        registrationBean.setLoadOnStartup(1);
        registrationBean.addUrlMappings("/hystrix.stream");
        registrationBean.setName("HystrixMetricsStreamServlet");
        return registrationBean;
    }

}

2.5.分别启动两个consumer

在这里插入图片描述
服务一:
在这里插入图片描述
在这里插入图片描述
服务二:
在这里插入图片描述
在这里插入图片描述

2.6.启动turbine服务

hytrix仪表盘:http://localhost:8810/hystrix/
在这里插入图片描述
监控地址:http://localhost:8810/turbine.stream
在这里插入图片描述

2.7.启动dashboard-view服务

如下即实现了同时监控多个服务的数据。
在这里插入图片描述

3.容易踩的坑

springboot2.1.4版本,这个版本默认路径不是/hystrix.stream,而turbine默认路径是这个,所以要修改一下,可以有两种修改方式:

一: 配置Bean,设置路径

/**
 * springboot 版本如果是2.0则需要添加 ServletRegistrationBean
 * 因为springboot的默认路径不是 "/hystrix.stream"
 * @return
 */
@Bean
public ServletRegistrationBean getServlet() {
    HystrixMetricsStreamServlet streamServlet = new HystrixMetricsStreamServlet();
    ServletRegistrationBean registrationBean = new ServletRegistrationBean(streamServlet);
    registrationBean.setLoadOnStartup(1);
    registrationBean.addUrlMappings("/hystrix.stream");
    registrationBean.setName("HystrixMetricsStreamServlet");
    return registrationBean;
}

二: 配置文件配置Bean
在这里插入图片描述

页面不显示服务:

这个问题挺坑的,具体原因是因为监控的服务不光要开启熔断和仪表盘,同样也要开启turbine,即启动类需要以下注解:
在这里插入图片描述
一直loading:

最后是这个,实际中发现无论怎么访问接口,就是没监控数据,后台测试发现,你所访问的接口必须要有熔断,即普通方法要有fallback:

@RequestMapping("/test")
@ResponseBody
@HystrixCommand(fallbackMethod = "fallback1")
public List<User> consumerTest() {
    return userClientService.queryALLUsers();
}

public List<User> fallback1(){
    return null;
}

总结

Hystrix Dashboard仪表盘参数

在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值