Spring cloud Feign 在restful 调用失败后,会进行重试。在没有到达指定重试次数,会一直重试。
@Override
public Object invoke(Object[] argv) throws Throwable {
RequestTemplate template = buildTemplateFromArgs.create(argv);
Retryer retryer = this.retryer.clone();
while (true) {
try {
return executeAndDecode(template);
} catch (RetryableException e) {
retryer.continueOrPropagate(e);
if (logLevel != Logger.Level.NONE) {
logger.logRetry(metadata.configKey(), logLevel);
}
continue;
}
}
}
重试策略:
public void continueOrPropagate(RetryableException e) {
if (attempt++ >= maxAttempts) { //1. 超过最大重试次数,直接抛异常。
throw e;
}
long interval;
if (e.retryAfter() != null) {
interval = e.retryAfter().getTime() - currentTimeMillis(); // 重试间隔
if (interval > maxPeriod) {
interval = maxPeriod;
}
if (interval < 0) { //重试间隔到期,立即重试
return;
}
} else {
interval = nextMaxInterval();
}
try {
Thread.sleep(interval); //未到期,线程休眠internal指定的时间
} catch (InterruptedException ignored) {
Thread.currentThread().interrupt();
}
sleptForMillis += interval; //统计线程休眠的时间
}