Introducción: Por qué TypeScript es ideal para microservicios
La arquitectura de microservicios se ha convertido en el estándar para construir aplicaciones complejas, escalables y tolerantes a fallos. TypeScript, gracias a su tipado estricto, su rico ecosistema y su soporte para asincronía, es uno de los mejores lenguajes para implementar microservicios. Permite escribir código que es más fácil de refactorizar, probar y documentar, lo cual es crítico al dividir un sistema en decenas de servicios independientes.
En este artículo analizaremos los principios arquitectónicos, construiremos un microservicio simple con NestJS, configuraremos la comunicación entre servicios mediante RabbitMQ y empaquetaremos todo en Docker Compose. Obtendrás una base práctica lista para empezar.
Arquitectura de microservicios en TypeScript
Una arquitectura correcta es la clave del éxito. Para los microservicios en TypeScript se distinguen tres capas clave:
- Capa de transporte — se encarga de recibir y enviar solicitudes (HTTP, gRPC, colas de mensajes).
- Lógica de negocio — funciones y servicios puros, independientes del framework.
- Capa de datos — repositorios y ORM (TypeORM, Prisma).
Cada microservicio debe ser autónomo: tener su propia base de datos, CI/CD y lógica de despliegue. La comunicación entre servicios generalmente se implementa mediante colas asíncronas (RabbitMQ, Kafka) o llamadas síncronas (gRPC).
Práctica: Creación de un microservicio con NestJS
Paso 1: Inicialización del proyecto
Instala la CLI de NestJS y crea un nuevo proyecto:
npm i -g @nestjs/clinest new user-service --package-manager npmcd user-servicePaso 2: Añadir soporte para microservicios
NestJS tiene soporte integrado para transportadores de microservicios. Instalemos RabbitMQ:
npm install @nestjs/microservices amqplib amqp-connection-managerCreemos el archivo main.ts, que inicia el servicio como un microservicio:
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();Paso 3: Implementación del controlador
Creemos un controlador simple que procese los mensajes de la cola:
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 { // Aquí debería ir la lógica de negocio para crear el usuario return `Usuario ${data.name} creado`; }}Ahora cualquier servicio puede enviar un mensaje a la cola user_queue con el patrón user.create y recibir una respuesta.
Comunicación entre servicios: síncrona y asíncrona
Síncrona: gRPC
Para sistemas de alta carga donde se requiere tipado estricto y baja latencia, utiliza gRPC. Instala el paquete:
npm install @nestjs/microservices @grpc/grpc-js @grpc/proto-loaderDefine el archivo .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; }En el controlador, usa el decorador @GrpcMethod para procesar la solicitud.