Arquitetura de Microserviços: Do Zero ao Avançado
Vou te explicar de forma progressiva, começando do conceito básico até arquiteturas complexas.
1. O Conceito Fundamental
Imagine que você tem uma pizzaria. Na abordagem monolítica (tradicional), você teria um único funcionário fazendo tudo: atender telefone, fazer massa, colocar ingredientes, assar e entregar.
Na arquitetura de microserviços, você divide em equipes especializadas:
- Uma pessoa só atende pedidos
- Outra só prepara massas
- Outra só coloca ingredientes
- Outra só assa
- Outra só entrega
Cada equipe trabalha independentemente, se comunica quando necessário, e pode ser substituída ou melhorada sem afetar as outras.
2. Características Principais
Independência: Cada microserviço é uma aplicação completa que pode ser desenvolvida, testada, implantada e escalada separadamente.
Especialização: Cada serviço tem uma responsabilidade bem definida (princípio de responsabilidade única).
Comunicação: Os serviços conversam entre si através de APIs (geralmente REST, gRPC ou mensageria).
Banco de dados próprio: Cada serviço idealmente tem seu próprio banco de dados (não compartilham).
3. Exemplo Simples - E-commerce Básico
Vamos pensar em um e-commerce dividido em microserviços:
Serviço de Usuários (Node.js + MongoDB)
- Cadastro, login, perfil
- Responsável por autenticação
Serviço de Produtos (Python + PostgreSQL)
- Catálogo de produtos
- Busca e filtros
Serviço de Carrinho (Go + Redis)
- Adicionar/remover produtos
- Cálculo de subtotal
Serviço de Pagamento (Java + MySQL)
- Processar pagamentos
- Integração com gateways
Serviço de Pedidos (Node.js + PostgreSQL)
- Criar e rastrear pedidos
- Histórico
4. Como Eles se Comunicam
Comunicação Síncrona (REST/gRPC):
Cliente → API Gateway → Serviço de Produtos
↓
Resposta imediata
Comunicação Assíncrona (Mensageria):
Serviço de Pagamento → [Kafka/RabbitMQ] → Serviço de Pedidos
→ Serviço de Email
→ Serviço de Notificações
5. Componentes Essenciais
API Gateway: Porta de entrada única que roteia requisições para os serviços corretos (Netflix Zuul, Kong, AWS API Gateway).
Service Discovery: Como os serviços encontram uns aos outros dinamicamente (Consul, Eureka, Kubernetes DNS).
Load Balancer: Distribui requisições entre múltiplas instâncias de um serviço.
Message Broker: Facilita comunicação assíncrona (Kafka, RabbitMQ, AWS SQS).
Circuit Breaker: Previne falhas em cascata quando um serviço cai (Hystrix, Resilience4j).
6. Arquitetura Netflix (Simplificada)
A Netflix processa bilhões de requisições por dia. Sua arquitetura inclui:
Camada de Edge:
- API Gateway (Zuul) recebe todas as requisições
- Autenticação e roteamento inicial
Camada de Serviços:
- Serviço de Recomendação (Java/Python): Algoritmos de ML para sugerir conteúdo
- Serviço de Streaming (múltiplas linguagens): Entrega de vídeo otimizada
- Serviço de Perfil (Java): Gerencia perfis de usuários
- Serviço de Busca (Elasticsearch): Busca de conteúdo
- Serviço de Billing (Java): Cobranças e assinaturas
Infraestrutura:
- Eureka: Service discovery
- Hystrix: Circuit breaker (tolerância a falhas)
- Ribbon: Load balancing client-side
- Chaos Monkey: Testa resiliência desligando serviços aleatoriamente em produção!
Dados:
- Cassandra para dados distribuídos
- ElasticSearch para busca
- EVCache (memcached) para cache
7. Arquitetura Spotify (Simplificada)
Backend for Frontend (BFF): Diferentes backends para web, mobile, desktop.
Serviços Principais:
- Audio Delivery: Streaming de música (C++/Java)
- Playlist Service: Criação e gestão de playlists (Java)
- Social Service: Compartilhamento e seguir artistas (Python)
- Search Service: Busca complexa (Java/Python)
- Recommendation Engine: Discover Weekly, Radio (Python/Scala com ML)
- Ad Service: Publicidade para usuários free (Java)
Event-Driven Architecture: Usa Kafka extensivamente para eventos como "música tocada", "playlist criada".
Multi-Linguagem:
- Java/Scala para serviços core
- Python para data science e ML
- Go para serviços de alta performance
- JavaScript/TypeScript no frontend
8. Desafios e Soluções
Consistência de Dados: Usar Saga Pattern ou Event Sourcing para transações distribuídas.
Observabilidade:
- Logs centralizados (ELK Stack, Splunk)
- Métricas (Prometheus, Grafana)
- Tracing distribuído (Jaeger, Zipkin)
Segurança:
- Service mesh (Istio, Linkerd)
- mTLS entre serviços
- OAuth2/JWT para autenticação
Deployment:
- Kubernetes para orquestração
- CI/CD pipelines independentes
- Blue-Green ou Canary deployments
9. Quando NÃO Usar Microserviços
Microserviços não são sempre a resposta. Evite se:
- Sua equipe é pequena (menos de 10 desenvolvedores)
- Seu produto está em estágio inicial
- Você não tem infraestrutura de DevOps madura
- A complexidade operacional supera os benefícios
Comece com um monólito bem estruturado e migre para microserviços quando a escala e complexidade exigirem.
A chave é entender que microserviços trazem complexidade operacional, mas permitem que times grandes trabalhem independentemente, usem as melhores ferramentas para cada problema, e escalem partes específicas do sistema conforme necessário. É uma troca entre complexidade e flexibilidade.