Microsserviços em TypeScript: arquitetura e prática

Treinador Online de Python para Iniciantes

Aprenda Python facilmente sem sobrecarga teórica. Resolva tarefas práticas com verificação automática e escreva código diretamente no navegador.

Start Course

Introdução: Por que TypeScript é ideal para microsserviços

A arquitetura de microsserviços tornou-se o padrão para construir aplicações complexas, escaláveis e tolerantes a falhas. TypeScript, graças à sua tipagem forte, ecossistema rico e suporte a assincronismo, é uma das melhores linguagens para implementar microsserviços. Ele permite escrever código mais fácil de refatorar, testar e documentar, o que é crítico ao dividir um sistema em dezenas de serviços independentes.

Neste artigo, vamos analisar os princípios arquiteturais, construir um microsserviço simples com NestJS, configurar a comunicação entre serviços via RabbitMQ e empacotar tudo com Docker Compose. Você terá uma base prática pronta para começar.



Arquitetura de microsserviços em TypeScript

Uma arquitetura correta é a chave para o sucesso. Para microsserviços em TypeScript, destacam-se três camadas principais:

  • Camada de transporte — responsável por receber e enviar requisições (HTTP, gRPC, filas de mensagens).
  • Lógica de negócio — funções e serviços puros, independentes do framework.
  • Camada de dados — repositórios e ORMs (TypeORM, Prisma).

Cada microsserviço deve ser autônomo: ter seu próprio banco de dados, CI/CD e lógica de implantação. A comunicação entre serviços geralmente é implementada com filas assíncronas (RabbitMQ, Kafka) ou chamadas síncronas (gRPC).



Prática: Criando um microsserviço com NestJS



Passo 1: Inicialização do projeto

Instale o NestJS CLI e crie um novo projeto:

npm i -g @nestjs/clinest new user-service --package-manager npmcd user-service


Passo 2: Adicionando suporte a microsserviços

NestJS tem suporte nativo a transportadores de microsserviços. Vamos instalar o RabbitMQ:

npm install @nestjs/microservices amqplib amqp-connection-manager

Crie o arquivo main.ts que inicia o serviço como um microsserviço:

import { NestFactory } from '@nestjs/core';import { MicroserviceOptions, Transport } from '@nestjs/microservices';import { AppModule } from './app.module';

async function bootstrap() { const app = await NestFactory.createMicroservice<MicroserviceOptions>( AppModule, { transport: Transport.RMQ, options: { urls: ['amqp://localhost:5672'], queue: 'user_queue', queueOptions: { durable: false }, }, }, ); await app.listen();}bootstrap();


Passo 3: Implementando o controller

Crie um controller simples que processa mensagens da fila:

import { Controller } from '@nestjs/common';import { MessagePattern, Payload } from '@nestjs/microservices';

@Controller()export class UserController { @MessagePattern('user.create') createUser(@Payload() data: { name: string; email: string }): string { // Aqui deve estar a lógica de negócio para criar o usuário return `Usuário ${data.name} criado`; }}

Agora qualquer serviço pode enviar uma mensagem para a fila user_queue com o padrão user.create e receber uma resposta.



Comunicação entre serviços: síncrona e assíncrona



Síncrona: gRPC

Para sistemas de alta carga que exigem tipagem forte e baixa latência, use gRPC. Instale o pacote:

npm install @nestjs/microservices @grpc/grpc-js @grpc/proto-loader

Defina o arquivo .proto:

syntax = "proto3";package user;service UserService {  rpc GetUser (UserId) returns (User);}message UserId { int32 id = 1; }message User { string name = 1; string email = 2; }

No controller, use o decorator @GrpcMethod para processar a requisição.



Assíncrona: RabbitMQ

Blogs

Book Recommendations