Spring Boot y Circuit breakers


En el contexto de Spring Boot, los “circuit breakers” (interruptores de circuito) son un patrón de diseño que ayuda a prevenir el colapso de un sistema cuando hay fallas en servicios externos o dependencias. La biblioteca Resilience4j es una de las más populares para implementar este patrón en aplicaciones Java Spring Boot.

Implementación de Circuit Breaker usando Resilience4j en Spring Boot

A continuación, te mostraré cómo configurar y utilizar Resilience4j en una aplicación Spring Boot para implementar circuit breakers.

Paso 1: Añadir Dependencias

Añade las dependencias necesarias para Resilience4j en tu archivo pom.xml.

<dependencies>
    <!-- Dependencia principal de Spring Boot -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter</artifactId>
    </dependency>

    <!-- Dependencia de Resilience4j -->
    <dependency>
        <groupId>io.github.resilience4j</groupId>
        <artifactId>resilience4j-spring-boot2</artifactId>
        <version>1.7.1</version> <!-- Verifica la última versión disponible -->
    </dependency>

    <!-- Dependencias adicionales -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-actuator</artifactId>
    </dependency>
</dependencies>

Paso 2: Configurar Resilience4j en application.yml

Configura las propiedades del circuit breaker en tu archivo application.yml.

resilience4j:
  circuitbreaker:
    configs:
      default:
        registerHealthIndicator: true
        slidingWindowSize: 10
        permittedNumberOfCallsInHalfOpenState: 3
        minimumNumberOfCalls: 10
        waitDurationInOpenState: 10s
        failureRateThreshold: 50
        eventConsumerBufferSize: 10
    instances:
      myService:
        baseConfig: default
        slidingWindowSize: 10
        permittedNumberOfCallsInHalfOpenState: 3
        minimumNumberOfCalls: 5
        waitDurationInOpenState: 10s
        failureRateThreshold: 50

Paso 3: Anotar el Servicio con Circuit Breaker

Anota tu servicio con @CircuitBreaker para proteger métodos específicos.

import io.github.resilience4j.circuitbreaker.annotation.CircuitBreaker;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;

@Service
public class MyService {

    private final RestTemplate restTemplate;

    public MyService(RestTemplate restTemplate) {
        this.restTemplate = restTemplate;
    }

    @CircuitBreaker(name = "myService", fallbackMethod = "fallback")
    public String callExternalService() {
        // Simulación de una llamada a un servicio externo
        return restTemplate.getForObject("http://external-service/api/resource", String.class);
    }

    public String fallback(Exception ex) {
        return "Fallback response: " + ex.getMessage();
    }
}

Paso 4: Configurar RestTemplate Bean

Configura un RestTemplate bean en tu aplicación Spring Boot.

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;

@Configuration
public class AppConfig {

    @Bean
    public RestTemplate restTemplate() {
        return new RestTemplate();
    }
}

Paso 5: Exponer Endpoints para Verificar el Circuit Breaker

Puedes exponer endpoints en tu controlador para verificar el funcionamiento del circuit breaker.

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/api")
public class MyController {

    private final MyService myService;

    public MyController(MyService myService) {
        this.myService = myService;
    }

    @GetMapping("/test")
    public String testCircuitBreaker() {
        return myService.callExternalService();
    }
}


Explicación

1. Dependencias: Se añaden las dependencias de Spring Boot y Resilience4j necesarias en el archivo pom.xml.

2. Configuración de application.yml: Se configura el comportamiento del circuit breaker en el archivo de configuración de Spring Boot.

3. Anotación @CircuitBreaker: Se anota el método del servicio que se desea proteger con el circuit breaker.

4. Método de Fallback: Se define un método de fallback que se invocará cuando el circuit breaker esté abierto.

5. RestTemplate: Se configura un RestTemplate bean para simular una llamada a un servicio externo.

6. Controlador: Se expone un endpoint en el controlador para probar el funcionamiento del circuit breaker.

Con estos pasos, tendrás implementado un circuit breaker en tu aplicación Spring Boot usando Resilience4j, lo que te permitirá manejar mejor las fallas en servicios externos y mejorar la resiliencia de tu aplicación.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *