当开始执行command,调用了它的execute()
之后,Hystrix内部的执行流程和步骤以及原理是怎样的呢?
一个HystrixCommand
或HystrixObservableCommand
对象,代表对某个依赖服务发起的一次请求或者调用
构造的时候,可在构造函数中传入任何需要的参数
执行Command就可以发起一次对依赖服务的调用
要执行Command,需要在4个方法中选择其中的一个
其中execute()和queue()仅对HystrixCommand适用
K value = command.execute();
Future<K> fValue = command.queue();
Observable<K> ohValue = command.observe();
Observable<K> ocValue = command.toObservable();
即,无论是哪种执行command的方式,最终都是依赖toObservable()
从这开始底层的运行原理啦,了解Hysrix的一些高级的功能和特性
如果这个command开启了请求缓存(request cache),而且这个调用的结果在缓存中存在,那么直接从缓存中返回结果
否则,继续往后
检查这个command对应的依赖服务是否开启短路器
如果断路器被打开了,那么hystrix就不会执行这个command,而是直接执行fallback降级
如果command对应的线程池/队列/semaphore已满,那么也不会执行command,而是直接去调用fallback降级机制,同时发送 reject 信息给断路器统计
调用HystrixObservableCommand.construct(
)或HystrixCommand.run()
来实际执行这个command
如果HystrixCommand.run()或HystrixObservableCommand.construct()的执行,超过了timeout时长的话,那么command所在的线程就会抛出一个TimeoutException
如果timeout了,也会去执行fallback降级机制,而且就不会管run()或construct()返回的值
我们是不可能终止掉一个调用严重延迟的依赖服务的线程的,只能说给你抛出来一个TimeoutException,但是还是可能会因为严重延迟的调用线程占满整个线程池的 即使这个时候新来的流量都被限流了。。。
如果没有timeout的话,那么就会拿到一些调用依赖服务获取到的结果,然后hystrix会做一些logging记录和metric统计
Hystrix会将每一个依赖服务的调用成功,失败,拒绝,超时,等事件,都会发送给circuit breaker断路器
短路器就会对调用成功/失败/拒绝/超时等事件的次数进行统计
短路器会根据这些统计次数来决定,是否要进行短路,如果打开了短路器,那么在一段时间内就会直接短路,然后如果在之后第一次检查发现调用成功了,就关闭断路器
在以下几种情况中,hystrix会调用fallback降级机制
一般在降级机制中,都建议给出一些默认的返回值,比如静态的一些代码逻辑,或者从内存中的缓存中提取一些数据,尽量在这里不要再进行网络请求了
即使在降级中,一定要进行网络调用,也应该将那个调用放在一个HystrixCommand中,进行隔离
如果fallback返回了结果,那么hystrix就会返回这个结果
如果没有实现fallback,或者是fallback抛出了异常,Hystrix会返回一个Observable,但是不会返回任何数据
不同的command执行方式,其fallback为空或者异常时的返回结果不同
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。