简介
SpringCloud的重试和熔断机制主要依赖Spring-Retry来实现,完整功能实现主要依赖以下几个对象:
- RetryOperation:接口,主要定义了重试的API;
- RetryTemplate: RetryOperation的模板实现,其将重试和熔断功能进行封装,提供健壮性和不易出错的API供大家使用;
- RetryCallback:进行重试时的相关操作;
- RecoveryCallback:所有重试都尝试后进行有状态的重试;
- RetryState:用来记录有状态的重试;
- RetryContext:重试上下文
RetryTemplate逻辑实现
RetryTemplate是熔断和重试的功能实现模板,其主要属性如下:
- BackOffPolicy:回退策略,是立即重试还是等一段时间在重试,默认实现是NoBackOffPolicy,也就是失败后立即重试;
- RetryPolicy:重试策略,重试时将采用何种方式重试;
- RetryListener[]:重试监听器,业务方用来在重试进行补充操作;
- RetryContextCache:重试上下文缓存,用于缓存RetryContext;
重试具体逻辑如下:
protected <T, E extends Throwable> T doExecute(RetryCallback<T, E> retryCallback,
RecoveryCallback<T> recoveryCallback, RetryState state)
throws E, ExhaustedRetryException {
RetryPolicy retryPolicy = this.retryPolicy;
BackOffPolicy backOffPolicy = this.backOffPolicy;
// RetryPolicy进行初始化以及在state不为空的情况下进行相关缓存
RetryContext context = open(retryPolicy, state);
if (this.logger.isTraceEnabled()) {
this.logger.trace("RetryContext retrieved: " + context);
}
// 注册上下文,以便客户端可以使用该context
RetrySynchronizationManager.register(context);
Throwable lastException = null;
boolean