SpringCloud学习(十四):Hystrix的服务熔断实现

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

一、服务熔断概述



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


二、服务熔断和服务降级的区别



       方法调用失败后会触发降级 ,降级就是调用fallback方法,但是无论如何,降级的流程一定是先调用正常方法再调用fallback方法。

 假如单位时间内调用失败次数过多,也就是降级次数过多,则会触发熔断。熔断以后“服务不可用”,即是熔断后直接调用fallback方法,而不再调用正常方法。


三、具体操作



在8001服务中实现服务熔断。


1、service层


//=====服务熔断
    @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"),// 失败率达到多少后跳闸
    })
    public String paymentCircuitBreaker(@PathVariable("id") Integer id) {
        if(id < 0) {
            throw new RuntimeException("******id 不能负数");
        }
        //等价于UUID.randomUUID().toString()
        String serialNumber = IdUtil.simpleUUID();
        return Thread.currentThread().getName()+"\t"+"调用成功,流水号: " + serialNumber;
    }
    //为paymentCircuitBreaker兜底
    public String paymentCircuitBreaker_fallback(@PathVariable("id") Integer id) {
        return "id 不能负数,请稍后再试,/(ㄒoㄒ)/~~   id: " +id;
    }


2、controller层


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


3、运行测试


(1)先给出正数id

8dd3951c514d4002b88f241c0a29dd3d.png


能够成功调用方法

       

(2)再给出负数id

e7e883cef1ae49c8a3b816634d74f8b7.png


服务降级了。

       

(3)不断地给出负数id,疯狂刷新,使其达到熔断


可以看到,熔断之后,即使id为正数也不能调用正常方法 。

       

(4)一段时间(时间窗口期)后再给出正数id


cbb5445e50504d16b921118b289d6ddd.png


服务恢复,又能正常调用了。


四、总结



cfd49304d5604d8bb6e167a24b60d5ff.png


这个简单的断路器避免在电路打开时进行受保护的呼叫,但当一切恢复正常时需要外部干预来重置它。对于建筑物中的电气断路器,这是一种合理的方法,但对于软件断路器,我们可以让断路器本身检测底层调用是否再次工作。我们可以通过在合适的时间间隔后再次尝试受保护的调用来实现这种自重置行为,并在成功时重置断路器。  


1、熔断类型


(1) 熔断打开

       

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


(2) 熔断关闭

       

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

(3) 熔断半开

       

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


2、断路器在什么情况下开始起作用


493287559b6e4dfaaf784ad5d73e4a76.png


(1)当满足一定的阀值的时候(默认10秒内超过20个请求次数)

   

(2)当失败率达到一定的时候(默认10秒内超过50%的请求失败)

 

到达以上阀值,断路器将会开启。


当开启的时候,所有请求都不会进行转发。


一段时间之后(默认是5秒),这个时候断路器是半开状态,会让其中一个请求进行转发。


如果成功,断路器会关闭,若失败,继续开启。重复此过程。


3、断路器打开之后


       再有请求调用的时候,将不会调用主逻辑,而是直接调用降级fallback。通过断路器,实现了自动地发现错误并将降级逻辑切换为主逻辑,减少响应延迟的效果。


4、原来的主逻辑要如何恢复呢?


对于这一问题,hystrix也为我们实现了自动恢复功能。

       

当断路器打开,对主逻辑进行熔断之后,hystrix会启动一个休眠时间窗,在这个时间窗内,降级逻辑是临时的成为主逻辑,当休眠时间窗到期,断路器将进入半开状态,释放一次请求到原来的主逻辑上,如果此次请求正常返回,那么断路器将继续闭合,主逻辑恢复,如果这次请求依然有问题,断路器继续进入打开状态,休眠时间窗重新计时。


相关文章
|
19天前
服务熔断器-Hystrix
服务熔断器-Hystrix
25 2
|
19天前
SpringCloud服务已经关但是Eureka还是显示up
SpringCloud服务已经关但是Eureka还是显示up
34 0
|
7天前
|
存储 Nacos 数据安全/隐私保护
【SpringCloud】Nacos的安装、Nacos注册、Nacos服务多级存储模型
【SpringCloud】Nacos的安装、Nacos注册、Nacos服务多级存储模型
26 1
|
19天前
|
存储 SpringCloudAlibaba Java
【微服务 SpringCloud】实用篇 · 服务拆分和远程调用
【微服务 SpringCloud】实用篇 · 服务拆分和远程调用
33 2
|
19天前
|
监控 Java API
Spring cloud Hystrix 、Dashboard、API(zuul)相关报错
Spring cloud Hystrix 、Dashboard、API(zuul)相关报错
28 2
|
7天前
|
负载均衡 算法 Java
【SpringCloud】Eureka原理分析、搭建Eureka服务、服务注册、服务发现
【SpringCloud】Eureka原理分析、搭建Eureka服务、服务注册、服务发现
22 3
|
19天前
|
Java 数据安全/隐私保护 Sentinel
微服务学习 | Spring Cloud 中使用 Sentinel 实现服务限流
微服务学习 | Spring Cloud 中使用 Sentinel 实现服务限流
|
19天前
|
监控 Java 微服务
第八章 Spring Cloud 之 Hystrix
第八章 Spring Cloud 之 Hystrix
17 0
|
19天前
|
Java Maven Nacos
Spring Cloud Eureka 服务注册和服务发现超详细(附加--源码实现案例--及实现逻辑图)
Spring Cloud Eureka 服务注册和服务发现超详细(附加--源码实现案例--及实现逻辑图)
32 0
|
7月前
|
缓存 运维 监控
微服务技术系列教程(22) - SpringCloud- 服务保护机制Hystrix
微服务技术系列教程(22) - SpringCloud- 服务保护机制Hystrix
67 0