Como modernizar um monólito Java para microsserviços sem comprometer o sistema legado
Estratégia de modernização Java: strangler fig, seams, dados, contratos e riscos — sem big bang e sem romance de slides.
Por Emerson Amorim15 min de leitura
Modernizar um monólito Java é extrair capacidades com seams claros, preservar disponibilidade e migrar dados com disciplina. Big bang é teatro de risco.
Princípio: strangler fig
Intercepte chamadas na borda, desvie progressivamente para o novo serviço e mantenha o monólito como fallback até o tráfego e a confiança justificarem o corte.
Clients ─► Gateway ─┬─► Monolith (legado)
└─► New Service (fatia)Identificar seams
- Mapeie módulos por linguagem ubíqua e donos
- Ache fronteiras com baixo acoplamento de dados
- Prefira extrair jornadas de leitura antes de escritas complexas
- Meça acoplamento (imports, tabelas compartilhadas, jobs)
Dados: o ponto que derruba projetos
- Evite shared database como estado final
- Use dual write só com outbox/CDC e reconciação
- Defina ownership de cada entidade
- Aceite consistência eventual onde o negócio permitir
Contratos e compatibilidade
Versionamento de API, testes de contrato e feature flags reduzem o medo do corte. O monólito e o serviço novo precisam coexistir com observabilidade comparável.
public class PricingFacade {
private final FeatureFlags flags;
private final LegacyPricing legacy;
private final PricingClient modern;
public Price quote(QuoteRequest req) {
if (flags.enabled("pricing-modern", req.customerId())) {
return modern.quote(req);
}
return legacy.quote(req);
}
}Riscos e anti-padrões
- Extrair serviços sem dono de produto/domínio
- Distribuir o monólito em rede mantendo o mesmo modelo de dados
- Ignorar jobs batch e relatórios que acoplam tabelas
- Prometer redução de custo no curto prazo
Ordem sugerida
- Observabilidade e testes no monólito
- Seams e modularização interna
- Extração de leitura (BFF/serviço)
- Extração de escrita com outbox
- Desligar código morto com evidência de tráfego zero