一、服务熔断概述
熔断机制是应对雪崩效应的一种微服务链路保护机制。当扇出链路的某个微服务出错不可用或者响应时间太长时,会进行服务的降级,进而熔断该节点微服务的调用,快速返回错误的响应信息。
二、服务熔断和服务降级的区别
方法调用失败后会触发降级 ,降级就是调用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
能够成功调用方法
(2)再给出负数id
服务降级了。
(3)不断地给出负数id,疯狂刷新,使其达到熔断
可以看到,熔断之后,即使id为正数也不能调用正常方法 。
(4)一段时间(时间窗口期)后再给出正数id
服务恢复,又能正常调用了。
四、总结
这个简单的断路器避免在电路打开时进行受保护的呼叫,但当一切恢复正常时需要外部干预来重置它。对于建筑物中的电气断路器,这是一种合理的方法,但对于软件断路器,我们可以让断路器本身检测底层调用是否再次工作。我们可以通过在合适的时间间隔后再次尝试受保护的调用来实现这种自重置行为,并在成功时重置断路器。
1、熔断类型
(1) 熔断打开
请求不再进行调用当前服务,内部设置时钟一般为MTTR(平均故障处理时间),当打开时长达到所设时钟则进入半熔断状态。
(2) 熔断关闭
熔断关闭不会对服务进行熔断。
(3) 熔断半开
部分请求根据规则调用当前服务,如果请求成功且符合规则则认为当前服务恢复正常,关闭熔断。
2、断路器在什么情况下开始起作用
(1)当满足一定的阀值的时候(默认10秒内超过20个请求次数)
(2)当失败率达到一定的时候(默认10秒内超过50%的请求失败)
到达以上阀值,断路器将会开启。
当开启的时候,所有请求都不会进行转发。
一段时间之后(默认是5秒),这个时候断路器是半开状态,会让其中一个请求进行转发。
如果成功,断路器会关闭,若失败,继续开启。重复此过程。
3、断路器打开之后
再有请求调用的时候,将不会调用主逻辑,而是直接调用降级fallback。通过断路器,实现了自动地发现错误并将降级逻辑切换为主逻辑,减少响应延迟的效果。
4、原来的主逻辑要如何恢复呢?
对于这一问题,hystrix也为我们实现了自动恢复功能。
当断路器打开,对主逻辑进行熔断之后,hystrix会启动一个休眠时间窗,在这个时间窗内,降级逻辑是临时的成为主逻辑,当休眠时间窗到期,断路器将进入半开状态,释放一次请求到原来的主逻辑上,如果此次请求正常返回,那么断路器将继续闭合,主逻辑恢复,如果这次请求依然有问题,断路器继续进入打开状态,休眠时间窗重新计时。