Introdução
Neste tutorial, vamos explorar como integrar microservices em aplicações ‘Red’ utilizando Node.js e Docker. A arquitetura baseada em microservices é uma abordagem moderna e eficiente para construir sistemas escaláveis e de fácil manutenção. Com o uso do Node.js, podemos desenvolver serviços leves e ágeis, enquanto o Docker nos permite containerizar esses serviços, facilitando a implementação e a gestão de dependências. Ao longo deste artigo, vamos construir um sistema básico de microservices, adicionando práticas recomendadas e ferramentas essenciais que ajudam na escalabilidade e na eficiência do desenvolvimento. Se você está buscando aumentar suas habilidades em desenvolvimento de software e entender como construir sistemas complexos com microservices, está no lugar certo.
Etapas
Configuração do Ambiente de Desenvolvimento
Antes de começarmos, verifique se você tem o Node.js e o Docker instalados nas versões mais recentes. Use os seguintes comandos para verificar as instalações:
commands# Verificar versao do Node.js
node -v
# Verificar versao do NPM
npm -v
# Verificar versao do Docker
docker --versionCriação do Projeto Node.js
Vamos criar um novo projeto Node.js. Crie um diretório para o projeto e inicialize um novo projeto Node.js usando npm.
commands# Criar diretório do projeto
mkdir microservice-example && cd microservice-example
# Inicializar um novo projeto Node.js
npm init -yInstalação de Dependências
Vamos instalar as principais dependências que precisamos para o projeto, como Express para criação da API.
commandsnpm install express
Criação do Service ‘Produto’
Crie um arquivo `produto.js` na raiz do projeto para definir a lógica do nosso service de produtos.
produto.jsconst express = require('express'); const router = express.Router(); let produtos = []; // Lista todos os produtos router.get('/', (req, res) => { res.json(produtos); }); // Cria um novo produto router.post('/', (req, res) => { const produto = req.body; produtos.push(produto); res.status(201).json(produto); }); module.exports = router;
Configurando o Servidor Express
Crie o arquivo principal `server.js` onde será configurado o servidor Express para utilizar o service de produtos.
server.jsconst express = require('express'); const produtoRouter = require('./produto'); const app = express(); app.use(express.json()); // Configurar rotas app.use('/api/produtos', produtoRouter); const PORT = process.env.PORT || 3000; app.listen(PORT, () => { console.log(`Servidor rodando na porta ${PORT}`); });
Testando o Serviço Localmente
Use ferramentas como Postman ou cURL para testar as rotas do seu serviço localmente.
commands# Inicie o servidor
node server.js
# Exemplo de requisições cURL
curl -X GET http://localhost:3000/api/produtos
curl -X POST -H 'Content-Type: application/json' -d '{"nome":"Produto 1", "preco":10.0}' http://localhost:3000/api/produtosCriando o Dockerfile
Crie um arquivo `Dockerfile` na raiz do projeto para containerizar sua aplicação Node.js.
DockerfileFROM node:14 WORKDIR /usr/src/app COPY package*.json ./ RUN npm install COPY . . CMD [ "node", "server.js" ] EXPOSE 3000
Construindo e Executando o Container Docker
Construa a imagem Docker e execute o container com os seguintes comandos.
commands# Construir a imagem Docker
docker build -t microservice-example .
# Executar o container
docker run -p 3000:3000 microservice-exampleTestando o Serviço em Docker
Uma vez que o container esteja rodando, você pode testar as rotas novamente, desta vez no Docker.
commands# Exemplo de requisições cURL após subir o container
curl -X GET http://localhost:3000/api/produtos
curl -X POST -H 'Content-Type: application/json' -d '{"nome":"Produto 2", "preco":20.0}' http://localhost:3000/api/produtosImplementação de Testes Unitários
Vamos criar testes unitários para nosso service usando o Jest. Primeiro, instale o Jest como dependência de desenvolvimento.
commandsnpm install --save-dev jest supertest
produto.test.jsconst request = require('supertest'); const express = require('express'); const produtoRouter = require('./produto'); const app = express(); app.use(express.json()); app.use('/api/produtos', produtoRouter); describe('Testes de Produtos', () => { it('Deve listar todos os produtos', async () => { const response = await request(app).get('/'); expect(response.status).toBe(200); }); it('Deve criar um novo produto', async () => { const response = await request(app) .post('/') .send({ nome: 'Produto Teste', preco: 30.0 }); expect(response.status).toBe(201); expect(response.body.nome).toBe('Produto Teste'); }); });
Executando os Testes
Adicione um script no `package.json` para executar os testes e execute-os.
package.json{ // outras propriedades "scripts": { "test": "jest" } }
commands# Executar os testes unitários
npm test
Conclusão
Neste tutorial, abordamos como construir e integrar microservices em aplicações ‘Red’ utilizando Node.js e Docker. Vimos desde a criação da API utilizando o Express, a configuração do ambiente até a implementação e execução de testes unitários para garantir a qualidade do código. Através da containerização com Docker, facilitamos o processo de escalabilidade e implementação em diferentes ambientes. Com estas ferramentas e práticas, você está bem equipado para construir sistemas complexos e escaláveis, aproveitando as vantagens dos microservices.