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:

  1. 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)

  1. Salve o arquivo como: Atividade_18_1_SeuNome
  2. 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:

  1. 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)

  1. Salve o arquivo como: Atividade_18_2_SeuNome
  2. 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:

  1. 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)

  1. Salve o arquivo como: Atividade_18_3_SeuNome
  2. 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:

  1. 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)

  1. Salve o arquivo como: Atividade_18_4_SeuNome
  2. 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())
        );
    }
}