SpringCloud-Hystrix原理 (5)

服务被降级时,fallback对应的方法需要返回一个通用的结果,并且应该从缓存或静态逻辑中获取,尽可能避免通过网络请求获取结果。如果一定要在降级逻辑中包含网络请求,那么该请求也必须被包装在HystrixCommand或HystrixObservableCommand中,从而形成级联的降级策略。

当使用HystrixCommand的时候,通过实现getFallback()来实现服务降级逻辑,它会返回一个Observable对象,该对象会发射getFallback()的处理结果。当使用HystrixObservableCommand的时候,通过resumeWithFallback()实现服务降级逻辑,它会将Observable对象直接返回。

如果没有为命令实现降级逻辑或者降级处理逻辑中抛出了异常,Hystrix依然会返回一个Observable对象,但是它不会发射任何结果数据,而是通过onError方法通知命令立即中断请求,并通过onError()方法将引起命令失败的异常发送给调用者。实现一个有可能失败的降级逻辑是一种非常糟糕的做法,我们应该在实现降级策略时尽可能避免失败的情况。

c) 降级执行发现失败时

execute():抛出异常。

queue():正常返回Future对象,但是当调用get()来获取结果的时候会抛出异常。

observe():正常返回Observable 对象,当订阅它的时候, 将立即通过调用订 阅者的onError方法来通知中止请求。

toObservable():正常返回Observable对象,当订阅它的时候, 将通过调用订阅者的onError方法来通知中止请求。

2) 代码:

以下是AbstractCommand中的部分fallback代码,更多请参考源码。

private Observable<R> handleSemaphoreRejectionViaFallback() {
Exception semaphoreRejectionException = new RuntimeException("could not acquire a semaphore for execution");
executionResult = executionResult.setExecutionException (semaphoreRejectionException);
eventNotifier.markEvent(HystrixEventType .SEMAPHORE_REJECTED, commandKey);
logger.debug("HystrixCommand Execution Rejection by Semaphore."); // debug only since we're throwing the exception and someone higher will do something with it
// retrieve a fallback or throw an exception if no fallback available
return getFallbackOrThrowException(this, HystrixEventType.SEMAPHORE_REJECTED, FailureType.REJECTED_SEMAPHORE_EXECUTION,
"could not acquire a semaphore for execution", semaphoreRejectionException);
}
private Observable<R> handleShortCircuitViaFallback() {
// record that we are returning a short-circuited fallback
eventNotifier.markEvent (HystrixEventType.SHORT_CIRCUITED, commandKey);
// short-circuit and go directly to fallback (or throw an exception if no fallback implemented)
Exception shortCircuitException = new RuntimeException("Hystrix circuit short-circuited and is OPEN");
executionResult = executionResult.setExecutionException (shortCircuitException);
try {
return getFallbackOrThrowException (this, HystrixEventType.SHORT_CIRCUITED, FailureType.SHORTCIRCUIT,
"short-circuited", shortCircuitException);
} catch (Exception e) {
return Observable.error(e);
}
}
private Observable<R> handleThreadPoolRejectionViaFallback (Exception underlying) {
eventNotifier.markEvent(HystrixEventType. THREAD_POOL_REJECTED, commandKey);
threadPool.markThreadRejection();
// use a fallback instead (or throw exception if not implemented)
return getFallbackOrThrowException(this, HystrixEventType.THREAD_POOL_REJECTED, FailureType.REJECTED_THREAD_EXECUTION, "could not be queued for execution", underlying);
}
 

9 返回成功的响应

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpdywy.html