Cómo SpringBoot integra spring-retry para implementar el reintento de solicitud de interfaz

1. Mecanismo de reintento

Debido a la inestabilidad o fluctuación de la red, las solicitudes de interfaz a menudo fallan. Cuando lo intentamos nuevamente, lo logramos. Este es el mecanismo de reintento.

Este artículo se publicó por primera vez en el blog personal de Java Teacher Pan : SpringBoot integra el componente spring-retry para implementar el mecanismo de reintento

Su objetivo principal es aumentar la probabilidad de una solicitud exitosa tanto como sea posible, pero generalmente, si nuestra solicitud falla por primera vez, el código generará una excepción y finalizará. Si desea volver a solicitar, es posible que deba hacerlo manualmente. operaciones, lo cual es muy inconveniente., la viabilidad tampoco es buena. Por lo tanto, el marco Spring brinda soporte para el mecanismo de reintento y se puede usar junto con Hystrix en Spring Cloud para evitar el acceso a instancias anormales.

2. Elementos del mecanismo de reintento

Los elementos del mecanismo de reintento son los siguientes:

  • Limitar el número de reintentos
  • El intervalo de tiempo entre cada reintento.
  • Alarma o reversión de los resultados finales de falla.
  • Elija volver a intentarlo en caso de excepciones de fallas específicas

3. Cosas a tener en cuenta sobre el mecanismo de reintento

Para métodos no idempotentes, debemos utilizar el mecanismo de reintento con precaución, ya que puede provocar consecuencias inesperadas.
La llamada idempotencia significa que los resultados de una solicitud o múltiples solicitudes iniciadas por el usuario para la misma operación son consistentes y no habrá efectos secundarios causados ​​por múltiples clics.

4. SpringBoot integra el reintento de primavera

Echemos un vistazo a cómo deberíamos usar SpringBoot para integrar el componente Spring-Retry para implementar el mecanismo de reintento.

1) Agregar dependencias

Primero, agregamos dependencias relevantes al proyecto SpringBoot pom.xml, de la siguiente manera:

<!-- 重试相关依赖包 -->
<dependency>
    <groupId>org.springframework.retry</groupId>
    <artifactId>spring-retry</artifactId>
    <version>1.2.4.RELEASE</version>
</dependency>
 
<dependency>
    <groupId>org.aspectj</groupId>
    <artifactId>aspectjweaver</artifactId>
    <version>1.9.4</version>
</dependency>

2) Agregar la anotación @EnableRetry

Agregue la anotación @EnableRetry a la clase de inicio principal Aplicación para admitir el mecanismo de reintento.

@SpringBootApplication
@EnableRetry
public class RetryApplication {
 
    public static void main(String[] args) {
 
        SpringApplication.run(RetryApplication.class, args);
    }
 
}

Nota: @EnableRetry también se puede utilizar en clases de configuración, clases ServiceImpl y métodos.

3) Agregar anotación @Retryable

Agregamos anotaciones a los métodos que deben reintentarse @Retryablepara que el método pueda volver a intentarse. Aquí enumero un método en ServiceImpl:

@Service
public class RetryServiceImpl implements RetryService {
 
    @Retryable(value = Exception.class, maxAttempts = 3, backoff = @Backoff(delay = 2000,multiplier = 1.5))
    public String testRetry() throws Exception {
 
        System.out.println("开始执行代码:"+ LocalTime.now());
        int code = 0;
        // 模拟一直失败
        if(code == 0){
           // 这里可以使自定义异常,@Retryable中value需与其一致
            throw new Exception("代码执行异常");
        }
        System.out.println("代码执行成功");
        return "success";
    }
}

Descripción: Metadatos de configuración de @Retryable:
valor: reintento para el tipo de excepción especificado lanzado, lo que se especifica aquí es Exception
maxAttempts: configure el número máximo de reintentos, aquí se configura como 3 veces (incluida la primera y la última)
demora: el intervalo de retraso del primer reintento, la configuración aquí es
multiplicador de 2 s: el intervalo de tiempo de cada reintento es varias veces el anterior, aquí es 1,5 veces

4) Código de prueba del controlador

@RestController
@RequestMapping("/test")
public class TestController {
    @Autowired
    private RetryService retryService;
 
    @GetMapping("/retry")
    public String testRetry() throws Exception {
        return retryService.testRetry();
    }
}

5) Enviar solicitud

Después de enviar la solicitud, descubrimos que la situación de impresión en segundo plano se reintentó tres veces y solo se lanzó una excepción cuando falló el último reintento. Los detalles son los siguientes (puede prestar atención al intervalo de tiempo):

SpringBoot integra el componente spring-retry para implementar el mecanismo de reintento

6) Suplemento: @Recover

En circunstancias normales, si aún fallamos y lanzamos una excepción después de reintentar el número máximo establecido de veces, la manejaremos de manera uniforme a través de la clase de manejo de excepciones global, pero en realidad podemos manejarla nosotros mismos, lo que se puede lograr mediante anotaciones, de la siguiente manera @Recover:

@Service
public class RetryServiceImpl implements RetryService {
 
    @Retryable(value = Exception.class, maxAttempts = 3, backoff = @Backoff(delay = 2000,multiplier = 1.5))
    public String testRetry() throws Exception {
 
        System.out.println("开始执行代码:"+ LocalTime.now());
        int code = 0;
        if(code == 0){
            // 这里可以使自定义异常,@Retryable中value需与其一致
            throw new Exception("代码执行异常");
        }
        System.out.println("代码执行成功");
        return "success";
    }
 
    /**
     * 最终重试失败处理
     * @param e
     * @return
     */
    @Recover
    public String recover(Exception e){
 
        System.out.println("代码执行重试后依旧失败");
        return "fail";
    }
}

Nota:
1) El tipo de excepción del parámetro en el método @Recover debe ser consistente con el método de reintento.
2) El tipo de valor de retorno del método debe ser consistente con el método de reintento.
Pruebe nuevamente de la siguiente manera (no se generarán más excepciones). ):

SpringBoot integra el componente spring-retry para implementar el mecanismo de reintento

Este artículo se publicó por primera vez en el blog personal de Java Teacher Pan : SpringBoot integra el componente spring-retry para implementar el mecanismo de reintento

Supongo que te gusta

Origin blog.csdn.net/mixika99/article/details/119700434
Recomendado
Clasificación