Hystrix服务熔断的用法

服务熔断是什么

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

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

Hystrix服务熔断的用法

Closed:熔断器关闭状态(所有请求返回成功)

Open:熔断器打开状态(调用次数累计到达阈值或者比例,熔断器打开,服务直接返回错误)

Half Open:熔断器半开状态(默认时间过后,进入半熔断状态,允许定量服务请求,如果调用都成功,则认为恢复了,则关闭断路器,反之打开断路器)

使用

//这里即10秒内10次请求中失败6次则熔断
@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;
}

关于服务熔断,除了要将circuitBreaker.enabled设为true,还有三个重要的参数:

参数 含义 默认值
sleepWindowInMilliseconds 快照时间窗:断路器确定是否打开需要统计一些请求和错误数据,而统计的时间范围就是快照时间窗 5000
requestVolumeThreshold 请求总数阀值:在快照时间窗内,必须满足请求总数阀值才有资格熔断。 20
errorThresholdPercentage 错误百分比阀值:当请求总数在快照时间窗内超过了阀值,比如对于50%,发生了30次调用,如果在这30次调用中,有15次发生了超时异常,就会将断路器打开。 50

然后修改controller调用它:

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

此时启动服务,若访问 http://localhost:8001/payment/circuit/-30 (只要传入id为负数)在10秒钟之内超过10次(此时的失败率是100%),就会触发熔断,在熔断期间内,即使发出正常的请求如 http://localhost:8001/payment/circuit/10 也不会得到回复

原创文章,作者:彭晨涛,如若转载,请注明出处:https://www.codetool.top/article/hystrix%e6%9c%8d%e5%8a%a1%e7%86%94%e6%96%ad%e7%9a%84%e7%94%a8%e6%b3%95/

发表评论

电子邮件地址不会被公开。