🧩 Exercícios: Resiliência e Circuit Breaker com Resilience4j
Spec Backend Com Java E Springboot • Trilha Progressiva em 4 Níveis
🎯 Nível 1: Fundamentos
Problema 18.1 — Circuit Breaker com @CircuitBreaker e Método Fallback
Contexto: Circuit Breaker com @CircuitBreaker e Método Fallback no contexto de Resiliência e Circuit Breaker com Resilience4j.
Requisitos de Execução:
- Proteger chamada externa com
@CircuitBreaker(name = 'pagamentoService', fallbackMethod = 'fallbackPagamento').
Resultado Esperado
Falha na chamada externa -> Fallback acionado retornando resposta de contingência.
📤 Instruções de Entrega (Microsoft Teams)
- Salve o arquivo como:
Atividade_18_1_SeuNome - Envie na tarefa:
Atividade Cap 18 - Resiliência e Circuit Breaker com Resilience4j
🔑 Gabarito de Código & Solução Comentada
// PaymentResilienceService.java
package com.empresa.api.service;
import io.github.resilience4j.circuitbreaker.annotation.CircuitBreaker;
import org.springframework.stereotype.Service;
@Service
public class PaymentResilienceService {
@CircuitBreaker(name = "pagamentoService", fallbackMethod = "fallbackPagamento")
public String processarPagamento(Long pedidoId) {
if (pedidoId == 99) throw new RuntimeException("Gateway de pagamento fora do ar");
return "PAGAMENTO_APROVADO";
}
public String fallbackPagamento(Long pedidoId, Throwable t) {
return "PAGAMENTO_EM_PROCESSAMENTO_OFFLINE";
}
}
🔍 Nível 2: Prática
Problema 18.2 — Retry com Backoff Exponencial (@Retry)
Contexto: Retry com Backoff Exponencial (@Retry) no contexto de Resiliência e Circuit Breaker com Resilience4j.
Requisitos de Execução:
- Configurar
@Retry(name = 'consultaEstoque')com até 3 tentativas e intervalo progressivo de espera.
Resultado Esperado
Operação reexecutada 3 vezes antes de lançar exceção final.
📤 Instruções de Entrega (Microsoft Teams)
- Salve o arquivo como:
Atividade_18_2_SeuNome - Envie na tarefa:
Atividade Cap 18 - Resiliência e Circuit Breaker com Resilience4j
🔑 Gabarito de Código & Solução Comentada
// RetryService.java
package com.empresa.api.service;
import io.github.resilience4j.retry.annotation.Retry;
import org.springframework.stereotype.Service;
@Service
public class RetryService {
@Retry(name = "consultaEstoque")
public boolean checarEstoque(Long produtoId) {
System.out.println("Tentativa de consulta de estoque...");
return true;
}
}
⚡ Nível 3: Integração
Problema 18.3 — RateLimiter e Bulkhead com Resilience4j
Contexto: RateLimiter e Bulkhead com Resilience4j no contexto de Resiliência e Circuit Breaker com Resilience4j.
Requisitos de Execução:
- Isolar pool de threads com
@Bulkhead(name = 'relatoriosPesados')para evitar saturação do servidor.
Resultado Esperado
Bulkhead limitou execuções concorrentes a no máximo 5 chamadas.
📤 Instruções de Entrega (Microsoft Teams)
- Salve o arquivo como:
Atividade_18_3_SeuNome - Envie na tarefa:
Atividade Cap 18 - Resiliência e Circuit Breaker com Resilience4j
🔑 Gabarito de Código & Solução Comentada
// BulkheadService.java
package com.empresa.api.service;
import io.github.resilience4j.bulkhead.annotation.Bulkhead;
import org.springframework.stereotype.Service;
@Service
public class BulkheadService {
@Bulkhead(name = "relatoriosPesados")
public void gerarRelatorio() {
System.out.println("Processando relatório em pool isolado.");
}
}
🏆 Nível 4: Desafio Corporativo
Problema 18.4 — Monitoramento do Estado do Circuit Breaker via Actuator
Contexto: Monitoramento do Estado do Circuit Breaker via Actuator no contexto de Resiliência e Circuit Breaker com Resilience4j.
Requisitos de Execução:
- Inspecionar métricas do Circuit Breaker (CLOSED, OPEN, HALF_OPEN) expostas no endpoint
/actuator/circuitbreakers.
Resultado Esperado
Transição de estado para OPEN após taxa de falha atingir 50%.
📤 Instruções de Entrega (Microsoft Teams)
- Salve o arquivo como:
Atividade_18_4_SeuNome - Envie na tarefa:
Atividade Cap 18 - Resiliência e Circuit Breaker com Resilience4j
🔑 Gabarito de Código & Solução Comentada
// CircuitBreakerMonitor.java
package com.empresa.api.service;
import io.github.resilience4j.circuitbreaker.CircuitBreakerRegistry;
import org.springframework.stereotype.Component;
@Component
public class CircuitBreakerMonitor {
public void checarStatus(CircuitBreakerRegistry registry) {
registry.getAllCircuitBreakers().forEach(cb ->
System.out.println("Circuit Breaker " + cb.getName() + " Estado: " + cb.getState())
);
}
}