Microserviços
Definição
A arquitetura de Microserviços (Microservices) é um estilo arquitetural que organiza um sistema como um conjunto de serviços pequenos, independentes e implantáveis separadamente. Cada microserviço é responsável por uma funcionalidade específica e comunica-se com os demais geralmente por meio de APIs ou mensagens.
Esses serviços são autônomos, têm seu próprio ciclo de vida, podem ser escritos em linguagens diferentes e escalam de forma independente.
Por que é importante
Microserviços oferecem maior flexibilidade e resiliência em comparação com arquiteturas monolíticas. Como cada serviço é isolado, é possível:
- desenvolver e implantar funcionalidades de forma independente;
- escalar apenas os serviços que demandam mais recursos;
- usar diferentes linguagens ou tecnologias conforme a necessidade de cada serviço;
- facilitar a manutenção e o isolamento de falhas.
Essa arquitetura é muito usada em aplicações modernas e distribuídas, especialmente na computação em nuvem.
Estrutura típica
Cada microserviço representa uma parte do domínio do sistema (por exemplo: "usuário", "pagamento", "produtos") e expõe uma interface bem definida para comunicação.
[ Serviço de Usuários ] ←→ [ Serviço de Pagamentos ]
↑ ↑
Banco A Banco B
A comunicação entre os serviços pode ocorrer via HTTP (REST, gRPC), mensagens assíncronas (filas, brokers) ou eventos.
Também é comum o uso de uma camada de API Gateway para unificar o acesso externo ao sistema.
Exemplo prático (em Python)
Suponha que temos dois microserviços: um para processar pedidos e outro para enviar confirmações por e-mail. Eles se comunicam por meio de eventos.
# Microserviço A — Pedidos
class ServicoDePedidos:
def __init__(self, fila_de_eventos):
self.fila = fila_de_eventos
def criar_pedido(self, cliente, produto):
print(f"Pedido criado para {cliente}: {produto}")
self.fila.publicar_evento("PedidoCriado", {"cliente": cliente, "produto": produto})
# Microserviço B — Notificação
class ServicoDeEmail:
def on_evento(self, evento, dados):
if evento == "PedidoCriado":
print(f"[E-mail] Enviado para {dados['cliente']} sobre o pedido de {dados['produto']}")
# Simulador de fila de eventos
class FilaDeEventos:
def __init__(self):
self.assinantes = []
def inscrever(self, callback):
self.assinantes.append(callback)
def publicar_evento(self, evento, dados):
for callback in self.assinantes:
callback(evento, dados)
# Execução
fila = FilaDeEventos()
email = ServicoDeEmail()
fila.inscrever(email.on_evento)
pedidos = ServicoDePedidos(fila)
pedidos.criar_pedido("João", "Notebook")
Neste exemplo, o serviço de pedidos emite um evento e o serviço de e-mail responde. Nenhum dos dois conhece o outro diretamente, respeitando os princípios de microserviços e acoplamento fraco.
Desafios
Apesar dos benefícios, a arquitetura de microserviços também traz complexidade:
- Requer automação para testes, implantação e monitoramento;
- Depende de uma boa estratégia de comunicação entre serviços;
- Pode dificultar a consistência de dados entre serviços separados;
- Aumenta o número de deploys e o esforço de observabilidade.