【细说漫谈】Hystrix之服务熔断

前言:

本篇博客主要是向大家分享Hystrix服务熔断的相关理论及案例分析。


服务熔断:

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

Created with Raphaël 2.2.0 服务降级 恢复调用链路 确认? 进而熔断 yes no

断路器:
一句话就是家里的保险丝。
熔断是什么:

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

【细说漫谈】Hystrix之服务熔断_第1张图片

package com.zcw.springcloud.service;

import cn.hutool.core.util.IdUtil;
import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand;
import com.netflix.hystrix.contrib.javanica.annotation.HystrixProperty;
import org.springframework.stereotype.Service;
import org.springframework.web.bind.annotation.PathVariable;

import java.util.concurrent.TimeUnit;

/**
 * @ClassName : PaymentService
 * @Description :
 * @Author : Zhaocunwei
 * @Date: 2020-05-19 15:48
 */
@Service
public class PaymentService {

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

    @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()+" paymentInfo_TimeOut,id:"+id+"\t"+"O(∩_∩)O哈哈~"+ "耗时3秒钟";
    }
    public String paymentInfo_TimeOutHandler(Integer id ){
        return "线程池:"+Thread.currentThread().getName()+"paymentInfo_TimeOutHandler,id: "+ id+"\t"+"┭┮﹏┭┮";
    }
    //============服务熔断==============================
    @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 不能负数");
        }
        String serialNumber = IdUtil.simpleUUID();
        return Thread.currentThread().getName()+"\t"+"调用成功,流水号:"+serialNumber;
    }
    public String paymentCircuitBreaker_fallback(@PathVariable("id") Integer id){
        return "id 不能负数,请稍后再试,o(╥﹏╥)o  id:" + id;
    }
}


【细说漫谈】Hystrix之服务熔断_第2张图片

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

  • 测试
    正确姿势:
    【细说漫谈】Hystrix之服务熔断_第3张图片
    错误姿势:
    【细说漫谈】Hystrix之服务熔断_第4张图片

总结:

【细说漫谈】Hystrix之服务熔断_第5张图片
根据官网提供的图片流程,我们可以总结如下:
熔断打开:
请求不再进行调用当前服务,内部设置时钟一般为MTTR(平均故障处理时间),当打开时长达到所设时钟则进入半熔断状态。
熔断关闭:
熔断关闭不会对服务进行熔断。
熔断半开:
部分请求根据规则调用当前服务,如果请求成功且符合规则则认为当前服务恢复正常,关闭熔断。

原理分析

  • 官断路器流程图
    官网步骤:
    【细说漫谈】Hystrix之服务熔断_第6张图片
    断路器在什么情况下开始起作用:
    【细说漫谈】Hystrix之服务熔断_第7张图片
    涉及到断路器的三个重要参数:快照时间窗、请求总数阈值、错误百分比阈值。
    1.快照时间窗: 断路器确定是否打开需要统计一些请求和错误数据,而统计的时间范围就是快照时间窗,默认为最近的10秒。
  1. 请求总数阈值:在快照时间窗内,必须满足请求总数阈值才有资格熔断,默认为20,意味着在10秒内,如果该hystrix命令的调用次数不足20次,即使所有的请求都超时或其他原因失败,断路器都不会打开。
  2. 错误百分比阈值: 当请求总数在快照时间窗内超过了阈值,比如发生了30次调用,如果在这30次调用中,有15次发生了超时异常,也就是超过50%的错误百分比,在默认设定50%阈值情况下,这时候就会将断路器打开。

断路器开启或者关闭的条件:
1.当满足一定的阈值的时候(默认10秒内超过20个请求次数)
2.当失败率达到一定的时候(默认10秒内超过50%的请求失败)
3.到达以上阈值,断路器将会开启
4.当开启的时候,所有请求都不会进行转发
5.一段时间之后(默认是5秒),这个时候断路器是半开状态,会让其中一个请求进行转发。如果成功,断路器会关闭,若失败,继续开启,重复4和5
断路器打开之后:
1.再有请求调用的时候,将不会调用主逻辑,而是直接调用降级fallback.通过断路器,实现了自动地发现错误并将降级逻辑切换为主逻辑,减少响应延迟的效果。
2.原来的主逻辑要如何恢复呢:对于这一个问题,hystrix也为我们实现了自动恢复功能。当断路器打开,对主逻辑进行熔断之后,hystrix会启动一个休眠时间窗,在这个时间窗内,降级逻辑是临时的成为主逻辑,当休眠时间窗到期,断路器将进入半开状态,释放一次请求到原来的主逻辑上,如果此次请求正常返回,那么断路器将继续闭合,主逻辑恢复,如果这次请求依然有问题,断路器继续进入打开状态,休眠时间窗重新计时。
最全配置:

你可能感兴趣的:(Spring,#)