天天看点

SpringCloud - Hystrix的执行流程(下)8 调用fallback降级机制9 不同的执行方式

8 调用fallback降级机制

failfast

在 run 方法中直接抛异常快速失败。

SpringCloud - Hystrix的执行流程(下)8 调用fallback降级机制9 不同的执行方式

fail silent

SpringCloud - Hystrix的执行流程(下)8 调用fallback降级机制9 不同的执行方式

run 里有个降级方法,内部返回一个空

return null ;
return new Option<T>();
return Collections . emptyList();
return Collections . emptyMap( );      

static fallback

  • 降级方法中返回一个默认值。
SpringCloud - Hystrix的执行流程(下)8 调用fallback降级机制9 不同的执行方式
return true;
return DEFAULT_OBJECT;      

fallback by network

  • 主服务挂了,调用辅助服务的一个降级方法(需通过网络传输请求了)
SpringCloud - Hystrix的执行流程(下)8 调用fallback降级机制9 不同的执行方式

primary + sencondary with fallback

主次降级。将新功能封装在老功能后面。

SpringCloud - Hystrix的执行流程(下)8 调用fallback降级机制9 不同的执行方式

请求合并

将请求通过时间窗口都合并在一个队列中。

SpringCloud - Hystrix的执行流程(下)8 调用fallback降级机制9 不同的执行方式

请求缓存

SpringCloud - Hystrix的执行流程(下)8 调用fallback降级机制9 不同的执行方式

在以下几种情况中,hystrix会调用fallback降级机制

run()或construct()抛出一个异常

短路器打开

线程池/队列/semaphore满了

command执行超时了

一般在降级机制中,都建议给出一些默认的返回值,比如静态的一些代码逻辑,或者从内存中的缓存中提取一些数据,尽量在这里不要再进行网络请求了

即使在降级中,一定要进行网络调用,也应该将那个调用放在一个HystrixCommand中,进行隔离

在HystrixCommand中,实现getFallback()方法,可以提供降级机制

在HystirxObservableCommand中,实现一个resumeWithFallback()方法,返回一个Observable对象,可以提供降级结果

如果fallback返回了结果,那么hystrix就会返回这个结果

对于HystrixCommand,会返回一个Observable对象,其中会发返回对应的结果

对于HystrixObservableCommand,会返回一个原始的Observable对象

如果没有实现fallback,或者是fallback抛出了异常,Hystrix会返回一个Observable,但是不会返回任何数据

不同的command执行方式,其fallback为空或者异常时的返回结果不同

对于execute(),直接抛出异常

对于queue(),返回一个Future,调用get()时抛出异常

对于observe(),返回一个Observable对象,但是调用subscribe()方法订阅它时,理解抛出调用者的onError方法

对于toObservable(),返回一个Observable对象,但是调用subscribe()方法订阅它时,理解抛出调用者的onError方法

9 不同的执行方式

execute(),获取一个Future.get(),然后拿到单个结果

queue(),返回一个Future

observer(),立即订阅Observable,然后启动8大执行步骤,返回一个拷贝的Observable,订阅时理解回调给你结果

toObservable(),返回一个原始的Observable,必须手动订阅才会去执行8大步骤