O que é Resilience4j e para que serve?
\n\nResilience4j é uma biblioteca leve para Java, projetada para aumentar a resiliência (tolerância a falhas) de microsserviços e sistemas distribuídos. Ela fornece um conjunto de componentes prontos que ajudam a proteger sua aplicação contra falhas em cascata, sobrecargas e respostas lentas de serviços externos (bancos de dados, APIs, filas de mensagens, etc.).
\n\nA principal função da biblioteca é implementar padrões de resiliência, como Circuit Breaker (desligamento automático de um serviço problemático), Rate Limiter (limitação da frequência de requisições), Retry (tentativas repetidas), Bulkhead (isolamento de recursos), Time Limiter (limitação do tempo de execução) e Cache (armazenamento em cache de resultados).
\n\nA biblioteca se integra perfeitamente ao ecossistema Spring Boot, mas também pode ser usada em qualquer outra aplicação Java. Resilience4j é considerada a substituta moderna da biblioteca legada Hystrix da Netflix.
\n\nInstalação (Maven/Gradle)
\n\nResilience4j é uma biblioteca Java, portanto é instalada através dos sistemas de build Maven ou Gradle. Diferentemente do Python, o comando pip install não é utilizado aqui.
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<!-- Para Spring Boot adicionalmente -->\n<dependency>\n <groupId>io.github.resilience4j</groupId>\n <artifactId>resilience4j-spring-boot3</artifactId>\n <version>2.2.0</version>\n</dependency>\n\nGradle (build.gradle)
\nimplementation 'io.github.resilience4j:resilience4j-all:2.2.0'\nimplementation 'io.github.resilience4j:resilience4j-spring-boot3:2.2.0'\n\nInício rápido com exemplo de código
\n\nVamos criar um exemplo simples de uso do Circuit Breaker. Suponha que temos um método que chama uma API externa. Queremos que, se a API responder com erro 5 vezes consecutivas, as próximas chamadas retornem imediatamente um valor de fallback, sem sobrecarregar o serviço problemático.
\n\nimport 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. Criando a configuração do Circuit Breaker\n CircuitBreakerConfig config = CircuitBreakerConfig.custom()\n .failureRateThreshold(50) // Limiar de erros em porcentagem\n .waitDurationInOpenState(Duration.ofMillis(1000)) // Tempo no estado aberto\n .slidingWindowSize(5) // Tamanho da janela deslizante para contagem de erros\n .build();\n\n // 2. Criando o registro e o Circuit Breaker\n CircuitBreakerRegistry registry = CircuitBreakerRegistry.of(config);\n CircuitBreaker circuitBreaker = registry.circuitBreaker("myService");\n\n // 3. Encapsulando a chamada perigosa\n Supplier<String> decoratedSupplier = CircuitBreaker\n .decorateSupplier(circuitBreaker, QuickStartExample::riskyOperation);\n\n // 4. Executando várias vezes\n for (int i = 0; i < 10; i++) {\n try {\n String result = decoratedSupplier.get();\n System.out.println("Sucesso: " + result);\n } catch (Exception e) {\n System.out.println("Erro: " + e.getMessage());\n }\n }\n }\n\n // Simulação de um serviço externo não confiável\n public static String riskyOperation() {\n if (Math.random() > 0.3) {\n throw new RuntimeE