Hystrix

Hystrix的三个重要概念:

服务降级.

  说明:服务器忙,请稍候再试,不让客户端等待并立刻返回一个友好提示,fallback

  降级条件:超时,运行异常,线程池/信号量打满也会导致服务降级,熔断触发

服务熔断

  说明:类比保险丝达到最大服务访问后,直接拒绝访问,拉闸限电,然后调用服务降级的方法并返回友好提示

  概述:熔断机制是应对雪崩效应的一种微服务链路保护机制。当程序链路的某个微服务出错不可用或者相应时间太长时,会进行服务降级,进而熔断该节点微服务的调用,快速返回错误的响应信息。

      当检测到该节点微服务响应正常后,恢复调用链路。当失败的调用达到一定阈值时缺省是5秒内20次调用失败,就会启动熔断机制,熔断机制的注解是@HystrixCommand.

服务限流

  说明:秒杀高并发等操作,严禁一窝蜂的过来拥挤,大家排队,一秒钟N个,有序进行

总结

  感觉降级功能单一,阈值参数单一

  熔断可以自我恢复,且熔断条件参数全面

服务降级

  就是在触发降级条件时,返回一个兜底的方法,不至于让用户死等。

  如下图fallbackMethod是兜底方法,value是超时时间,单位是毫秒,只要在方法上加上这两注解,降级服务就开启了,图中的TimeUnit.seconds.sleep是hutool包下的延时启动

·  

   注意:由于写一个方法,就得在方法上做服务降级注解操作,会造成代码臃肿,降低可读性

      所以我们需要将同用化的方法默认的去指派兜底方法:@DefaultProperties(defaultFallback="兜底方法")

      ps:除了个别重要核心业务有专属降级兜底方法,其他普通的都通过@DefaultProperties(defaultFallback="兜底方法")。

服务熔断

熔断器(断路器)工作原理:

  • 假设请求量达到一定的阈值(HystrixCommandProperties.circuitBreakerRequestVolumeThreshold())
  • 假设错误百分比超过阈值错误百分比 (HystrixCommandProperties.circuitBreakerErrorThresholdPercentage())
  • 满足其一,打开断路器。
  • 当断路器打开,短路所有进过该短路器的请求。
  • 一段时间后(HystrixCommandProperties.circuitBreakerSleepWindowInMilliseconds()), 允许一个请求通过(此时短路器为半开状态),如果该请求成功,短路其设置为打开,否则将短路器设置为关闭,从1开始再进行判断。

熔断操作的相关注解参数阈值:

//服务熔断
@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"), //失败率达到多少后跳闸
})

Hystrix工作流程

官方给的流程图是这样的:

 转换成我们自己的流程图是这样的:

1、  初始化,有两种方式初始化一个Hystrix命令,通过new HystrixCommand或者new HystrixObservableCommand创建,使用服务实例和请求服务需要的参数来构造一个Hystrix命令。

  如果通过注解的方式使用HystrixCommand,那么在请求被拦截时,将会在HystrixCommandAspect中创建Command对象。

2、  成功创建Hystrix后,有四种方法执行实际的命令并得到返回结果。这里Hystrix还使用了响应式编程来设计。

  对于使用HystrixCommand创建命令的实例,执行execute或者queue;而对于使用HystrixObservableCommand创建命令的实例,执行observe或者toObservable方法,可以请求服务然后得到执行结果。这四个方法的特性是:

execute - 会阻塞,然后返回依赖服务的结果
queue - 返回一个Future,然后可以通过get方法获得以来服务的结果。
observe - 订阅包含依赖服务响应结果的订阅器,当有结果时返回一个订阅器。
toObservable - 返回一个订阅器,当订阅它时,会知晓Hystrix命令并返回结果。

3、当前Command是否启用缓存功能(即hystrix.command.default.requestCache.enabled是否为true),启用缓存,并且缓存命中时,立即返回;当返回数据后丢入缓存中去。。

4、如果第三步没有缓存,Hystrix会检查它的熔断器,如果此时熔断器开启了,那么Hystrix不会执行命令,直接返回降级结果。

5、如果信号或者线程池拒绝请求,返回降级结果。

6、Hystrix通过调用HystrixCommand.run()或者HystrixObservableCommand.construct()方法来触发调用外部服务的操作,如果超时或者失败,返回降级结果。 如果run或者construct方法超过了命令定义的超时值,线程会抛出TimeoutException,

此时Hystrix捕捉到异常,就会忽略run或construct方法的返回值,进入fallback。

注意:没有任何方式可以阻止延迟的线程停止工作,在JVM中,Hystrix可以做到最好的就是抛出一个InterruptedException,如果Hystrix封装的服务没有捕获InterruptedException,Hystrix线程池中的线程会继续它的工作。



7、不管请求如何进行:成功、失败、超时、熔断,Hystrix都会上报健康状态到熔断器,记录服务状态,用于判断是否启动/半启动熔断器。

8、fallback,进行降级操作。

fallback流程我们通常也称为:服务降级。

1) 说明

  a) 引起服务降级的场景

  第4步,当前命令处于“熔断/短路”状态,断路器是打开时。

  第5步,当前命令的线程池、请求队列、信号量被占满时。

  第6步,HystrixObservableCommand#construct()或HystrixCommand#run()抛出异常的时候。

总结:会触发回退操作的条件:超时,运行异常,服务宕机(线程池、请求队列、信号量被占满时),熔断触发。

对于每一个Hystrix命令,都需要覆盖getFallback方法,在fallback函数中实现降级的方案,如果需要在fallback中使用网络调用,那么需要通过另一个HystrixCommand或者HystrixObservableCommand。

在HystrixCommand中是实现getFallback方法,在HystrixObservableCommand中,是实现sumeWithFallback方法,如果没有实现fallback方法,或者fallback方法抛出了异常,Hystrix还是会返回一个Observerable,

但是不会返回内容并通过一个onError通知来马上终止。通过onError通知,发生异常的会被返回Hystrix的调用者。尽量不要写出可能会抛出异常的fallback实现。

9、如果一切正常,那么Hystrix会发送成功的结果到Observable,程序再去获取。

 

 


原文地址:https://www.cnblogs.com/shuai666/p/14743619.html