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; //统计线程休眠的时间 }