Sabe aquele momento em que o seu microservice tenta chamar outro serviço e… boom, timeout, erro 500, logs intermináveis e alerta nos serviços de mensagens? um caos total certo?
Pois é, ninguém gosta de passar por isso 😅
No BoraPraticar de hoje, vamos ver como aplicar Design Patterns de Resiliência como Retry, Circuit Breaker e Fallback usando Spring Boot e Resilience4j.
Esses patterns não são novidades, eles já aparecem em livros de arquitetura há décadas, mas o legal é ver como podemos aplicar de verdade no nosso código, com ferramentas modernas do ecossistema Spring. I 💪 ove Spring rsrs…
🚀 O cenário
Imagina o seguinte: você tem um serviço de pedidos (pedido-service) que chama um serviço de pagamentos (pagamento-service) pra processar um pagamento.
O problema? O pagamento-service às vezes falha, pois ele pode estar lento, fora do ar, ou só está tendo um dia ruim.
Sem resiliência, o pedido-service quebra junto.
Mas com Resilience4j, a gente aplica alguns Design Patterns clássicos que ajudam o sistema a se recuperar, resistir e até responder de forma mais inteligente quando algo dá errado.
💡 Design Pattern 1: Retry — Tentando de novo (com bom senso)
Nem todo erro é definitivo. Às vezes é só um pico na rede, uma latência momentânea ou um serviço se aquecendo.
O Design Pattern Retry resolve isso: tenta de novo automaticamente, mas de forma controlada.
Bora ver isso no código 👇
@Service
public class PagamentoClient {
private final WebClient webClient;
public PagamentoClient(WebClient.Builder builder) {
this.webClient = builder.baseUrl("https://localhost:8081").build();
}
@Retry(name = "pagamentoRetry", fallbackMethod = "fallbackPagamento")
public String processarPagamento() {
return webClient.get()
.uri("/pagamento")
.retrieve()
.bodyToMono(String.class)
.block();
}
private String fallbackPagamento(Exception ex) {
return "Pagamento será processado mais tarde 🤷♂️";
}
}
Configuração no application.yml
resilience4j.retry:
instances:
pagamentoRetry:
max-attempts: 3
wait-duration: 2s
Aqui estamos dizendo:
- Tenta até 3 vezes antes de desistir
- Espera 2 segundos entre uma tentativa e outra
E se mesmo assim falhar… o Fallback Pattern entra em ação (falaremos dele já já 👀)
⚡ Design Pattern 2: Circuit Breaker — desligando pra não queimar o sistema
Se o serviço está falhando repetidamente, continuar tentando só piora a situação.
É aí que entra o Design Pattern Circuit Breaker: ele “abre o circuito” e impede novas chamadas por um tempo, como se dissesse “calma aí, deixa o serviço respirar”.
@CircuitBreaker(name = "pagamentoCircuitBreaker", fallbackMethod = "fallbackPagamento")
public String processarPagamento() {
return webClient.get()
.uri("/pagamento")
.retrieve()
.bodyToMono(String.class)
.block();
}
Configuração
resilience4j.circuitbreaker:
instances:
pagamentoCircuitBreaker:
sliding-window-size: 5
failure-rate-threshold: 50
wait-duration-in-open-state: 10s
Tradução:
- O circuito analisa as últimas 5 requisições
- Se 50% delas falharem, ele abre
- Fica 10 segundos aberto antes de tentar de novo
Assim, você evita sobrecarregar um serviço que já está sofrendo, e protege o resto do sistema 🔌
🛟 Design Pattern 3: Fallback — planos B salvam o dia
Quando tudo falha, é melhor devolver algo pro cliente do que deixá-lo olhando pro abismo do timeout.
O Design Pattern Fallback define uma ação alternativa pra quando o Retry e o Circuit Breaker não conseguem resolver.
private String fallbackPagamento(Exception ex) {
// Implementação alternativa
return "Pagamento será processado mais tarde 🤷♂️";
}
Você pode:
- Retornar uma resposta padrão
- Colocar o pedido numa fila pra reprocessar depois
- Registrar o erro num log mais amigável
O importante é: o sistema continua de pé 🙌
🧩 Combinando os Design Patterns
Nada impede de combinar os três patterns no mesmo método:
@Retry(name = "pagamentoRetry")
@CircuitBreaker(name = "pagamentoCircuitBreaker", fallbackMethod = "fallbackPagamento")
public String processarPagamento() {
// chamada ao serviço externo
}
O Resilience4j cuida de tudo pra você — e o código continua simples, limpo e fácil de testar.
🔍 Bonus: monitorando tudo com o Actuator
Quer ver o que está rolando dentro do Resilience4j?
É só habilitar o Actuator no application.yml:
management:
endpoints:
web:
exposure:
include: health, metrics, resilience4j*
Depois, acesse:
/actuator/metrics /actuator/resilience4j.circuitbreakers
e veja as estatísticas do seu circuito em tempo real ⚙️
🧩 Um parêntese rápido sobre os Design Patterns
Antes que alguém pergunte: “Mas esses Design Patterns de Resiliência estão no livro da Gang of Four?” 🤔
A resposta é não exatamente
Os clássicos do livro “Design Patterns: Elements of Reusable Object-Oriented Software” (da famosa GoF) focam em como estruturar e organizar código orientado a objetos — coisas como Strategy, Observer, Factory Method, Decorator, Singleton e por aí vai.
Já os Design Patterns de Resiliência, como Retry, Circuit Breaker e Fallback, vieram depois, como uma evolução natural dos princípios da GoF, aplicados agora ao contexto de sistemas distribuídos e microservices.
Esses padrões ficaram conhecidos através de livros como:
- 📗 “Release It! – Design and Deploy Production-Ready Software” (Michael T. Nygard)
- 📘 “Microservices Patterns” (Chris Richardson)
Então, se a GoF ensinou a gente a deixar o código mais flexível e reutilizável, esses livros mais recentes ensinam a deixá-lo mais resiliente e preparado pro caos do mundo real 🌩️
🎯 Conclusão
E aí, curtiu o BoraPraticar de hoje? 😎
A moral da história é simples: não dá pra confiar 100% na rede nem nos serviços externos, mas dá pra se proteger com boas práticas.
Os Design Patterns de Resiliência como Retry, Circuit Breaker e Fallback são soluções clássicas pra problemas conhecidos em sistemas distribuídos.
E com o Resilience4j, a gente traz esses patterns direto pro Spring Boot, de forma leve e moderna.
👉 No fim das contas, não estamos inventando nada: só estamos usando o que o mercado já consolidou como boas práticas e aplicando na vida real.
E o melhor: dá pra começar com duas anotações e um YAML 💥
⚡ BoraPraticar resiliência nos seus microservices e deixar seus logs respirarem um pouco?
Então cola lá no canal BoraPraticar, confere o vídeo completo 🎥, manda ver no código e depois conta aqui nos comentários se o seu sistema ficou mais zen 🧘♂️