Microsserviços em TypeScript: seu primeiro passo para uma arquitetura modular
\n\nImagine que você está construindo uma casa. Pode-se erguer uma parede enorme e depois adicionar cômodos a ela. Mas se um cômodo quebrar — todo o edifício sofre. A alternativa é construir módulos separados: cozinha, quarto, sala de estar, cada um com sua própria fiação e encanamento. É mais ou menos assim que funcionam os microsserviços — componentes independentes e fracamente acoplados que se comunicam pela rede.
\n\nTypeScript para microsserviços não é apenas uma tendência da moda, mas uma ferramenta que salva do caos. A tipagem estática detecta erros em tempo de compilação, não em produção. Neste artigo, vamos analisar por onde começar se você quiser migrar de um monólito para microsserviços em TypeScript. Sem enrolação, com exemplos reais de código.
\n\nPor que TypeScript e não JavaScript puro?
\n\nAo escrever microsserviços, cada serviço é um projeto separado. Sem tipos, é fácil se confundir: qual formato de dados o serviço A espera, o que o serviço B retorna? O TypeScript resolve esse problema:
\n\n- \n
- Interfaces e tipos — você define claramente os contratos entre os serviços. \n
- Autocompletar e refatoração — a IDE sugere os campos dos objetos, e renomear não quebra o código. \n
- Compatibilidade com Node.js — TypeScript compila para JavaScript, funciona em qualquer lugar onde o Node está presente. \n
Exemplo: imagine que o serviço de pedidos envia dados para o serviço de entrega. Sem tipos, você pode acidentalmente passar uma string em vez de um número. O TypeScript dirá: "Ei, aqui é esperado um number, mas você está enviando uma string".
\n\nFerramentas para começar
\n\nPara começar, você precisará de:
\n\n- \n
- Node.js (versão 18+) — ambiente de execução. \n
- TypeScript — instale globalmente ou no projeto. \n
- NestJS — framework para aplicações server-side. Ele suporta nativamente a arquitetura de microsserviços. \n
- RabbitMQ ou NATS — brokers de mensagens para comunicação assíncrona. \n
- Docker — conteinerização de cada serviço. \n
Não se preocupe, tudo isso é configurado em 15 minutos.
\n\nPasso 1: Criando o primeiro microsserviço com NestJS
\n\nNestJS é como o Angular para o backend. Ele usa decoradores, módulos e providers. Vamos instalá-lo:
\n\nnpm i -g @nestjs/cli\nnest new user-service\ncd user-service\nnpm install @nestjs/microservices\n\nAgora vamos transformar uma aplicação comum em um microsserviço. Abra o main.ts:
import { NestFactory } from '@nestjs/core';\nimport { MicroserviceOptions, Transport } from '@nestjs/microservices';\nimport { AppModule } from './app.module';\n\nasync function bootstrap() {\n const app = await NestFactory.createMicroservice<MicroserviceOptions>(\n AppModule,\n {\n transport: Transport.TCP, // ou Redis, RabbitMQ\n options: {\n host: '0.0.0.0',\n port: 3001,\n },\n },\n );\n await app.listen();\n console.log('User microservice is listening on port 3001');\n}\nbootstrap();\n\nCriamos um microsserviço que escuta na porta TCP 3001. Agora vamos adicionar um manipulador de mensagens no app.controller.ts:
import { Controller } from '@nestjs/common';\nimport { MessagePattern, Payload } from '@nestjs/microservices';\n\n@Controller()\nexport class AppController {\n @MessagePattern('get_user')\n getUser(@Payload() data: { id: number }) {\n // Simulação de consulta ao banco de dados\n return { id: data.id, name: 'Alice', email: 'alice@example.com' };\n }\n}\n\nPronto! O primeiro microsserviço está criado. Ele recebe uma mensagem com o padrão get_user e retorna os dados do usuário.
Passo 2: Criando um segundo serviço e organizando a comunicação
\n\nVamos criar outro serviço — order-service. Ele solicitará dados ao user-service.