服务熔断理论

断路器

相当于保险丝

熔断机制概述

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

1610803432991.png

案例

服务层代码

  1. /**
  2. * 服务熔断
  3. */
  4. @HystrixCommand(fallbackMethod = "paymentCircuitBreakerHandle",commandProperties = {
  5. @HystrixProperty(name = "circuitBreaker.enabled",value = "true"), // 是否开启断路器
  6. @HystrixProperty(name = "circuitBreaker.requestVolumeThreshold",value = "10"), // 请求次数
  7. @HystrixProperty(name = "circuitBreaker.sleepWindowInMilliseconds",value = "10000"), // 时间窗口期
  8. @HystrixProperty(name = "circuitBreaker.errorThresholdPercentage",value = "60") // 失败率达到多少后跳闸
  9. })
  10. @Override
  11. public String paymentCircuitBreaker(Integer id) {
  12. if (id < 0) {
  13. throw new RuntimeException("id不能为负数");
  14. }
  15. String serialNumber = IdUtil.simpleUUID();
  16. return Thread.currentThread().getName() + "\t调用成功,流水号 = " + serialNumber;
  17. }
  18. private String paymentCircuitBreakerHandle(Integer id) {
  19. return "id = " +id +",id不能为负数,请稍后再尝试!!!";
  20. }

服务层代码讲解

  • circuitBreaker.enabled:是否开启断路器
  • circuitBreaker.requestVolumeThreshold:请求次数
  • circuitBreaker.sleepWindowInMilliseconds:时间窗口期
  • circuitBreaker.errorThresholdPercentage:失败率达到多少后跳闸

配置这几个属性是什么意思呢?

  在开启断路器的情况下,如果在时间窗口期10s内,请求数量达到10次,并且请求失败率达到60%,也就是6次失败,跳闸后,在短时间呢?是不会恢复的,等过一段时间后,服务熔断会自己慢慢的恢复链路

还有,我是怎么知道上面几个属性的呢?
所有的属性你都可以在HystrixCommandProperties类中找到

1610803433044.png

控制层代码

/**
 * 服务熔断
 * @param id
 * @return
 */
@GetMapping("/circuit/breaker/{id}")
public String paymentCircuitBreaker(@PathVariable(value="id") Integer id) {
    String result = paymentService.paymentCircuitBreaker(id);
    return result;
}

测试服务熔断

正常访问

1610803433083.gif

在10s以内疯狂出错,然后自动开启熔断,然后一段时间内,如果出错率降低,会慢慢回复链路的

1610803433156.gif

熔断类型

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

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

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

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

涉及到断路器的三个重要参数:快照时间窗、请求总数阀值、错误百分比阀值。

快照时间窗
  断路器确定是否打开需要统计—些请求和错误数据,而统计的时间范囯就是快照时间窗,默认为最近的10秒

请求总数阀值
  在快照时间窗内,必须满足请求总数阀值才有资格熔断。默认为20,意味着在10秒内,如果该hystrⅸ命令的调用次数不足20次,即使所有的请求都超时或其他原因失败,断路器都不会打开。

错误百分比阀值
  当请求总数在快照时间窗内超过了阀值,比如发生了30次调用,如果在这30次调用中,有15次发生了超时异常,也就是超过50%的错误百分比,在默认设定50%阀值情况下,这时候就会将断路器打开。

断路器开启或关闭的条件

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

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

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

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

一段时间之后(默认是5秒),这个时候断路器是半开状态,会让其中一个请求进行转发。如果成功,断路器会关闭,若失败,继续开启。重复4和5

断路器打开之后

  1. 再有请求调用的时候,将不会调用主逻辑,而是直接调用降级 fallback。通过断路器,实现了自动地发现错误并将降级逻辑切换为主逻辑,減少响应延迟的效果。
  2. 原来的主逻辑要如何恢复呢?
    对于这一问题, hystrix也为我们实现了自动恢复功能
      当断路器打开,对主逻辑进行熔断之后, hysterⅸ会启动一个休眠时间窗,在这个时间窗内,降级逻辑是临时的成为主逻辑,当休眠时间窗到期,断路器将进入半开状态,释放一次请求到原来的主逻辑上,如果此次请求正常返回,那么断路器将继续闭合,主逻辑恢复,如果这次请求依然有问题,断路器继续进入打开状态,休眠时间窗重新计时。