什么是熔断?

熔断相当于电线跳闸
类比保险丝达到最大服务访问后,直接拒绝访问,拉闸限电,然后调用服务降级的方法并友好提示。

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

过程:

先降级——> 熔断——>恢复
image.png

配置:

  1. //=================================服务熔断
  2. @HystrixCommand(fallbackMethod = "paymentCircuitBreaker_fallback",commandProperties={
  3. @HystrixProperty(name="circuitBreaker.enabled",value = "true"),//是否开启熔断器
  4. @HystrixProperty(name="circuitBreaker.requestVolumeThreshold",value="10"),//访问10次
  5. @HystrixProperty(name="circuitBreaker.sleepWindowInMilliseconds",value="10000"),//窗口期
  6. @HystrixProperty(name="circuitBreaker.errorThresholdPercentage",value="60"),//失败率在百分之60以上
  7. })
  8. public String paymentCircuitBreaker(Integer id){
  9. if(id<0){
  10. throw new RuntimeException("id--------不能为负数");
  11. }
  12. String a= IdUtil.simpleUUID();
  13. return "调用成功"+a;
  14. }
  15. public String paymentCircuitBreaker_fallback(Integer id){
  16. return "id 不能为负数,请稍后再试 o(╥﹏╥)o";
  17. }

image.png

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

image.png
image.png

当熔断器打开之后:

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

Hystrix执行流程:

image.png

工作流程:

  1. 构造一个HystrixCommand或HystrixObservableCommand对象,用于封装请求,并在构造方法中配置请求被执行需要的参数
  2. 执行命令,Hystrix提供了4种执行命令的方法
  3. 判断是否使用缓存响应请求,若启用了缓存,且缓存可用,直接使用缓存响应请求。Hystrix支持请求缓存,但需要用户自定义启动
  4. 判断是否开启了熔断器,如果开启了直接跳到 8
  5. 判断线程池是否已经漫 如果已经漫了 就跳到 8
  6. 执行HystrixObservableCommand.construct()或HystrixCommand.run() 如果执行失败或者超时 就跳到 8
  7. 返回正常结果