说明:服务器忙,请稍候再试,不让客户端等待并立刻返回一个友好提示,fallback
降级条件:超时,运行异常,线程池/信号量打满也会导致服务降级,熔断触发
说明:类比保险丝达到最大服务访问后,直接拒绝访问,拉闸限电,然后调用服务降级的方法并返回友好提示
概述:熔断机制是应对雪崩效应的一种微服务链路保护机制。当程序链路的某个微服务出错不可用或者相应时间太长时,会进行服务降级,进而熔断该节点微服务的调用,快速返回错误的响应信息。
当检测到该节点微服务响应正常后,恢复调用链路。当失败的调用达到一定阈值时缺省是5秒内20次调用失败,就会启动熔断机制,熔断机制的注解是@HystrixCommand.
说明:秒杀高并发等操作,严禁一窝蜂的过来拥挤,大家排队,一秒钟N个,有序进行
就是在触发降级条件时,返回一个兜底的方法,不至于让用户死等。
如下图fallbackMethod是兜底方法,value是超时时间,单位是毫秒,只要在方法上加上这两注解,降级服务就开启了,图中的TimeUnit.seconds.sleep是hutool包下的延时启动
·
注意:由于写一个方法,就得在方法上做服务降级注解操作,会造成代码臃肿,降低可读性
所以我们需要将同用化的方法默认的去指派兜底方法:@DefaultProperties(defaultFallback="兜底方法")
ps:除了个别重要核心业务有专属降级兜底方法,其他普通的都通过@DefaultProperties(defaultFallback="兜底方法")。
//服务熔断 @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"), //失败率达到多少后跳闸 })
官方给的流程图是这样的:
转换成我们自己的流程图是这样的:
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