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 en microservicios?



La arquitectura de microservicios se ha convertido en el estándar para construir aplicaciones escalables y tolerantes a fallos. Sin embargo, la elección del lenguaje de programación puede afectar significativamente la velocidad de desarrollo y la calidad del código. TypeScript — un superconjunto de JavaScript con tipado estricto — ofrece un equilibrio ideal entre flexibilidad y fiabilidad. Gracias al tipado estático, las interfaces y un potente sistema de módulos, TypeScript permite detectar errores en la fase de compilación, no en tiempo de ejecución, lo cual es crítico para sistemas distribuidos.



En este artículo, analizaremos los principios clave para construir microservicios con TypeScript, exploraremos frameworks populares (NestJS, Fastify), la configuración de la comunicación entre servicios mediante RabbitMQ, así como la contenedorización con Docker. Todos los ejemplos de código se presentarán en TypeScript para que puedas aplicarlos directamente en tus proyectos.



1. Elección del framework: NestJS vs Fastify



Para crear microservicios en TypeScript existen varios frameworks. Los dos más populares son NestJS y Fastify. Analicemos sus características.



NestJS — «El Angular del backend»

NestJS ofrece una arquitectura modular, inspirada en Angular. Viene con una capa de transporte lista para microservicios (TCP, Redis, RabbitMQ, Kafka). Es la elección ideal para proyectos grandes donde la estructuración y el soporte del equipo de desarrollo son importantes.



// Ejemplo de un microservicio básico en NestJSimport { NestFactory } from '@nestjs/core';import { Transport, MicroserviceOptions } 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: 'orders_queue', queueOptions: { durable: false }, }, }, ); await app.listen();}bootstrap();


Fastify — rendimiento y simplicidad

Fastify es un framework HTTP ultrarrápido para Node.js. No proporciona soporte integrado para microservicios, pero se integra fácilmente con RabbitMQ o NATS a través de paquetes separados. Es adecuado para casos donde el rendimiento es crítico y la arquitectura ya está definida.



// Ejemplo de servidor en Fastify + TypeScriptimport fastify from 'fastify';

const server = fastify({ logger: true });

server.get('/health', async (request, reply) => { return { status: 'OK', service: 'payment-service' };});

const start = async () => { try { await server.listen({ port: 3000 }); } catch (err) { server.log.error(err); process.exit(1); }};start();


Conclusión: para principiantes y proyectos en equipo, elige NestJS. Para sistemas de alta carga con una arquitectura ya bien pensada, elige Fastify.



2. Comunicación entre servicios: RabbitMQ y Redis



En la arquitectura de microservicios, los servicios se comunican entre sí a través de brokers de mensajes o solicitudes HTTP directas. Analicemos dos enfoques populares.



RabbitMQ — cola de mensajes fiable

RabbitMQ garantiza la transmisión asíncrona de mensajes con entrega asegurada. En TypeScript, para trabajar con RabbitMQ se suele usar la librería amqplib o los módulos integrados de NestJS.



// Publicación de un mensaje en RabbitMQ (TypeScript)import * as amqp from 'amqplib';

async function publishOrder(order: any) { const connection = await amqp.connect('amqp://localhost'); const channel = await connection.createChannel(); const queue = 'orders';

await channel.assertQueue(queue, { durable: true }); channel.sendToQueue(queue, Buffer.from(JSON.stringify(order)), { persistent: true, });

console.log(`Order sent: ${order.id}`); setTimeout(() => connection.close(), 500)

Blogs

Book Recommendations