Guía mínima de Resilience4j y Circuit Breaker en Spring Boot

Resilience4j es una librería diseñada garantizar la disponibilidad de las aplicaciones principalmente en entornos de alta carga. Con esta guía mínima de Resilience4j y Circuit Breaker en Spring Boot tendrás un ejemplo de como crear un servicio que tenga tolerancia a fallos y que pueda seguir funcionando recuperándose de errores.

¿Para qué sirve Resilience4j y Circuit Breaker?

En la arquitectura de software actual y en especial en microservicios dependemos de más de un programa/servicio para que todo funcione correctamente.

Imaginemos que tenemos una tienda online y tenemos un servicio que dependiendo el ID del usuario que entre a nuestro sitio le recomendamos productos, según sus gustos. Ahora imaginemos que es black friday y nuestro servicio se congela por el exceso de carga. El usuario final en lugar de recibir un listado de sugerencias de compras lo que recibiría sería un nada agradable mensaje de error.

Tolerancia a Fallos
Una falla podría generar errores en cadena

Para resolver esto podemos implementar Circuit Brekaker con Resiliace4j. Lo que hará nuestra implementación será que cuando detecte una falla constante en el servicio de recomendación de productos dejara de intentar conectar con él e intentara conectar con un servicio diferente que podemos usar como plan B en caso de error.

Simulando el fallo de servicios

Para este ejemplo vamos a necesitar crear dos servicios, el que simularemos la falla y el de respaldo o plan B utilizando Mockoon. Veamos como se crea en tan solo 1 Minuto.

Estados de Circuit Breaker

Circuit Breaker en Spring Boot funciona manejando 3 Estados. Circuit Breaker registrará si el servicio respondió correctamente o con algún error y con esta información elegirá él alguno de estos estados y en él se basara, pasa saber si debe llamar al servicio de respaldo o seguir llamando al método original.

  • Cerrado
    • Estado inicial, cuando está todo normal, se tiene un umbral de porcentaje de fallas.
  • Abierto
    • Cuando se sobrepasa ese umbral. El microservicio está en estado abierto, va a dejar de recibir llamados diciendo que no está disponible y dando la opción de llamar a otro microservicio
  • Semiabierto
    • En este estado intentará hacer llamadas al servicio antes de volver a cerrado o seguir con estado abierto

Parámetros del Circuit Breaker en Spring Boot

Circuit Breaker usa los siguientes parámetros y porcentajes para poder cambiar de un estado a otro. Cada parámetro se puede modificar a nuestras necesidades

  • slidingWindowSize(100): Muestro estadístico, para el porcentaje falla para configurar el umbral
  • failureRateThreshold(50): Porcentaje de umbral erroneo
  • waitDurationOpenState(6000 ms): Tiempo que dura el estado abierto antes de pasar a semiabierto
  • permittedNumberOfCallsHalfOpenState(): Número de peticiones de prueba en semiabierto
  • slowCallDurationThreshold(60000 ms): El tiempo que es considerado como lento en una llamada
  • slowCallRateThreshold(50): Porcentaje de umbral para llamadas lentas

Configuración del POM

Creación del cliente Feign

Ahora conectamos nuestra aplicación con el servicio Mock para simular las fallas usando un cliente Feign

Configuración de Circuit Breaker en Spring Boot por archivo yml

Las propiedades de Circuit Breaker las podemos configurar en el archivo application.yml de la siguiente forma:

En el nodo config colocamos el nombre de nuestra configuración, en este caso llamado “default” (línea 3) y dentro de él las propiedades y los valores que vimos anteriormente.

Dentro del nodo instance asignamos su nombre, en este caso “books” y lo asociamos a la configuración de circuit breaker.

El nodo “timelimiter” (linea 14) funciona de la misma manera. Seleccionamos un nombre y lo asociamos a una instancia.

Agregar tolerancia a fallos Circuit Breaker en Spring Boot

Ahora es momento de agregar la tolerancia a fallos en nuestro controller con la anotación CircuitBreaker y así tener listo nuestro Plan B en caso de que el servicio A falle.

Del código anterior podemos notar lo siguiente:

  • En la anotación @CircuitBreaker la propiedad name debe coincidir en con el nombre dado en el archivo application yml.
  • En la anotación @CircuitBreaker la propiedad fallbackMethod debe apuntar a un método existente para tu Plan B.
  • El método Plan B debe tener la misma firma que el Plan A más un parámetro Throwable.
  • El parámetro name en la anotación @TimeLimiter debe coincidir con el nombre dado en el archivo application.yml
  • Para que el manejo de errores se dispare con timeout es necesario que TimeLimiter esté activado
  • TimeLimiter necesita para funcionar que se implemente funto con ComparableFuture.

Ahora ya tienes todo listo para poder probar la tolerancia a fallos en tu aplicación.

Recapitulación.

En esta Guía mínima de Resilience4j y Circuit Breaker en Spring Boot aprendiste que es Resilience4j y para qué sirve. Aprendiste que son los estados de CircuitBreaker ya darle valores en el archivo application.yml. Además de configurar el plan B en caso en caso de que tu plan principal falle.

Como extra aprendiste a simular una API de terceros con el software gratuito Mockoon.

0 Shares:
You May Also Like