Do monólito ao microsserviço: Estratégias de extração de domínios com DDD e Go

Seu monólito funciona. Por enquanto. Mas os bugs surgem a cada nova funcionalidade. O time evita mexer em certas partes. O deploy demora horas. Você sabe que precisa migrar para microsserviços – mas o maior medo é criar uma “big ball of mud” distribuída, só que agora na rede.

O erro mais comum é começar a quebrar o monólito por critérios técnicos (separar API de banco, separar frontend do backend). Isso quase sempre falha. O segredo está em extrair por domínios de negócio – e a melhor ferramenta para isso é o Domain-Driven Design (DDD).

Neste post, vamos mostrar como a Jacobus Software aplica DDD para identificar bounded contexts, extrair domínios coesos e transformá-los em microsserviços em Go – sem criar um pesadelo distribuído.

Por que quebrar por tecnologia não funciona

Muitas empresas tentam: “vamos tirar o módulo de usuários do monólito e virar um microsserviço”. Mas o módulo de usuários conversa com o módulo de pedidos, que conversa com o de pagamentos. No fim, você só movimentou o acoplamento – antes era dentro do mesmo processo, agora virou chamada de rede.

A solução é extrair domínios coesos, que tenham sentido de negócio e poucas dependências com o resto.

Domain-Driven Design em 2 minutos (para engenheiros)

DDD não é complicado. Os conceitos essenciais para extração são:

ConceitoO que significaExemplo (e-commerce)
DomínioO problema de negócio como um todoE-commerce
SubdomínioUma parte do negócioPagamentos, Estoque, Entrega, Notificações
Bounded ContextO limite dentro do qual um termo tem significado único“Cliente” no contexto de CRM tem endereço; no contexto de Pagamentos tem cartão de crédito
AggregateUm grupo de objetos que deve ser consistentePedido + Itens do pedido (não pode haver item sem pedido)

Regra de ouro para extração: Cada bounded context pode se tornar um microsserviço. Se dois bounded contexts precisam conversar, eles se comunicam via APIs bem definidas ou eventos.

Estratégia de extração em 5 passos com Go

Passo 1: Mapeie os bounded contexts do monólito

Analise o código e as conversas com o negócio. Identifique fronteiras naturais. Exemplo de um monólito de e-commerce:

  • Contexto de Catálogo (produtos, categorias, preços)
  • Contexto de Estoque (quantidades, reservas, entradas)
  • Contexto de Pedidos (carrinho, checkout, status)
  • Contexto de Pagamentos (transações, cartões, boletos)
  • Contexto de Entrega (frete, rastreio)
  • Contexto de Notificações (e-mail, SMS, push)

Passo 2: Priorize o primeiro contexto a extrair

Use três critérios:

  1. Baixo acoplamento com o resto (poucas chamadas de saída)
  2. Alto valor de negócio (time ganha autonomia)
  3. Baixo risco (falhas não derrubam o core)

O contexto de Notificações geralmente é o melhor candidato – é isolado por natureza.

Passo 3: Extraia como um microsserviço em Go

Comece criando o novo serviço em Go com:

  • Uma API limpa (gRPC ou REST)
  • Seu próprio banco de dados (opcional, pode compartilhar temporariamente)
  • Eventos publicados para comunicação eventual
// Exemplo: serviço de notificações em Go
type NotificationService interface {
    SendEmail(to, subject, body string) error
    SendSMS(to, message string) error
}

Passo 4: Estrangule a funcionalidade no monólito

Em vez de cortar tudo de uma vez, use feature flags ou um proxy. O monólito ainda pode chamar o novo serviço ou ainda executar localmente – você decide por rota.

Passo 5: Repita

Cada contexto extraído reduz a complexidade do monólito. Em meses, o monólito vira um orquestrador fino, e os domínios reais estão em serviços independentes.

Como Go ajuda (e muito) nesse processo

Desafio na extraçãoPor que Go resolve
Comunicação entre serviçosgRPC é nativo e performático
Eventos e assincronicidadeCanais e clientes de broker maduros
Bibliotecas compartilhadasMódulos Go permitem versionamento limpo
Testes de integraçãoTestcontainers para Go é maduro
Performance sem surpresasGarbage collector previsível, baixa latência

Além disso, a tipagem forte de Go ajuda a manter os contratos entre bounded contexts sem ambiguidade.

Exemplo real: extração de notificações em Go

Na Jacobus, extraímos o contexto de notificações de um monólito PHP de uma fintech. O processo:

  1. Mapeamento: Identificamos que notificações tinham apenas entradas (pedido criado, pagamento aprovado) e saídas (e-mail, SMS) – ideal para isolamento.
  2. Nova service em Go: Desenvolvemos uma API HTTP simples que aceita eventos e envia notificações.
  3. Adapter no monólito: O monólito passou a publicar mensagens em um tópico Kafka em vez de enviar e-mail diretamente.
  4. Go consome: O serviço Go consome o Kafka e envia e-mails via AWS SES.
  5. Resultado: Monólito perdeu 15% de complexidade. Notificações agora escalam independentemente. Picos de black friday: só escalamos o serviço Go, sem tocar no monólito.

Cuidado: anti-padrões comuns ao extrair

Shared database: Dois microsserviços acessando a mesma tabela. Isso recria o acoplamento.
Chatty API: Extrai um contexto mas cada operação exige 10 chamadas entre serviços.
Distributed monolith: Só separou o código, mas mantém deploy acoplado ou transações distribuídas demais.

Solução: Use bancos separados, replique dados via eventos, aceite consistência eventual onde fizer sentido.

Quando NÃO extrair?

Se o monólito é pequeno (menos de 10 devs), ou o time não tem maturidade operacional (Kubernetes, CI/CD, observabilidade), extrair pode trazer mais dor que benefício. Comece melhorando o monólito – modularização interna, testes, CI/CD.

Mas se o monólito já trava o negócio, DDD + Go é o caminho mais seguro.

Conclusão: extraia por domínio, não por tecnologia

Migrar de monólito para microsserviços é uma mudança de paradigma. Se feita por critérios técnicos, você só troca seis por meia-dúzia. Se feita por domínios de negócio com DDD, cada serviço passa a ter uma razão clara para existir, evoluindo no ritmo que o negócio precisa.

Go, com sua simplicidade, performance e ótimo suporte a comunicação entre serviços, é a ferramenta ideal para implementar essa visão. Na Jacobus Software, aplicamos esse método em dezenas de projetos – do legado que travava ao sistema que escala.

Seu monólito não é uma sentença. É um ponto de partida.


🧩 Quer extrair domínios do seu monólito com segurança?

Nossos arquitetos mapeiam seus bounded contexts, priorizam a extração por valor e implementam os microsserviços em Go – sem parar a operação.

👉 Fale com a Jacobus Software

Rolar para cima