Feign 重试解析

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

  

猜你喜欢

转载自www.cnblogs.com/lzmrex/p/9466776.html