Microservicios en JavaScript: arquitectura y práctica de la A a la Z

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 a la Arquitectura de Microservicios en JavaScript

La arquitectura de microservicios es un enfoque de desarrollo de software donde una aplicación se construye como un conjunto de servicios pequeños e implementables de forma independiente. Cada servicio implementa una única función de negocio y se comunica con otros mediante protocolos ligeros (generalmente HTTP/REST o colas de mensajes). JavaScript, específicamente el tiempo de ejecución de Node.js, es ideal para crear microservicios gracias a su modelo de E/S asíncrona, su vasto ecosistema de paquetes (npm) y su alta velocidad de desarrollo.

En este artículo, cubriremos los aspectos clave de la construcción de microservicios en JavaScript: desde el diseño de la arquitectura hasta la implementación en contenedores. Aprenderá cómo organizar el intercambio de datos, garantizar la tolerancia a fallos y probar un sistema distribuido.



1. Diseño de la Arquitectura de Microservicios

El primer paso es descomponer una aplicación monolítica en servicios. Cada microservicio debe tener su propia base de datos (base de datos por servicio) y ser completamente autónomo. Considere un ejemplo de una tienda en línea:

  • Servicio Usuarios — registro, autenticación, perfiles.
  • Servicio Productos — catálogo de productos, precios, existencias.
  • Servicio Pedidos — creación y procesamiento de pedidos.
  • Servicio Pagos — integración con pasarelas de pago.
  • Servicio Notificaciones — envío de correo electrónico/SMS.

Para la comunicación entre servicios, utilizamos dos enfoques: síncrono (REST/gRPC) para solicitudes que requieren una respuesta inmediata, y asíncrono (colas de mensajes) para eventos que no requieren bloqueo.



2. Creación de un Microservicio en Node.js con Express

Comencemos con un microservicio simple para la gestión de usuarios. Instale Express y una librería para trabajar con UUID:

npm init -ynpm install express uuid

Cree un archivo users-service.js:

const express = require('express');const { v4: uuidv4 } = require('uuid');const app = express();app.use(express.json());

const users = [];

// Crear usuarioapp.post('/users', (req, res) => { const { name, email } = req.body; const user = { id: uuidv4(), name, email }; users.push(user); res.status(201).json(user);});

// Obtener lista de usuariosapp.get('/users', (req, res) => { res.json(users);});

// Obtener usuario por IDapp.get('/users/:id', (req, res) => { const user = users.find(u => u.id === req.params.id); if (!user) return res.status(404).json({ error: 'Usuario no encontrado' }); res.json(user);});

app.listen(3001, () => console.log('Servicio de usuarios ejecutándose en el puerto 3001'));

Ejecute el servicio: node users-service.js. Ahora tiene un microservicio funcional con una API REST. Los servicios para productos y pedidos se crean de manera similar (en los puertos 3002 y 3003 respectivamente).



3. Comunicación Asíncrona mediante RabbitMQ

Para eventos como "pedido creado" o "usuario registrado", utilizamos colas de mensajes. Instale el cliente de RabbitMQ:

npm install amqplib

Cree una utilidad para publicar mensajes (event-bus.js):

const amqp = require('amqplib');let channel;

async function connect() { const connection = await amqp.connect('amqp://localhost'); channel = await connection.createChannel(); await channel.assertExchange('order_events', 'topic', { durable: true });}

async function publishEvent(routingKey, data) { if (!channel) await connect(); channel.publish('order_events', routingKey, Buffer.from(JSON.stringify(data))); console.log(`Evento publicado: ${routingKey}`);}

module.exports = { publishEvent };

Ahora en el servicio de pedidos (orders-service.js), cuando se crea un pedido, publique

Blogs

Book Recommendations