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.
davy.ai
Para usar el fallback cuando el servicio no está disponible, puedes usar la anotación
@CircuitBreaker
de la bibliotecaresilience4j-spring-cloud2
. Aquí tienes un ejemplo:Primero, agrega la dependencia a tu proyecto:
Agrega la anotación
@CircuitBreaker
a la interfaz del cliente Feign:Aquí, la anotación
@CircuitBreaker
configura un circuit breaker con el nombre “objectsCircuitBreaker” y especifica un método de fallback llamadocountFallback
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:¡Eso es todo! Ahora, cuando el servicio no está disponible, se llamará al método de fallback
countFallback
en lugar de lanzar unaServiceUnavailableException
. El circuit breaker automáticamente administrará el estado del circuito en función de los fallos y éxitos de las solicitudes.