Resilience4j para Java: guía completa con ejemplos

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

¿Qué es Resilience4j y para qué sirve?

\n\n

Resilience4j es una biblioteca ligera para Java, diseñada para mejorar la tolerancia a fallos (resilience) de microservicios y sistemas distribuidos. Proporciona un conjunto de componentes listos para usar que ayudan a proteger su aplicación contra fallos en cascada, sobrecargas y respuestas lentas de servicios externos (bases de datos, API, colas de mensajes, etc.).

\n\n

La tarea principal de la biblioteca es implementar patrones de tolerancia a fallos, como Circuit Breaker (desconexión automática de un servicio problemático), Rate Limiter (limitación de la frecuencia de solicitudes), Retry (reintentos), Bulkhead (aislamiento de recursos), Time Limiter (limitación del tiempo de ejecución) y Cache (almacenamiento en caché de resultados).

\n\n

La biblioteca se integra perfectamente en el ecosistema Spring Boot, pero también se puede utilizar en cualquier otra aplicación Java. Resilience4j se considera el reemplazo moderno de la biblioteca obsoleta Hystrix de Netflix.

\n\n

Instalación (Maven/Gradle)

\n\n

Resilience4j es una biblioteca de Java, por lo que se instala a través de los sistemas de compilación Maven o Gradle. A diferencia de Python, aquí no se utiliza el comando pip install.

\n\n

Maven (pom.xml)

\n
<dependency>\n    <groupId>io.github.resilience4j</groupId>\n    <artifactId>resilience4j-all</artifactId>\n    <version>2.2.0</version>\n</dependency>\n\n<!-- Adicional para Spring Boot -->\n<dependency>\n    <groupId>io.github.resilience4j</groupId>\n    <artifactId>resilience4j-spring-boot3</artifactId>\n    <version>2.2.0</version>\n</dependency>
\n\n

Gradle (build.gradle)

\n
implementation 'io.github.resilience4j:resilience4j-all:2.2.0'\nimplementation 'io.github.resilience4j:resilience4j-spring-boot3:2.2.0'
\n\n

Inicio rápido con un ejemplo de código

\n\n

Creemos un ejemplo simple de uso de Circuit Breaker. Supongamos que tenemos un método que llama a una API externa. Queremos que si la API responde con un error 5 veces seguidas, las siguientes llamadas devuelvan inmediatamente un valor de respaldo (fallback), sin sobrecargar el servicio problemático.

\n\n
import io.github.resilience4j.circuitbreaker.CircuitBreaker;\nimport io.github.resilience4j.circuitbreaker.CircuitBreakerConfig;\nimport io.github.resilience4j.circuitbreaker.CircuitBreakerRegistry;\nimport java.time.Duration;\nimport java.util.function.Supplier;\n\npublic class QuickStartExample {\n\n    public static void main(String[] args) {\n        // 1. Crear la configuración de Circuit Breaker\n        CircuitBreakerConfig config = CircuitBreakerConfig.custom()\n                .failureRateThreshold(50) // Umbral de errores en porcentaje\n                .waitDurationInOpenState(Duration.ofMillis(1000)) // Tiempo en estado abierto\n                .slidingWindowSize(5) // Tamaño de la ventana deslizante para contar errores\n                .build();\n\n        // 2. Crear el registro y el Circuit Breaker\n        CircuitBreakerRegistry registry = CircuitBreakerRegistry.of(config);\n        CircuitBreaker circuitBreaker = registry.circuitBreaker("myService");\n\n        // 3. Envolver la llamada peligrosa\n        Supplier<String> decoratedSupplier = CircuitBreaker\n                .decorateSupplier(circuitBreaker, QuickStartExample::riskyOperation);\n\n        // 4. Ejecutar varias veces\n        for (int i = 0; i < 10; i++) {\n            try {\n                String result = decoratedSupplier.get();\n                System.out.println("Éxito: " + result);\n            } catch (Exception e) {\n                System.out.println("Error: " + e.getMessage());\n            }\n        }\n    }\n\n    // Simulación de un servicio externo poco confiable\n    public static String riskyOperation() {\n        if (Math.random() > 0.3) {\n            throw new RuntimeE                    

Recommendations