SpringCloud之Hystrix

一、Hystrix

1、服务雪崩
多个微服务之间调用的时候,假设微服务A调用微服务B和微服务C,微服务B和微服务C又调用其他的微服务,这就是所谓的“扇出”。如果扇出的链路上某个微服务的调用响应时间过长或者不可用,对微服务A的调用就会占用越来越多的系统资源,进而引起系统崩溃,所谓的“雪崩效应”。
对于高流量的应用来说,单一的后端依赖可能会导致所有服务器上的所有资源都在几秒内饱和。比失败更糟糕的是,这些应用程序还可能导致服务之间的延迟增加,备份队列,线程和其他系统资源紧张,导致整个系统发生更多的级联故障。这些都表示需要对故障和延迟进行隔离和管理,以便单个依赖关系的失败,不能取消整个应用程序或系统。
所以,通常当你发现一个模块下的某个实例失败后,这时候这个模块依然还会接收到流量,然后这个有问题的模块还调用了其他的模块,这样就会发生级联故障,或者叫雪崩。

2、Hystrix简介
Hystrix是一个用于处理分布式系统的延迟和容错的开源库,在分布式系统里,许多依赖不可避免的会调用失败,比如超时、异常等 ,Hystrix
能保证在一个依赖出现问题的情况下,不会导致整体服务失败,避免级联故障,以提高分布式系统的弹性
"断路器"本身是一种开关装置,但某个服务单元发生故障之后,通过短路器的故障监控(类似熔断保险丝),向调用方返回一个符合预期的、可处理的备选响应(FallBack),而不是长时间的等待或者抛出调用方法无法处理的异常,这样就保证了服务调用方的线程不会被长时间、不必要的占用,从而避免了故障在分布式系统中的蔓延,乃至雪崩。

3、Hystrix能干嘛
官网资料:点击访问

(1)服务降级(fallback)
A、服务器忙请稍后再试,不让客户端等待并立刻返回一个友好提示。
B、哪些情况下会发生服务降级呢?

  • 程序运行异常
  • 超时
  • 服务熔断触发服务降级
  • 线程池/信号量打满

(2)服务熔断(break)
A、类比保险丝达到最大服务访问后,直接拒绝访问,拉闸断电,然后调用服务降级的方法并返回友好的提示
(3)服务限流(flowlimit)
A、秒杀高并发等操作,严禁一窝蜂地拥挤,大家排队,一秒钟N个,有序进行。

(4)接近实时的监控

4、Hystrix使用
(1)创建子模块cloud-provider-hystrix-payment8001
(2)引入依赖

<dependencies>
        <!-- hystrix -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
        </dependency>
        <!-- eureka client -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>
        <!-- 引入自定义的api的通用包 -->
        <dependency>
            <groupId>com.atguigu.springcloud</groupId>
            <artifactId>cloud-api-commons</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
        <!-- boot web actuator -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
        <!-- 一些通用配置 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

(3)编写application.yml

server:
  port: 8001
spring:
  application:
    name: cloud-provider-hystrix-payment
eureka:
  client:
    register-with-eureka: true
    fetch-registry: true
    service-url:
      defaultZone: http://eureka7001.com:7001/eureka

(4)编写启动类

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;

@SpringBootApplication
@EnableEurekaClient
public class PaymentHystrixMain8001 {
    public static void main(String[] args) {
        SpringApplication.run(PaymentHystrixMain8001.class,args);
    }
}

(5)编写两个业务类进行JMeter高并发压测

import com.atguigu.springcloud.service.PaymentService;
import org.springframework.stereotype.Service;
import java.util.concurrent.TimeUnit;

@Service
public class PaymentServiceImpl implements PaymentService {
    @Override
    public String paymentInfo_ok(Integer id) {
        return "线程池:"+Thread.currentThread().getName()+",paymentIfo_OK,id="+id;
    }
    @Override
    public String paymentInfo_timeout(Integer id) {
        try {
            TimeUnit.SECONDS.sleep(3);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        return "线程池:"+Thread.currentThread().getName()+",paymentIfo_TIMEOUT,id="+id;
    }
}
import com.atguigu.springcloud.service.PaymentService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;

@RestController
@Slf4j
public class PaymentController {
    @Resource
    private PaymentService paymentService;

    @Value("${server.port}")
    private String serverPort;

    @GetMapping("/payment/hystrix/ok/{id}")
    public String paymentInfo_ok(@PathVariable("id") Integer id){
        String result = paymentService.paymentInfo_ok(id);
        return result;
    }

    @GetMapping("/payment/hystrix/timeout/{id}")
    public String paymentInfo_timeout(@PathVariable("id") Integer id){
        String result = paymentService.paymentInfo_timeout(id);
        return result;
    }
}

启动主程序,方法paymentInfo_ok()访问不会存在延迟现象直接返回结果:在这里插入图片描述
方法paymentInfo_timeout()会延迟3s返回结果:在这里插入图片描述
用JMeter进行高并发访问paymentInfo_timeout()方法:在这里插入图片描述
在这里插入图片描述
启动JMeter开始并发访问:在这里插入图片描述
再次访问方法paymentInfo_ok()发现其不再是立刻返回结果,原因是方法paymengInfo_timeout()的20000个并发请求将tomcat的默认的工作线程池数打满,没有多余的线程来分解压力和处理,导致方法paymentInfo_ok()的访问出现延迟、卡顿等现象。
在这里插入图片描述
当服务提供者的自测高并发访问还在进行,假如此时外部的消费者80也来访问,那么消费者只能等待,最终可能会导致消费者80不满意,服务端8001CPU被打满崩溃。

(6)创建消费者80:cloud-consumer-feign-hystrix-order
在payment8001依赖的基础上添加openfeign:

<!-- openfeign -->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>

application.yml:

server:
  port: 80
eureka:
  client:
    register-with-eureka: false
    service-url: http://eureka7001.com:7001/eureka/

主启动类:

@SpringBootApplication
@EnableFeignClients
public class OrderHystrixMain80 {
    public static void main(String[] args) {
        SpringApplication.run(OrderHystrixMain80.class,args);
    }
}

openFeign业务类接口:

@Component
@FeignClient(value = "CLOUD-PROVIDER-HYSTRIX-PAYMENT")
public interface PaymentHystrixService {
    @GetMapping("/payment/hystrix/ok/{id}")
    String paymentInfo_ok(@PathVariable("id") Integer id);

    @GetMapping("/payment/hystrix/timeout/{id}")
    String paymentInfo_timeout(@PathVariable("id") Integer id);
}

controller类:

@RestController
@Slf4j
public class OrderHystrixController {

    @Resource
    private PaymentHystrixService paymentHystrixService;

    @GetMapping("/payment/hystrix/ok/{id}")
    public String paymentInfo_ok(@PathVariable("id") Integer id){
        return paymentHystrixService.paymentInfo_ok(id);
    }

    @GetMapping("/payment/hystrix/timeout/{id}")
    public String paymentInfo_timeout(@PathVariable("id") Integer id){
       return paymentHystrixService.paymentInfo_timeout(id);
    }
}

启动order80消费者端访问服务端payment8001提供的服务,同样会出现响应缓慢现象。
解决

  • 对方服务(8001)超时了,调用者(80)不能一直卡死等待,必须有服务降级
  • 对方服务(8001)down机了,调用者(80)不能一直卡死等待。必须有服务降级
  • 对方服务(8001)OK,调用者(80)自己出故障或有自我要求(自己的等待时间小于服务提供者)

5、服务降级:@HystrixCommand
(1)先从服务提供者payment8001方找问题
设置自身调用超时时间的峰值,峰值内可以正常运行,超过了需要有兜底的方法处理,作服务降级fallback。
A、在需要添加服务降级的的方法上添加@HystrixCommand注解:指定服务降级的兜底方法,并设置启动服务降级所触发的条件(方法执行超过3s则触发服务降级)

 	@Override
    @HystrixCommand(fallbackMethod = "paymentInfo_timeoutHandler",commandProperties = {
            @HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds",value = "3000")
    })
    public String paymentInfo_timeout(Integer id) {
        try {
            TimeUnit.SECONDS.sleep(5);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        return "线程池:"+Thread.currentThread().getName()+",paymentIfo_TIMEOUT,id="+id;
    }

B、编写服务降级兜底方法paymentInfo_timeoutHandler()

public String paymentInfo_timeoutHandler(Integer id){
        return "线程池:"+Thread.currentThread().getName()+",paymentInfo_timeoutHandler,id="+id+",原方法异常启动服务降级!";
    }

C、修改并启动主启动类,访问paymentInfo_timeout()方法:在这里插入图片描述
在这里插入图片描述
源程序运行时间为5s而服务降级触发条件为不超过3s,兜底方法执行,结果正确。当paymentInfo_timeout()方法里出现类似int a=10/0;等异常错误时,也会立即执行兜底方法

(2)服务消费者order80添加服务降级
A、开启feign.hystrix:在这里插入图片描述
B、在启动类上添加@EnableHystrix在这里插入图片描述
C、修改业务类方法,添加服务降级:

 	@GetMapping("/consumer/payment/hystrix/timeout/{id}")
    @HystrixCommand(fallbackMethod = "paymentTimeOutFallbackMethod",commandProperties = {
            @HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds",value = "1500")
    })
    public String paymentInfo_timeout(@PathVariable("id") Integer id){
       return paymentHystrixService.paymentInfo_timeout(id);
    }

    public String paymentTimeOutFallbackMethod(Integer id){
        return "消费者order80系统业务繁忙,执行兜底方法!";
    }

D、启动主程序访问此方法:在这里插入图片描述
服务降级设置成功。

(3)全局服务降级DefaultProperties
自定义的服务降级存在的问题:每个业务方法对应一个兜底方法,导致代码膨胀。
解决方法:
1:N 除了个别重要核心业务有专属外,其他普通方法可以通过@DefaultProperties(defalultFallback="")跳转到统一处理结果页面。通用和独享的各自分开,避免了代码膨胀,合理减少了代码量
A、再类上指定全局默认兜底方法:

@RestController
@Slf4j
@DefaultProperties(defaultFallback = "payment_Global_FallbackMethod")
public class OrderHystrixController {
......
}

B、在类内编写兜底方法`payment_Global_FallbackMethod():

//下面是全局fallback方法
public String payment_Global_FallbackMethod(){
    return "Global异常处理信息,请稍后再试!";
}

C、修改需要使用服务降级方法上的注解:在这里插入图片描述
D、启动主启动类访问该方法验证结果正确:在这里插入图片描述
(4)服务降级,客户端去调用服务端,碰上服务端宕机或关闭
只需要在Fegin客户端定义的接口添加一个服务降级处理的实现类即可实现解耦。
(1)根据cloud-consumer-feign-hystrix-order模块已有的PaymentaymentHystrixService接口,创建该接口的实现类PaymentFallbackService,统一为该接口的里面的 方法进行异常处理。

import org.springframework.stereotype.Component;

@Component
public class PaymentFallbackService implements PaymentHystrixService {
    @Override
    public String paymentInfo_ok(Integer id) {
        return "------PaymentFallbackService fall back--ok";
    }

    @Override
    public String paymentInfo_timeout(Integer id) {
        return "------PaymentFallbackService fall back--timeout";
    }
}

(2)在PaymentaymentHystrixService接口注解指定服务降级处理方法的类:
在这里插入图片描述
(3)启动order80消费者端调用方法paymentInfo_ok(),该方法没有异常,可以调用成功:在这里插入图片描述
当payment8001宕机或者关闭在此调用时,可以看到客户端order80会执行PaymentFallbackService 类中的提示方法:在这里插入图片描述
此时服务端payment8001已经down,但是我们做了服务降级处理,让客户端在服务端不可用时会获得提示信息而不会挂起耗死服务器

二、服务熔断

1、概述
熔断机制是应对雪崩效应的一种微服务链路保护机制。当扇出链路的某个微服务出错不可用或者响应时间过长时,会进行服务的降级,进而熔断该节点微服务的调用,快速的返回服务的错误信息。当检测到该节点的微服务调用响应正常后,恢复调用链路
在SpringCloud框架里,熔断机制通过Hystrix实现,Hystrix会监控微服务间调用的情况,当失败的调用到一定阀值,缺省是5s呢20次调用失败。
熔断机制的注解是@HystrixCommand

2、使用
(1)在业务类方法上添加服务熔断

  //====服务熔断
    @Override
    @HystrixCommand(fallbackMethod = "payemntCircuitBreaker_fallback",commandProperties = {
            @HystrixProperty(name="circuitBreaker.enabled",value = "true"),  //是否开启断路器
            @HystrixProperty(name="circuitBreaker.requestVolumeThreshold",value = "10"),    //请求次数
            @HystrixProperty(name = "circuitBreaker.sleepWindowInMilliseconds",value = "10000"), //时间窗口期10s
            @HystrixProperty(name = "circuitBreaker.errorThresholdPercentage",value = "60"),    //失败率达到60%后跳闸
    })
    public String paymentCircuiBreaker(@PathVariable("id") Integer id){
        if(id < 0){
            throw new RuntimeException("id不能为负数!");
        }
        String serialNumber = IdUtil.simpleUUID();
        return Thread.currentThread().getName()+"\t"+"调用成功,流水号:"+serialNumber;
    }
    public String payemntCircuitBreaker_fallback(@PathVariable("id") Integer id){
        return "id 不能为负数,请稍后再试。id:"+id;
    }

(2)controller层测试

@GetMapping("/payment/circuit/{id}")
public String paymentCircuitBreaker(@PathVariable("id")  Integer id){
    String result = paymentService.paymentCircuiBreaker(id);
    log.info("result:"+result);
    return result;
}

(3)测试结果
业务类很简单,就是判断参数id的值,用id<0模拟异常情况发生。
当访问的id>=0时,方法调用成功:在这里插入图片描述
当访问id<0时,方法出现异常执行兜底方法payemntCircuitBreaker_fallback():在这里插入图片描述
当在一个时间窗口期(此处设定10s)访问的失败率达到60%(此处我们用id<0的路径多次访问,然后在用id>=0的访问),则会发生服务熔断,发生服务熔断之后即便是id>0的访问,也会报异常:在这里插入图片描述
可以看到发生了服务熔断,服务无法正常调用,当再多次发送id>=0的请求,则服务用会恢复:在这里插入图片描述
后台打印情况:在这里插入图片描述

3、总结
(1)服务熔断类型
熔断打开:请求不能够正常调用服务,内部设置时钟一般为MTTR(平均故障处理时间),当打开时长达到所设时间窗口期则进入半熔断状态。
熔断关闭:熔断关闭不会对服进行熔断。
熔断半开:部分请求根据规则调用当前服务,如果请求成功且符合当前规则则认为当前服务恢复正常,关闭熔断。

(2)断路器涉及的三个参数:快照空间窗、请求总数阀值、错误百分比阀值
快照空间窗:断路器确定是否打开需要统计一些请求和错误数据,而统计的时间范围就是快照窗口期,默认为最近的10s。
请求总数阀值:在快照时间窗口内,必须满足请求总数阀值才有资格熔断。默认为20,意味着在10s内,若果该hystrix命令调用次数不足20次,即使所有请求都超时或其他原因失败,断路器都不会打开。
错误百分比阀值:当请求总数在快照时间窗内超过了阀值,比如发生了30次调用,如果在这30次调用中,有15次发生了超时异常,也就是超过50%的错误百分比,在默认设定50%阀值的情况下,这时候就会将断路器打开。

(3)服务熔断后是怎么回复的呢?
对于这个问题,hystrix也为我们实现了自动恢复功能。
当断路器打开,对主逻辑进行熔断之后,hystrix会启动一个休眠时间窗,在这个时间窗内,降级兜底的方法会作为临时主逻辑。
当休眠时间窗到期,断路器将进入半开状态,释放一次请求到在原来的主逻辑上:如果此次请求正常返回,那么断路器会闭合,主逻辑恢复;如果这次请求仍有异常,休眠时间窗将重新计时

(4)注解配置参数总结

@HystrixCommand(fallbackMethod = "xxx_method",
        groupKey = "strGroupCommand",
        commandKey = "strCommarld",
        threadPoolKey = "strThreadPool",
        commandProperties = {
                //设置隔离策略,THREAD 表示线程她SEMAPHORE:信号他隔离
                @HystrixProperty(name = "execution.isolation.strategy", value = "THREAD"),
                //当隔离策略选择信号他隔离的时候,用来设置信号地的大小(最大并发数)
                @HystrixProperty(name = "execution.isolation.semaphore.maxConcurrentRequests", value = "10"),
                //配置命令执行的超时时间
                @HystrixProperty(name = "execution.isolation.thread.timeoutinMilliseconds", value = "10"),
                //是否启用超时时间
                @HystrixProperty(name = "execution.timeout.enabled", value = "true"),
                //执行超时的时候是否中断
                @HystrixProperty(name = "execution.isolation.thread.interruptOnTimeout", value = "true"),
                //执行被取消的时候是否中断
                @HystrixProperty(name = "execution.isolation.thread.interruptOnCancel", value = "true"),
                //允许回调方法执行的最大并发数
                @HystrixProperty(name = "fallback.isolation.semaphore.maxConcurrentRequests", value = "10"),
                //服务降级是否启用,是否执行回调函数
                @HystrixProperty(name = "fallback.enabled", value = "true"),
                @HystrixProperty(name = "circuitBreaker.enabled", value = "true"),
                //该属性用来设置在滚动时间窗中,断路器熔断的最小请求数。例如,默认该值为20的时候,
                //如果滚动时间窗(默认10秒)内仅收到了19个请求,即使这19个请求都失败了, 断路器也不会打开。
                @HystrixProperty(name = "circuitBreaker.requestVolumeThreshold", value = "20"),
                // 该属性用来设置在熔动时间窗中表示在滚动时间窗中,在请求数量超过
                // circuitBreaker.requestVolumeThreshold 的情况下,如果错误请求数的百分比超过50,
                //就把断路器设置为“打开”状态,否则就设置为“关闭”状态。
                @HystrixProperty(name = "circuitBreaker.errorThresholdPercentage", value = "50"),
                // 该属性用来设置当断路器打开之后的休眠时间窗。休眠时间窗结束之后,
                //会将断路器置为"半开”状态,尝试熔断的请求命令,如果低然失败就将断路器继续设置为"打开”状态,
                //如果成功就设置为"关闭”状态。
                @HystrixProperty(name = "circuitBreaker.sleepWindowinMilliseconds", value = "5009"),
                //断路器强制打开
                @HystrixProperty(name = "circuitBreaker.force0pen", value = "false"),
                // 断路器强制关闭
                @HystrixProperty(name = "circuitBreaker.forceClosed", value = "false"),
                //滚动时间窗设置,该时间用于断路器判断健康度时需要收集信息的持续时间
                @HystrixProperty(name = "metrics.rollingStats.timeinMilliseconds", value = "10000"),
                //该属性用来设置滚动时间窗统计指标信息时划分”桶"的数量,断路器在收集指标信息的时候会根据设置的时间窗长度拆分成多个"相"来累计各度量值,每个”桶"记录了-段时间内的采集指标。
                //比如10秒内拆分成10个”桶"收集这样,所以timeinMilliseconds 必须能被numBuckets 整除。否则会抛异常
                @HystrixProperty(name = "metrics.rollingStats.numBuckets", value = "10"),
                //该属性用来设置对命令执行的延迟是否使用百分位数来跟踪和计算。如果设置为false,那么所有的概要统计都将返回-1.
                @HystrixProperty(name = "metrics .rollingPercentile.enabled", value = "false"),
                //该属性用来设置百分位统计的滚动窗口的持续时间, 单位为毫秒。
                @HystrixProperty(name = "metrics.rollingPercentile.timeInMilliseconds", value = "60000"),
                //该属性用来设置百分位统计演动窗口中使用“桶”的数量。
                @HystrixProperty(name = "metrics.rollingPercentile.numBuckets", value = "60000"),
                // 该属性用来设置在执行过程中每个 “桶”中保留的最大执行次数。如果在滚动时间窗内发生超过该设定值的执行次数,就从最初的位置开始重写。例如,将该值设置为100,燎动窗口为10秒, 若在10秒内一 一个“桶 ” 中发生7500次执行,
                //那么该“桶”中只保留最后的100次执行的统计。另外,增加该值的大小将会增加内存量的消耗, 并增加排序百分位数所需的计算
                @HystrixProperty(name = "metrics.rollingPercentile.bucketSize", value = "100"),
                //该属性用来设置采集影响断路器状态的健康快照(请求的成功、错误百分比) 的间隔等待时间。
                @HystrixProperty(name = "metrics.healthSnapshot.intervalinMilliseconds", value = "500"),
                //是否开启请求缓存
                @HystrixProperty(name = "requestCache.enabled", value = "true"),
                // HystrixCommand的执行和时间是否打印日志到HystrixRequestLog中
                @HystrixProperty(name = "requestLog.enabled", value = "true"),
        },
        threadPoolProperties = {
                //该参数用来设置执行命令线程他的核心线程数,该值 也就是命令执行的最大并发量
                @HystrixProperty(name = "coreSize", value = "10"),
                //该参数用来设置线程她的最大队列大小。当设置为-1时,线程池将使用SynchronousQueue 实现的队列,
                // 否则将使用LinkedBlocakingQueue实现队列
                @HystrixProperty(name = "maxQueueSize", value = "-1"),
                // 该参数用来为队列设置拒绝阀值。 通过该参数, 即使队列没有达到最大值也能拒绝请求。
                //該参数主要是対linkedBlockingQueue 队列的朴充,因为linkedBlockingQueue
                //队列不能动态修改它的对象大小,而通过该属性就可以调整拒绝请求的队列大小了。
                @HystrixProperty(name = "queueSizeRejectionThreshold", value = "5"),
        }
)

三、服务限流

1、概念
限流模式主要是提前对各个类型的请求设置最高的QPS阈值,若高于设置的阈值则对该请求直接返回,不再调用后续资源(简单来说: 秒杀高并发等操作,严禁一窝蜂的过来拥挤,大家排队,一秒钟N个,有序进行)
因为Hystrix以及进入维护,而alibaba的Sentinel对服务限流做的更好,此处不再详细记录学习。

四、Hystrix图形化DashashBoard搭建

1、创建子模块cloud-consumer-hystrix-dashboard9001

2、引入依赖

 <dependencies>
        <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-devtools</artifactId>
            <scope>runtime</scope>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

3、编写application.yml

server:
  port: 9001

4、编写启动类

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

@SpringBootApplication
@EnableHystrixDashboard
public class HystrixDashBoardMain9001 {
    public static void main(String[] args) {
        SpringApplication.run(HystrixDashBoardMain9001.class,args);
    }
}

启动访问http://localhost:9001/hystrix,如下图表示配置DashBoard成功:在这里插入图片描述
5、实现dashboard9001监控payment8001
(1)要实现payment8001被监控,需要有依赖:

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

(2)在payment8001启动类中添加如下配置

@SpringBootApplication
@EnableEurekaClient
@EnableCircuitBreaker	//启用熔断器
public class PaymentHystrixMain8001 {
    public static void main(String[] args) {
        SpringApplication.run(PaymentHystrixMain8001.class,args);
    }

    /**
     * 此配置用于服务监控,与服务容错本身无关。springcloud升级后的坑
     * ServletRegistrationBean因为springboot的默认路径不是"/hystrix.stream"
     * 需要在自己的项目中配置上下文servlet
     */
    @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;
    }
}

启动后在dashboard页面填写payment8001访问路径:在这里插入图片描述
再点击监控,payment8001多次发送异常请求时,可以监控到熔断打开:在这里插入图片描述
在这里插入图片描述
payment8001多次发送正常请求时,可以监控到熔断关闭:在这里插入图片描述
在这里插入图片描述
观察观测窗口
7色
在这里插入图片描述
1圈
实心圆:共有两种含义。它能通过颜色变化代表了实例的健康程度(绿色<黄色<橙色<红色递减)。
该实心圆除了颜色变化外,它的大小也会根据实例的请求流量变化发生变化,流量越大实心圆越大。
所以通过实心圆就可以在大量的实例中发现故障实例和高压力实例
在这里插入图片描述
1线
曲线:用来记录2分钟内流量的相对变化,可以通过它来观测流量的上升和下降趋势。
在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值