Microservicios en TypeScript: arquitectura y práctica

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

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-service


Paso 2: Añadir soporte para microservicios

NestJS tiene soporte integrado para transportadores de microservicios. Instalemos RabbitMQ:

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

Creemos 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-loader

Define 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.



Asíncrona: RabbitMQ

Blogs

Book Recommendations