es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Cómo manejar correctamente “FeignException$ServiceUnavailableException” con backup y sin la anotación @EnableCircuitbreaker obsoleta.

Cuando se utiliza OpenFeign, implemento fallbacks que devuelven resultados vacíos, por lo que las listas deberían aparecer simplemente como vacías. Por ejemplo,

@FeignClient(name = "objects", fallback = ObjectsClientFallback.class)
public interface ObjectsClient {
    @RequestMapping("/objects/count")
    Long count();
}

y

@Component
public class ObjectsClientFallback implements ObjectsClient {
    @Override
    public Long count() {
        return 0L;
    }
}

Sin embargo, si el servicio no está iniciado, la aplicación produce una ServiceUnavailableException al llamar a objectsClient.count() en lugar de usar el fallback.

¿Cuál es la forma correcta de utilizar el fallback ahora que @EnableCircuitBreaker ha sido deprecado recientemente? No quiero agregar bloques try-catch si es posible, especialmente en el contexto de lambdas o envolver esto en métodos de servicio.

La aplicación utiliza la anotación @EnableDiscoveryClient, de la siguiente manera:

@SpringBootApplication
@EnableJpaRepositories
@EnableFeignClients
@EnableDiscoveryClient
@ServletComponentScan
public class Application {
    //..
}

He visto esta pregunta y revisé la documentación mencionada, pero no ayudó. Las versiones de las bibliotecas son Spring-Boot 2.6.2 y Spring-Cloud 2021.0.0.

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Para usar el fallback cuando el servicio no está disponible, puedes usar la anotación @CircuitBreaker de la biblioteca resilience4j-spring-cloud2. Aquí tienes un ejemplo:

    Primero, agrega la dependencia a tu proyecto:

    <dependency>
        <groupid>io.github.resilience4j</groupid>
        <artifactid>resilience4j-spring-cloud2</artifactid>
        <version>1.7.0</version>
    </dependency>
    

    Agrega la anotación @CircuitBreaker a la interfaz del cliente Feign:

    @FeignClient(name = "objects", fallback = ObjectsClientFallback.class)
    @CircuitBreaker(name = "objectsCircuitBreaker", fallbackMethod = "countFallback")
    public interface ObjectsClient {
    
        @RequestMapping("/objects/count")
        Long count();
    
        default Long countFallback(Exception e) {
            return 0L;
        }
    }
    

    Aquí, la anotación @CircuitBreaker configura un circuit breaker con el nombre “objectsCircuitBreaker” y especifica un método de fallback llamado countFallback que se llamará cuando el circuito esté abierto.

    En tu implementación de fallback, simplemente puedes quitar la anotación @Component, ya que ya no es necesaria:

    public class ObjectsClientFallback implements ObjectsClient {
    
        @Override
        public Long count() {
            return 0L;
        }
    }
    

    ¡Eso es todo! Ahora, cuando el servicio no está disponible, se llamará al método de fallback countFallback en lugar de lanzar una ServiceUnavailableException. El circuit breaker automáticamente administrará el estado del circuito en función de los fallos y éxitos de las solicitudes.

Comments are closed.