Introdução à Arquitetura de Microsserviços em JavaScript
A arquitetura de microsserviços é uma abordagem de desenvolvimento de software onde uma aplicação é construída como um conjunto de pequenos serviços independentemente implantáveis. Cada serviço implementa uma única função de negócio e se comunica com outros através de protocolos leves (geralmente HTTP/REST ou filas de mensagens). JavaScript, especificamente o runtime Node.js, é ideal para criar microsserviços graças ao seu modelo de I/O assíncrono, vasto ecossistema de pacotes (npm) e alta velocidade de desenvolvimento.
Neste artigo, abordaremos os principais aspectos da construção de microsserviços em JavaScript: desde o design da arquitetura até a implantação em contêineres. Você aprenderá como organizar a troca de dados, garantir tolerância a falhas e testar um sistema distribuído.
1. Projetando a Arquitetura de Microsserviços
O primeiro passo é decompor uma aplicação monolítica em serviços. Cada microsserviço deve ter seu próprio banco de dados (database per service) e ser totalmente autônomo. Considere um exemplo de loja online:
- Serviço Usuários — registro, autenticação, perfis.
- Serviço Produtos — catálogo de produtos, preços, estoque.
- Serviço Pedidos — criação e processamento de pedidos.
- Serviço Pagamentos — integração com gateways de pagamento.
- Serviço Notificações — envio de e-mail/SMS.
Para comunicação entre serviços, usamos duas abordagens: síncrona (REST/gRPC) para requisições que exigem resposta imediata, e assíncrona (filas de mensagens) para eventos que não requerem bloqueio.
2. Criando um Microsserviço em Node.js com Express
Vamos começar com um microsserviço simples para gerenciamento de usuários. Instale o Express e uma biblioteca para trabalhar com UUID:
npm init -ynpm install express uuidCrie um arquivo users-service.js:
const express = require('express');const { v4: uuidv4 } = require('uuid');const app = express();app.use(express.json());
const users = [];
// Criar usuárioapp.post('/users', (req, res) => { const { name, email } = req.body; const user = { id: uuidv4(), name, email }; users.push(user); res.status(201).json(user);});
// Obter lista de usuáriosapp.get('/users', (req, res) => { res.json(users);});
// Obter usuário por IDapp.get('/users/:id', (req, res) => { const user = users.find(u => u.id === req.params.id); if (!user) return res.status(404).json({ error: 'Usuário não encontrado' }); res.json(user);});
app.listen(3001, () => console.log('Serviço de usuários rodando na porta 3001'));Execute o serviço: node users-service.js. Agora você tem um microsserviço funcional com uma API REST. Os serviços para produtos e pedidos são criados de forma similar (nas portas 3002 e 3003 respectivamente).
3. Comunicação Assíncrona via RabbitMQ
Para eventos como "pedido criado" ou "usuário registrado", usamos filas de mensagens. Instale o cliente RabbitMQ:
npm install amqplibCrie um utilitário para publicar mensagens (event-bus.js):
const amqp = require('amqplib');let channel;
async function connect() { const connection = await amqp.connect('amqp://localhost'); channel = await connection.createChannel(); await channel.assertExchange('order_events', 'topic', { durable: true });}
async function publishEvent(routingKey, data) { if (!channel) await connect(); channel.publish('order_events', routingKey, Buffer.from(JSON.stringify(data))); console.log(`Evento publicado: ${routingKey}`);}
module.exports = { publishEvent };Agora no serviço de pedidos (orders-service.js), quando um pedido for criado, publique