HystrixLearn(2)

https://github.com/Netflix/Hystrix/wiki/How-it-Works

1. 整体流程

image

简单概述: 将请求信息封装为对象 , 进行后续一步一步判断(是否开启拒绝,是否线程池满等等),否则就 执行fallback应急计划等,一下为详细讲解

2. 流程详细讲解

2.1 封装request为command

通过构造(将request参数通过构造器传入) HystrixCommand , HystrixObservealbeCommand 进行对request的封装

例子:

HystrixCommand hystrixCommand = new HystrixCommand(args1,args2);
返回单一响应

HystrixObservableCommand  command = new HystrixObservableCommand (args1,args2);
返回一个观察者命令对象, 通过此对象返回响应

2.2 执行command (方法介绍)

可以使用四个方法

K             value   = command.execute();
Future<K>     fValue  = command.queue();
Observable<K> ohValue = command.observe();         //hot observable
Observable<K> ocValue = command.toObservable();    //cold observable

2.3 是否有缓存

判断是否 请求和响应都进行了缓存,是的话,就直接返回Observalbe结果

2.4 链路是否打开

是否可以正产接收请求, 如果 circuit -breaker打开 则,直接返回 fallback处理
,关闭则进行下一步

2.5 判断线程池 队列 信号量是否有空间

如果空间已经满, 就直接返回fallback处理, 不会进入队列排队

2.6 HystrixObservableCommand.construct() or HystrixCommand.run()

执行两种方法, 如果方法超时, 抛出timeoutexception 并 则直接走fallback方法, 并中断此线程.

需要注意的是, 由于jvm无法强行中断线程, 所以需要通过 InterceptionExceptions来进行中断处理,否则可能会出现, 排除超时异常,但是此线程还是再线程池中继续运行.

2.7 检查链路健康

会向 circuit breaker 报告 成功 失败 拒绝 超时等信息

根据这些信息,会判断何时进行熔断控制, 并恢复到指定值之后 ,再次开启

2.8 Get fallback 提供失败统一处理

当之前的步骤中出现 种种异常时(链路没打开,超时,执行异常), 可以通过定义fallback来统一对发生异常情况进行 后续操作.

需要注意的是,如果在fallback中再次 有调用其他依赖,则需要再次封装hystrix.

当不实现fallback方法的时候,也会有onError 通知机制, 分别在command的四个方法有不同的获取异常方式.

2.9 返回成功结果

原文地址:https://www.cnblogs.com/yaoxublog/p/10895106.html