Marcio Cunha

Desacoplamento de Domínios em Microsserviços com Strangler Fig e Proxy Reverso

Aprenda como migrar sistemas legados monolíticos para microsserviços de forma segura utilizando o padrão Strangler Fig e roteamento dinâmico em proxy reverso adaptativo.

Marcio Cunha•4 min
Também disponível em:EnglishEspañol
Resumo
  • O padrão Strangler Fig substitui gradualmente pedaços de um sistema monolítico antigo por novos serviços independentes.
  • O proxy reverso atua como um porteiro inteligente que redireciona tráfego de rotas específicas para os novos microsserviços de forma transparente.
  • Estratégias de roteamento baseadas em cabeçalhos HTTP viabilizam testes de carga em produção sem afetar usuários comuns.
  • A replicação assíncrona de dados mitiga problemas de inconsistência transacional temporária entre o monólito e os novos serviços.
  • O monitoramento contínuo de latência e taxas de erro garante reversibilidade imediata em caso de falhas durante a migração.

O Desafio dos Sistemas Legados e a Necessidade de Mudança

Muitas empresas crescem utilizando arquiteturas monolíticas, onde todo o código de um sistema vive em um único grande repositório e é executado como uma única aplicação. Na prática, isso significa que um erro em uma funcionalidade secundária pode derrubar o sistema inteiro, tornando atualizações lentas e arriscadas. O desafio surge quando esse monólito fica grande demais para ser mantido, exigindo uma transição para microsserviços, que são pequenos serviços independentes focados em tarefas específicas.

Substituir um sistema antigo de uma só vez é um erro clássico de engenharia que costuma falhar de forma catastrófica. É o equivalente a trocar o motor de um avião enquanto ele está voando em velocidade de cruzeiro, sem poder pousar. Para evitar essa catástrofe, a engenharia de software moderna adotou abordagens incrementais que permitem a evolução contínua da arquitetura sem interrupção de negócios.

O Padrão Strangler Fig na Prática

O padrão Strangler Fig, inspirado em uma planta parasita que envolve árvores na floresta até substituí-las, propõe a substituição gradual de um sistema legado. Em vez de reescrever tudo do zero, a equipe cria novos microsserviços ao lado do monólito antigo e migra uma funcionalidade por vez. Na prática, isso significa que o sistema antigo continua rodando e atendendo à maior parte dos clientes enquanto os novos pedaços assumem responsabilidades específicas de forma isolada.

Esse processo reduz drasticamente o risco do projeto, pois o impacto de um erro fica restrito à funcionalidade que acabou de ser migrada. Se algo der errado no novo serviço, o escopo do problema é pequeno e fácil de isolar. A cada nova funcionalidade migrada, o sistema legado encolhe organicamente até que o código antigo possa ser completamente desligado e descartado sem dor.

O Papel do Proxy Reverso Adaptativo

Para que o mundo externo não perceba que o sistema está sendo reconstruído por dentro, utiliza-se um componente chamado proxy reverso, que funciona como um porteiro inteligente na entrada da infraestrutura. Ele intercepta todas as requisições que chegam dos usuários e decide para onde enviá-las com base em regras predefinidas. Um proxy reverso adaptativo vai além do roteamento estático, ajustando o destino do tráfego dinamicamente com base em métricas de saúde, carga e versões de software.

Quando um cliente acessa o sistema para consultar seu perfil, por exemplo, o proxy reverso verifica se o módulo de perfis já foi migrado para o novo microsserviço. Se a resposta for sim, o tráfego é direcionado para a nova API moderna. Caso contrário, a requisição continua sendo encaminhada para o monólito legado, garantindo uma transição totalmente imperceptível para quem está do outro lado da tela.

Implementação de Roteamento Dinâmico

Na camada de infraestrutura, ferramentas como Nginx ou Caddy podem ser configuradas para realizar esse chaveamento de tráfego utilizando regras baseadas em caminhos de URL ou cabeçalhos HTTP. A seguir, um exemplo prático de configuração em Nginx utilizando variáveis dinâmicas para direcionar o tráfego com base na presença de um cookie de testes:

http {
upstream monolith {
server legacy-app.internal:8080;
}

upstream new_service {
server modern-service.internal:3000;
}

server {
listen 80;
server_name api.empresa.com;

location /api/v1/users {
# Se o usuário tiver um cookie de beta tester, vai para o microsserviço
if ($cookie_beta_tester = "true") {
proxy_pass http://new_service;
break;
}

# Caso contrário, o padrão vai para o monólito legado
proxy_pass http://monolith;
}
}
}

Esse trecho de código demonstra como isolar uma rota específica para testes controlados em produção. Na prática, isso permite que equipes de engenharia validem o comportamento do novo microsserviço com uma porcentagem real de usuários reais antes de virar a chave definitivamente para toda a base de clientes.

Estratégias de Consistência de Dados e Migração

O maior obstáculo em migrações para microsserviços não é o código da aplicação, mas sim a base de dados compartilhada. No monólito, todas as tabelas conversam entre si livremente, enquanto nos microsserviços cada serviço possui seu próprio banco de dados isolado. Para resolver isso durante a transição, utiliza-se replicação de dados em tempo real ou padrões como o Outbox Pattern para sincronizar informações entre o banco legado e os novos bancos.

Essa sincronização garante que, enquanto o monólito e o microsserviço coexistem, ambos tenham acesso às informações necessárias para operar sem corromper o estado do negócio. Quando a migração daquela funcionalidade é considerada estável e madura, o acesso direto ao banco legado é revogado, completando mais uma etapa do ciclo de estrangulamento do sistema antigo.

Considerações Finais

Desacoplar microsserviços legados utilizando o padrão Strangler Fig aliado a um proxy reverso adaptativo transforma um projeto de alto risco em uma jornada controlada e iterativa. A engenharia moderna exige resiliência e capacidade de entrega contínua sem comprometer a operação atual. Ao focar em migrações granulares, roteamento inteligente e sincronização segura de dados, as organizações conseguem modernizar sua infraestrutura técnica de forma sustentável, garantindo estabilidade para o negócio e agilidade para os desenvolvedores.