Idempotencia de interfaz causada por el mecanismo de reintento de FeignClient

Fingir análisis de código fuente, su clase de implementación está en SynchronousMethodHandler, y el método de implementación es invocación de objeto público (Object [] argv), su análisis de código es el siguiente:

1. Construya los datos de la solicitud y convierta el objeto a json:

RequestTemplate template = buildTemplateFromArgs.create(argv);

2. Envíe la solicitud de ejecución (los datos de respuesta se decodificarán si la ejecución es exitosa):

executeAndDecode(template, options);

3. La solicitud de ejecución tendrá un mecanismo de reintento:

    Retryer retryer = this.retryer.clone();
    while (true) {
      try {
        return executeAndDecode(template, options);
      } catch (RetryableException e) {
        try {
          retryer.continueOrPropagate(e);
        } catch (RetryableException th) {
          Throwable cause = th.getCause();
           // 重试结束 或则 不允许重试,则通过抛异常的形式终止 
          if (propagationPolicy == UNWRAP && cause != null) {
            throw cause;
          } else {
            throw th;
          }
        }
        if (logLevel != Logger.Level.NONE) {
          logger.logRetry(metadata.configKey(), logLevel);
        }
        continue;
      }
    }

4. Retryer es un reintento. Hay dos formas de implementarlo. La primera es la implementación predeterminada del sistema y la segunda es que puede personalizar el reintento, que generalmente se usa menos. Puede verlo a través de la implementación predeterminada de la clase de reintento Default. El número de reintentos en el constructor es 5.

    public Default() {
      this(100, SECONDS.toMillis(1), 5);
    }

    public Default(long period, long maxPeriod, int maxAttempts) {
      this.period = period;
      this.maxPeriod = maxPeriod;
      this.maxAttempts = maxAttempts;
      this.attempt = 1;
    }

Por lo tanto, la solución más simple y más utilizada al problema de la idempotencia de las llamadas de Feign es dejar que Feign no vuelva a intentarlo.

Supongo que te gusta

Origin blog.csdn.net/doinbb/article/details/108900836
Recomendado
Clasificación