Hystrix断路器 之 服务熔断
一、概述
熔断机制是应对雪崩效应的一种微服务链路保护机制。当扇出链路的某个微服务出错不可用或者响应时间太长会进行服务的降级,进而熔断该节点微服务的调用,快速返回错误的响应信息,当检测到该节点微服务调用响应正常后,恢复调用链路
Hystrix默认5秒内20次调用失败会启动熔断机制。
关键注解 @HystrixCommand
断路器原理文档
状态图:
二、实例
在 服务提供者,本系列中 的 cloud-provider-hystrix-payment-8001上实现服务熔断
org.zhl.springcloud.service.PaymentService
/*---服务熔断---*/
@HystrixCommand(
fallbackMethod = "paymentCircuitBreak_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 paymentCircuitBreak(@PathVariable("id")Integer id){
if(id<0){
throw new RuntimeException("id 不能为负数");
}
String serialNumber= IdUtil.simpleUUID();
return Thread.currentThread().getName()+"\t"+"调用成功,流水号:"+serialNumber;
}
public String paymentCircuitBreak_fallback(@PathVariable("id")Integer id){
return "id 不能为负数 ,请稍后重试!!";
}
com.zhl.springcloud.controller.PaymentController#paymentCircuitBreak
/*服务熔断方法*/
@GetMapping("/payment/circuit/{id}")
public String paymentCircuitBreak(@PathVariable("id")Integer id){
return paymentService.paymentCircuitBreak(id);
}
测试:
访问连续访问10次引起错误的地址1,访问地址2,结果会打开断路器,地址2也返回错误,连续访问地址2后,结果变正常。
说明,连续引发异常后,断路器处于Open状态,连续访问正常接口时,断路器处于 HalfOpen状态,最后Close。
三、总结
1. 熔断类型
熔断打开
请求不再进行调用当前服务,内部设置时钟一般为MTTR(平均故障处理时间)当打开时长达到所设时钟则进入半熔断状态
熔断关闭
熔断关闭不会对服务进行熔断
熔断半开
部分请求根据规则调用当前服务,如果请求成功且复合规则则认为当前服务恢复正常,关闭熔断
2. 断路器在什么情况下开始起作用
涉及到三个重要参数,快照时间窗口,请求总数阈值,错误百分比阈值
快照时间窗
断路器确定是否打开需要统计一些请求和错误数据,而统计的时间范围就是快照时间窗,默认为最近的10秒
请求总数阀值
在快照时间窗内,必须满足请求总数阀值才有资格熔断。默认20秒。意味着在10秒内,如果该hystrix命令的调用次数不足20次,即使所有请求都超时或其他原因失败,断路器都不会打开
错误百分比阀值
当请求总数在快照时间窗内超过了阀值,比如发生了30次调用,如果在这30次调用中,有15次发生了超时异常,也就是超过了50%的错误百分比,在默认设定50%阀值情况下,这时候就会将断路器打开
3.断路器开启或关闭的条件
1.当满足一定的阀值的时候 默认10秒内超过20个请求次数
2.当失败率达到一定的时候,默认10秒内超过50%请求失败
3.到达以上阀值,断路器将会开启
4.当开启的时候,所有请求都不会进行转发
5.一段时间之后,(默认5秒),这个时候断路器是半开状态,会让其中一个请求进行转发,如果成功,断路器会关闭,若失败,继续开启,重复4,5
4.断路器打开之后
1. 再有请求调用的时候,将不会调用主逻辑,而是直接调用降级fallback.通过断路器,实现了自动地发现错误并将降级逻辑切换为主逻辑,减少响应延迟的效果。
2.原有的主逻辑如何恢复?
hystrix为我们实现了自动恢复功能,
当断路器打开,对主逻辑进行熔断之后 ,hystrix会启动一个休眠窗口,在这个时间窗内,降级逻辑是临时的成为主逻辑,
当休眠时间窗到期,断路器进入半开状态,释放一次请求到原来的主逻辑上,如果此次请求正常返回,那么断路器将继续闭合。
主逻辑恢复,如果这次请求依然有问题,断路器继续进入打开状态,休眠时间窗重新计时。
5.ALL配置
6.Hystrix 工作流程图