Was ist Resilience4j und warum wird es benötigt?
Resilience4j ist eine leichtgewichtige Bibliothek für Java, die darauf abzielt, die Ausfallsicherheit (Resilienz) von Microservices und verteilten Systemen zu erhöhen. Sie bietet eine Reihe vorgefertigter Komponenten, die Ihre Anwendung vor kaskadierenden Fehlern, Überlastungen und langsamen Antworten externer Dienste (Datenbanken, APIs, Message Queues usw.) schützen.
Die Hauptaufgabe der Bibliothek ist die Implementierung von Resilienz-Mustern wie Circuit Breaker (automatische Abschaltung eines problematischen Dienstes), Rate Limiter (Begrenzung der Anfragefrequenz), Retry (Wiederholungsversuche), Bulkhead (Ressourcenisolierung), Time Limiter (Begrenzung der Ausführungszeit) und Cache (Zwischenspeicherung von Ergebnissen).
Die Bibliothek fügt sich nahtlos in das Spring-Boot-Ökosystem ein, kann aber auch in jeder anderen Java-Anwendung verwendet werden. Resilience4j gilt als moderner Ersatz für die veraltete Hystrix-Bibliothek von Netflix.
Installation (Maven/Gradle)
Resilience4j ist eine Java-Bibliothek und wird daher über die Build-Systeme Maven oder Gradle installiert. Im Gegensatz zu Python kommt hier der Befehl pip install nicht zum Einsatz.
Maven (pom.xml)
<dependency>
<groupId>io.github.resilience4j</groupId>
<artifactId>resilience4j-all</artifactId>
<version>2.2.0</version>
</dependency>
<!-- Zusätzlich für Spring Boot -->
<dependency>
<groupId>io.github.resilience4j</groupId>
<artifactId>resilience4j-spring-boot3</artifactId>
<version>2.2.0</version>
</dependency>
Gradle (build.gradle)
implementation 'io.github.resilience4j:resilience4j-all:2.2.0'
implementation 'io.github.resilience4j:resilience4j-spring-boot3:2.2.0'
Schnellstart mit Codebeispiel
Erstellen wir ein einfaches Beispiel zur Verwendung des Circuit Breakers. Angenommen, wir haben eine Methode, die eine externe API aufruft. Wir möchten, dass nach 5 aufeinanderfolgenden Fehlern der API die nächsten Aufrufe sofort einen Fallback-Wert zurückgeben, ohne den problematischen Dienst zu belasten.
import io.github.resilience4j.circuitbreaker.CircuitBreaker;
import io.github.resilience4j.circuitbreaker.CircuitBreakerConfig;
import io.github.resilience4j.circuitbreaker.CircuitBreakerRegistry;
import java.time.Duration;
import java.util.function.Supplier;
public class QuickStartExample {
public static void main(String[] args) {
// 1. Circuit-Breaker-Konfiguration erstellen
CircuitBreakerConfig config = CircuitBreakerConfig.custom()
.failureRateThreshold(50) // Fehlerschwelle in Prozent
.waitDurationInOpenState(Duration.ofMillis(1000)) // Dauer im offenen Zustand
.slidingWindowSize(5) // Größe des gleitenden Fensters für die Fehlerzählung
.build();
// 2. Registry und Circuit Breaker erstellen
CircuitBreakerRegistry registry = CircuitBreakerRegistry.of(config);
CircuitBreaker circuitBreaker = registry.circuitBreaker("myService");
// 3. Gefährlichen Aufruf umschließen
Supplier<String> decoratedSupplier = CircuitBreaker
.decorateSupplier(circuitBreaker, QuickStartExample::riskyOperation);
// 4. Mehrmals ausführen
for (int i = 0; i < 10; i++) {
try {
String result = decoratedSupplier.get();
System.out.println("Erfolg: " + result);
} catch (Exception e) {
System.out.println("Fehler: " + e.getMessage());
}
}
}
// Simulation eines unzuverlässigen externen Dienstes
public static String riskyOperation() {
if (Math.random() > 0.3) {
throw new RuntimeException("Dienst vorübergehend nicht verfügbar!");
}
return "Daten erfolgreich geladen";
}
} Auch in der Bibliothek
Internationalisierung (i18n) in Swift: NSLocalizedString und String Catalog
Aufgabenwarteschlangen in Swift: GCD, OperationQueue und Combine für iOS/macOS
E-Mail-Versand mit TypeScript: Vollständiger Leitfaden mit nodemailer und SMTP