SpringCloud(H版&alibaba)之Hystrix篇

本文详细介绍了SpringCloud Hystrix的断路器机制,包括服务降级、服务熔断和服务限流的概念。通过示例展示了如何在微服务中构建Hystrix支付微服务,以及在高并发压力下如何使用Hystrix进行服务降级和熔断。文章还探讨了服务雪崩问题,并提供了JMeter高并发压测的场景分析。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

SpringCloud(H版&alibaba)之Hystrix篇

Hystrix断路器 豪猪哥

官网资料:https://github.com/Netflix/Hystrix/wiki/How-To-Use

服务降级

概述

分布式系统面临的问题

​ 复杂分布式体系结构总的应用程序有数十个依赖关系,每个依赖关系在某些时候将不可避免地失败。

​ 服务雪崩

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

​ 对于高流量的应用来说,单一的后端依赖可能会导致所有服务器上的所有资源都在几秒内饱和。比失败更糟糕的是,这些应用程序还可能导致服务之间的延迟增加,备份队列,线程和其他系统资源紧张,导致整个系统发生更多的级联故障。这些都表示需要对故障和延迟进行隔离和管理,以便单个依赖关系的失败,不能取消整个应用程序或系统。

​ 所以,通常当你发现一个模块下的某个实例失败后,这时候,这个模块依然还会接收流量,然后这个有问题的模块还调用了其他的模块,这样就会发生级联故障,或者叫雪崩。

是什么

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

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

能干嘛

​ 服务降级

​ 服务熔断

​ 接近实时的监控

​ 。。。。。。。 限流,隔离

官网资料

​ https://github.com/Netflix/Hystrix/wiki/How-To-Use

Hystrix 官宣,停更进维

​ 但是理念很重要,其他的技术理念也差不多

Hystrix重要概念

服务降级 fallback

​ 服务器忙,请稍后再试,不让客户端等待并立刻返回一个友好提示,fallback

​ 哪些情况会发出降级:

​ 程序运行异常

​ 超时

​ 服务熔断触发服务降级

​ 线程池/信号量打满也会导致服务降级

服务熔断

​ 类比保险丝达到最大服务访问后,直接拒绝访问,拉闸限电,然后调用服务降级的方法并返回友好提示

​ 就是保险丝 : 服务的降级 》 进而熔断 》 恢复调用链路

服务限流

​ 秒杀高并发等操作,严禁一窝蜂的过来拥挤,大家排队,一秒钟N个,有序进行

​ 令牌桶好像也可以

Google 开源工具包Guava提供了限流工具类RateLimiter也可以达成该作用。

Hystrix支付微服务构建

将Eureka改成单机版

      # 集群就指向其他eureka
#      defaultZone: http://eureka7002.com:7002/eureka/,http://eureka7003.com:7003/eureka/
      #单机版就只指向自己
      defaultZone: http://eureka7001.com:7001/eureka/

1.新建cloud-provider-hystrix-payment8001

2.POM

<dependencies>

    <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-eureka-client</artifactId>
    </dependency>

    <dependency>
        <groupId>com.huawei.springcloud</groupId>
        <artifactId>cloud-api-commons</artifactId>
        <version>${project.version}</version>
    </dependency>

    <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.projectlombok</groupId>
        <artifactId>lombok</artifactId>
    </dependency>

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-devtools</artifactId>
        <scope>runtime</scope>
        <optional>true</optional>
    </dependency>

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

</dependencies>

3.YML

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

4.主启动类

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

5.业务类

新建controller和service用于正常访问和延迟测试

service部分

public interface PaymentService {

    public String paymentInfo_OK(Integer id);

    public String paymentInfo_Timeout (Integer id);
}

实现类

@Service
public class PaymentServiceImpl implements PaymentService {
    @Override
    public String paymentInfo_OK(Integer id) {
        return "线程池:" + Thread.currentThread().getName() + "  paymentInfo_OK,id: " + id + "\t" +"O(∩_∩)O哈哈~";
    }

    @Override
    public String paymentInfo_Timeout(Integer id) {
        //模拟超时,用于引发降级测试
        int timeNumber = 3;
        try {
            TimeUnit.SECONDS.sleep(timeNumber);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        return "线程池:" + Thread.currentThread().getName() + "  paymentInfo_Timeout,id: " + id + "\t" +"O(∩_∩)O哈哈~" + ",  耗时(秒):" + timeNumber;
    }

}

controller部分

@RestController
@Slf4j
public class PaymentController {

    @Resource
    private PaymentService paymentService;

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

    @GetMapping("/payment/hystrix/ok/{id}")
    public String paymentInfo_OK(@PathVariable("id") Integer id) {
        String result = paymentService.paymentInfo_OK(id);
        log.info("*******paymentInfo_OK_result: " + result);
        return result;
    }

    @GetMapping("/payment/hystrix/timeout/{id}")
    public String paymentInfo_Timeout(@PathVariable("id") Integer id) {
        String result = paymentService.paymentInfo_Timeout(id);
        log.info("*********paymentInfo_Timeout_result: " + result);
        return result;
    }

}

6.正常测试

启动eureka7001和该服务,测试成功

JMeter高并发压测后卡顿

上述在非高并发情形下,还能勉强满足,但是。。。。。

JMeter压力测试

Jmeter安装,官网,2.10版本,banaries zip版,非src的可用

打开方式:bin文件夹,运行jmeter.bat

​ 1.开启Jmeter,来20000个并发压死8001,20000个请求都去访问这个延迟服务

​ 开启方法:新建线程组,设置线程属性:线程数200,Ramp-Up Period (in seconds) :1 循环次数 100

​ 然后保存,

​ 再添加 http请求 :点击添加 》 Sampler > http请求

​ 设置路径

​ 2.再来个访问

开启jmeter的压力测试

​ 3.看演示结果

本来ok接口是秒回,现在也需要转圈圈,延迟后再回

停止后,情况后台,再访问ok接口,又秒回

​ 4.为什么会卡死

tomcat 默认的工作线程数被打满,没有多余的线程来分解压力和处理。

5.结论:

上面还是提供者8001自己测试,假如此时外部的消费者80也来访问,就只能干等,导致消费端80不满意,服务端8001直接被拖死。

订单微服务调用支付服务出现卡顿

加入消费者业务来访问,看看什么情况

新建消费者业务 cloud-consumer-feign-hystrix-order80

hystrix消费侧,服务侧都可以用,但一般用在服务端

1.新建

2.POM

添加了hystrix和openFeign的组件

<dependencies>

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

    <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-eureka-client</artifactId>
    </dependency>

    <dependency>
        <groupId>com.huawei.springcloud</groupId>
        <artifactId>cloud-api-commons</artifactId>
        <version>${project.version}</version>
    </dependency>

    <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.projectlombok</groupId>
        <artifactId>lombok</artifactId>
    </dependency>

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-devtools</artifactId>
        <scope>runtime</scope>
        <optional>true</optional>
    </dependency>

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

</dependencies>

3.YML

server:
  port: 80

eureka:
  client:
    register-with-eureka: false
    service-url:
      defaultZone: http://eureka7001.com:7001/eureka/

4.主启动类

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

spring cloud新版本特性 ,不用@EnableEurekaClient 注解,也可以注册到服务中心

5.业务类

service 接口

@Component
@FeignClient(value = "CLOUD-PROVIDER-HYSTRIX-PAYMENT")
public interface PaymentHystrixService {

    @GetMapping("/payment/hystrix/ok/{id}")
    public String paymentInfo_OK(@PathVariable("id") Integer id);

    @GetMapping(value = "/payment/hystrix/timeout/{id}")
    public String paymentInfo_Timeout(@PathVariable("id")Integer id);

}

实现类

@Service
public class PaymentHystrixServiceImpl implements PaymentHystrixService {
    @Override
    public String paymentInfo_OK(Integer id) {
        return null;
    }

    @Override
    public String paymentInfo_Timeout(Integer id) {
        return null;
    }
}

controller

@RestController
@Slf4j
public class OrderHystrixController {

    @Resource
    private PaymentHystrixService paymentHystrixService;

    //路径和类的名称改了下,毕竟是消费者方
    @GetMapping("/consumer/payment/hystrix/ok/{id}")
    public String paymentInfo_OK(@PathVariable("id") Integer id) {
        return paymentHystrixService.paymentInfo_OK(id);
    }

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

}

6.正常测试

7.高并发测试

访问出现故障:

There was an unexpected error (type=Internal Server Error, status=500).

Read timed out executing GET http://cloud-provider-hystrix-payment/payment/hystrix/timeout/2

feign.RetryableException: Read timed out executing GET http://cloud-provider-hystrix-payment/payment/hystrix/timeout/2

程序等待三秒超过feign的超时时间了,可以重新设置feign超时时间长一点,有了反应,但是反应慢

压力测试下变慢,有可能超过read time.所以需要新的技术

因此需要降级,限流,熔断等技术

降级容错解决的维度要求

如何解决?解决的要求

超时导致服务器变慢(转圈):超时不再等待

出错(宕机或程序运行出错): 出错要有兜底

解决

1、对方服务(8001)超时了,调用者(80)不能一直卡死等待,必须由服务降级

2、对方服务(8001)宕机了,调用者(80)不能一直卡死等待,必须由服务降级

3、对方服务(8001)OK,调用者(80)自己出故障或者有自我要求(自己的等待时间小于服务提供者),自己服务降级

Hystrix之服务降级支付侧fallback(服务提供者)

降级配置 @HystrixCommand

改造服务提供者 8001

业务类改造:改造service实现类

    @HystrixCommand(fallbackMethod = "paymentInfo_TimeoutHandler",commandProperties = {
            @HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds",value = "3000")
    })
    @Override
    public String paymentInfo_Timeout(Integer id) {
        //模拟超时,用于引发降级测试
        int timeNumber = 5;
//        int age = 10 /0;
        try {
            TimeUnit.SECONDS.sleep(timeNumber);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        return "线程池:" + Thread.currentThread().getName() + "  paymentInfo_Timeout,id: " + id + "\t" +"O(∩_∩)O哈哈~" + ",  耗时(秒):" + timeNumber;
//        return "线程池:" + Thread.currentThread().getName() + "  paymentInfo_Timeout,id: " + id + "\t" +"O(∩_∩)O哈哈~"  ;
    }

    //回调方法,上面的出异常或超时就调用该方法,用于服务降级
    public String paymentInfo_TimeoutHandler (Integer id) {
        return "/(T o T)/调用支付接口超时或者异常:\t" + "\t当前线程池名字" + Thread.currentThread().getName();
    }

两个测试都成功,注意事项:HystrixPropertis 的里面是Milli 不是Mill 容易写错,最好粘贴

主启动类添加注解

新注解:@EnableCircuitBreaker

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

以上用于服务层超时和异常处理处理

Hystrix有自己的线程池,线程是由Hystrix的线程池获取的

Hystrix之服务降级订单侧fallback

服务降级一般用在消费端

80订单微服务,也可以更好的保护自己,自己也依样画葫芦进行客户端降级保护

**题外话,切记:**配置过热部署方式对java代码的改动明显,但是对@HystrixCommand内属性的修改建议重启微服务

YML

feign:
  hystrix:
    enabled: true

开启hystrix

主启动类

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

使用Hystrix要喝feign搭配使用

业务类

controller修改:

@GetMapping(value = "/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(@PathVariable("id")Integer id) {
    return "我是消费者80,对方支付系统繁忙,请10秒钟后再试或者自己一下出错检查自己,o(╥﹏╥)o";
}

重试,直接访问提供者,还和以前一样,而通过消费者访问,就走了消费端的服务降级

Hystrix之全局服务降级DefaultProperties

存在的问题

每个方法都有个回调方法,而且和业务方法混在一起,非常混乱,冗余

办法:统一的和自定义的分开

解决问题

比如说有很多方法都可以走同一个方法

解决膨胀问题

​ feign接口系列

@DefaultProperties(defaultFallback = “”)

​ 可以在controller类上加这个注解,这样就没有特别指明的,可以走默认的服务降级方法

代码:

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

    @Resource
    private PaymentHystrixService paymentHystrixService;

    //路径和类的名称改了下,毕竟是消费者方
    @GetMapping("/consumer/payment/hystrix/ok/{id}")
    public String paymentInfo_OK(@PathVariable("id") Integer id) {
        return paymentHystrixService.paymentInfo_OK(id);
    }

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

    public String paymentTimeoutFallbackMethod(@PathVariable("id")Integer id) {
        return "我是消费者80,对方支付系统繁忙,请10秒钟后再试或者自己一下出错检查自己,o(╥﹏╥)o";
    }

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

}

增加了个全球回调方法,类的头上加了个@DefaultProperties(defaultFallback = “payment_Global_FallbackMethod”)

因为要测试全球回调方法,将原来方法上的具体制定内容换成了@HystrixCommand

Hystrix之统配服务降级FeignFallback

解决耦合问题

服务降级,客户端去调用服务端,碰上服务端宕机或者关机

本次案例服务降级是在客户端80实现的,与服务端8001没有任何关系,只需要为Feign客户端定义的接口添加一个服务降级处理的实现类即可实现解耦 (即:为每一个消费端的service层的接口(因为整合了Feign)配一个fallback类,将该接口的所有fallback方法放这里面去)

未来我们要面对的异常 :运行时异常,超时,宕机

业务类:PaymentController ,之前的方法是一个controller里面写个默认降级方法,耦合在一起

修改cloud-consumer-feign-hystrix-order80 这个消费微服务

​ 根据cloud-consumer-feign-hystrix-order80已经有的PaymentHystrixService接口,重新建一个类

(PaymentFallbackService)实现该接口,统一为接口里的方法进行异常处理

PaymentFallbackService实现类实现PaymentFeignClientService接口

//写服务降级具体的处理方法,别忘了注解

@Component
public class PaymentFallbackService implements PaymentHystrixService{

    @Override
    public String paymentInfo_OK(Integer id) {
        return "********PaymentFallbackService fall back-paymentInfo_OK,o(╥﹏╥)o";
    }

    @Override
    public String paymentInfo_Timeout(Integer id) {
        return "********PaymentFallbackService fall back-paymentInfo_Timeout,o(╥﹏╥)o";
    }

}

YML

feign:
  client:
    config:
      default:
        connectTimeout: 60000
        readTimeout: 60000

  hystrix:
    enabled: true     //主要是这里,打开hystrix

PaymentFeignClientService接口

@Component
@FeignClient(value = "cloud-provider-hystrix-payment",fallback = PaymentFallbackService.class)
public interface PaymentHystrixService {

    @GetMapping("/payment/hystrix/ok/{id}")
    public String paymentInfo_OK(@PathVariable("id") Integer id);

    @GetMapping(value = "/payment/hystrix/timeout/{id}")
    public String paymentInfo_Timeout(@PathVariable("id")Integer id);

}

重点:@FeignClient(value = “cloud-provider-hystrix-payment”,fallback = PaymentFallbackService.class) 表明该接口的服务降级处理类

测试

可以这样

@HystrixCommand(fallbackMethod = "paymentTimeoutFallbackMethod",commandProperties = {
        @HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds",value = "1500")
})

也可以有@DefaultProperties(defaultFallback = “payment_Global_FallbackMethod”)的默认配置,

也可以有配置类

优先级问题:似乎:单独的controller方法上的设置》默认的设置》配置类,但是与老师的测试效果不一样,什么回事?

Hystrix之服务熔断理论

服务熔断也会触发服务降级

概念

服务熔断:类比保险丝达到最大访问量之后,直接拒绝访问,拉闸限电,然后调用服务降级的方法并返回友好提示

保险丝:服务的降级->进而熔断->恢复调用链路

熔断机制:应对雪崩效应的一种微服务链路保护机制。某个微服务出错不可用或者响应时间太长时,会进行服务的降级,进而熔断该节点微服务的调用,快速返回错误的响应信息。

当检测到该节点未付调用响应正常后,恢复调用链路。

在Spring Cloud框架里,熔断机制通过Hystrix实现。Hystrix会监控微服务间调用的状况,当失败的调用到一定的阈值,缺省量5秒内20次调用失败,就会启动熔断机制。熔断机制的注解时@HystrixCommand

Circuit Breaker

关,闭,半开

半开状态: 当访问量过大时,直接断开,过段时间后,当有少量的过来访问时,又试着恢复

实操:改造 cloud-provider-hystrix-payment8001

业务类

提供者微服务的service层实现类

@Override
    //======服务熔断
    @HystrixCommand(fallbackMethod = "paymentCircuitBreaker_fallback",commandProperties = {
            @HystrixProperty(name = "circuitBreaker.enabled",value = "true"), //是否开启断路器
            @HystrixProperty(name = "circuitBreaker.requestVolumeThreshold", value = "10"), //请求次数
            @HystrixProperty(name = "circuitBreaker.sleepWindowInMilliseconds",value = "10000"), //时间窗口期
            @HystrixProperty(name = "circuitBreaker.errorThresholdPercentage",value = "60"), //失败率达到多少后跳闸
            //总的意思是,10秒内,10次请求,有六次失败,就跳闸
            //为什么配置这些查看官网
    })
    public String paymentCircuitBreaker(Integer id) {
        if (id < 0) {
            throw new RuntimeException("**********id  不能负数");
        }
        String serialNumber = IdUtil.simpleUUID();

        return Thread.currentThread().getName() + "调用成功,流水号:" + serialNumber;
    }

    public String paymentCircuitBreaker_fallback(@PathVariable("id") Integer id) {
        return "id 不能负数,请稍后再试,o(╥﹏╥)o   id: " + id;
    }

跳闸后不代表彻底不能用了,过段时间后,下个请求过来,会试着放过去看能不能成功

开始出了bug,后来设置的properties粘贴就好了

controller层

PaymentController:

//----服务熔断
@GetMapping("/payment/hystrix/circuit/{id}")
public String paymentCircuitBreaker(@PathVariable("id") Integer id) {
    String result = paymentService.paymentCircuitBreaker(id);
    log.info("**********result: " + result);
    return result;
}

测试,输入id 11 测试,正常,输入 id 为 -1 走了回调

连续测几次 -1 ,再测11,发现已经断路了,仍然走的 回调的,过段时间再测,发现又正常了

这就是: 服务降级 ——》 进而服务断路 ——》 进而服务恢复

Hystrix之服务熔断总结

熔断类型

熔断打开:请求不再进行调用当前服务,内部设置时钟一般为MTTR(平均故障处理时间),当打开时长达到所设时钟则进入半熔断状态。

熔断关闭:熔断关闭不会对服务进行熔断

熔断半开:部分请求根据规则调用当前服务,如果请求成功且符合规则则认为当前服务恢复正常,关闭熔断

什么情况下熔断:

快照时间内,默认10秒,请求总数阈值:默认20,必须达到次数,否则就算失败,断路器也不会打开;

错误百分比阈值,当请求总数在快照时间内超过阈值,错误次数达到百分比,这时断路器会打开。

例如:没达到10秒,或者次数没达到20次,或者10秒内达到20次,但是错误百分比没达到50%,都不会断路

开启断路时,所有请求都不会进行转发

一段时间后(默认5秒),这个时候断路器处于半开状态,会让其中一个请求进行转发。如果成功,断路器会关闭,若失败,继续开启,重复上述步骤。即:断开,5秒后再试

断路状态:不会进行转发,而是直接走fallback

其他的设置:看资料

Hystrix工作流程最后总结

限流放在alibaba的sentienl里讲

Hystrix工作流程:太复杂了,需要看流程图

Hystrix图形化Dashboard

准实时的调用监控

hystrix-metrics-event-stream 实现指标监控。Spring Cloud也提供了整个。监控内容转化成可视化界面。

1.新建cloud-consumer-hystrix-dashborad9001

2.POM,依赖增加一个

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-dashboard</artifactId>
</dependency>

3.yml

server:
  port: 9001

4.HystrixDashboardMain9001 主启动类 + @EnableHystrixDashboard注解

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

4.所有需要监控的服务都需要依赖actuator

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

之前我们在建每个服务时,都已经加了

5.启动cloud-consumer-hystrix-dashborad9001该微服务后续将监控微服务8001

​ 监控地址:http://localhost:9001/hystrix

访问出现豪猪网页

断路器演示(服务监控hystrixDashboard)

​ 修改cloud-provider-hystrix-payment8001

​ 注意:新版本Hystrix需要在朱启动类MainAppHystrix8001中指定监控路径

​ 否则: Unable to connect to Command Metric Stream

报:404

在被监控的服务主启动类中加一段代码:

@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;
    }

}

@Bean那段就是

测试:

启动一个或者三个eureka集群

启动8001,先测失败的,再测成功的,

看hystrix监控地址:输入stream localhost:8001/hystrix.stream 即地址端口加 上面的urlMappings

可以看到流量上升和下降,以及ciruit 开关,连续错误就open,过段时间再发个正确的,就closed,

circuit不会自动关闭,要有一个正确的通过了,才会

如何看:hystrix各项数据

https://blog.youkuaiyun.com/zhangningkid/article/details/99415515?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522162192263016780262599965%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fall.%2522%257D&request_id=162192263016780262599965&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2allfirst_rank_v2~rank_v29-2-99415515.pc_search_result_cache&utm_term=hystrix%E7%9B%91%E6%8E%A7%E6%95%B0%E6%8D%AE&spm=1018.2226.3001.4187

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值