最新文章

Hystrix工作原理三

Hystrix工作原理三

异常处理

Hystrix异常类型

  • HystrixRuntimeException
  • HystrixBadRequestException
  • HystrixTimeoutException
  • RejectedExecutionException

HystrixRuntimeException

HystrixCommand失败时抛出, 不会触发fallback.

HystrixBadRequestException

用提供的参数或状态表示错误的异常, 而不是执行失败. 与其他HystrixCommand抛出的异常不同, 这个异常不会触发fallback, 也不会记录进failure的指标, 因而也不会触发断路器,

应该在用户输入引起的错误是抛出, 否则会它与容错和后退行为的目的相悖.

不会触发fallback, 也不会记录到错误的指标中, 也不会触发断路器.

RejectedExecutionException

线程池发生reject时抛出

HystrixTimeoutException

HystrixCommand.run()或者HystrixObservableCommand.construct()时抛出, 会记录timeout的次数. 如果希望某些类型的失败被记录为timeout, 应该将这些类型的失败包装为HystrixTimeoutException

异常处理

ignoreExceptions

final Func1<Throwable, Observable<R>> handleFallback = new Func1<Throwable, Observable<R>>() {
    @Override
    public Observable<R> call(Throwable t) {
        circuitBreaker.markNonSuccess();
        Exception e = getExceptionFromThrowable(t);
        executionResult = executionResult.setExecutionException(e);
        if (e instanceof RejectedExecutionException) {
            return handleThreadPoolRejectionViaFallback(e);
        } else if (t instanceof HystrixTimeoutException) {
            return handleTimeoutViaFallback();
        } else if (t instanceof HystrixBadRequestException) {
            return handleBadRequestByEmittingError(e);
        } else {
            /*
             * Treat HystrixBadRequestException from ExecutionHook like a plain HystrixBadRequestException.
             */
            if (e instanceof HystrixBadRequestException) {
                eventNotifier.markEvent(HystrixEventType.BAD_REQUEST, commandKey);
                return Observable.error(e);
            }
            return handleFailureViaFallback(e);
        }
    }
};

Feign中响应状态码处理

Feign使用SynchronousMethodHandler做请求的执行和响应的处理. 响应处理的部分, 对[200, 300)区间的状态, 会将response返回; 如果是404, 根据@FeignClientdecode404(默认为false)和方法返回值判断是否熔断, 如果响应返回404, decodefalse, 同时方法返回值不是void, 会包装成FeignException抛出; 其他的状态, 通过包装成FeignException抛出.