Cuando hay demasiados microservicios
\n\nEscribiste tu primer microservicio en TypeScript. Funciona. Luego el segundo, el tercero, el décimo. Y de repente te das cuenta de que dedicas más tiempo no a escribir la lógica de negocio, sino a que los microservicios puedan comunicarse entre sí. Timeouts, reintentos, balanceo de carga, cifrado de tráfico, métricas — todo esto hay que implementarlo en cada servicio por separado.
\n\nAquí entra en escena Service Mesh — una tecnología que saca toda la infraestructura de comunicación del código a una capa separada. Y sí, funciona perfectamente con microservicios TypeScript. En este artículo, veremos cómo funciona en la práctica, con ejemplos de código reales.
\n\nQué es Service Mesh en palabras sencillas
\n\nImagina que cada uno de tus microservicios TypeScript es un empleado en una gran oficina. Sin Service Mesh, cada empleado tiene que tender sus propios cables, configurar el teléfono y asegurarse de que no lo espíen. Con Service Mesh, un departamento de TI especializado se encarga de esto, conectando a cada empleado un "asistente personal" (sidecar proxy).
\n\nEn el mundo de la tecnología, este asistente se llama Envoy Proxy, y toda esta infraestructura es gestionada por un orquestador como Istio o Linkerd. Lo mejor es que tu código TypeScript permanece prácticamente intacto.
\n\nCapacidades clave de Service Mesh
\n\n- \n
- Traffic Management — enrutamiento inteligente, pruebas A/B, lanzamientos canary \n
- Security — cifrado automático mTLS entre servicios \n
- Observability — métricas, logs, trazabilidad "de fábrica" \n
- Resilience — reintentos, circuit breaker, timeouts a nivel de infraestructura \n
Por qué los microservicios TypeScript se benefician especialmente de Service Mesh
\n\nTypeScript es un lenguaje con un potente sistema de tipos, pero su entorno de ejecución principal (Node.js) no siempre es conocido por su rendimiento de entrada/salida. Cuando escribes un microservicio en TypeScript, cada solicitud HTTP adicional, cada implementación manual de reintentos o handshake TLS es una carga extra para el Event Loop.
\n\nService Mesh asume esta carga. Tu código TypeScript se mantiene limpio: solo recibe solicitudes y responde a ellas, mientras que Envoy se encarga de toda la "fontanería". Esto es especialmente importante cuando tienes decenas de microservicios, cada uno con su propia lógica de reintentos y timeouts.
\n\nEjemplo práctico: Microservicio TypeScript bajo Service Mesh
\n\nImaginemos que tenemos dos microservicios en TypeScript: user-service y order-service. Order-service necesita obtener datos del usuario. Sin Service Mesh, escribiríamos algo como:
// Sin Service Mesh — gestión manual de HTTP\nimport axios from 'axios';\n\nclass UserClient {\n private baseUrl = 'http://user-service:3000';\n private retries = 3;\n\n async getUser(id: string): Promise<User> {\n for (let i = 0; i < this.retries; i++) {\n try {\n const response = await axios.get(`${this.baseUrl}/users/${id}`, {\n timeout: 5000,\n httpsAgent: new https.Agent({ rejectUnauthorized: true })\n });\n return response.data;\n } catch (error) {\n if (i === this.retries - 1) throw error;\n await delay(1000 * Math.pow(2, i));\n }\n }\n }\n}\n\nY con Service Mesh esto se convierte en:
\n\n// Con Service Mesh — simplemente una solicitud HTTP\nimport axios from 'axios';\n\nclass UserClient {\n async getUser(id: string): Promise<User> {\n const response = await axios.get(`http://user-service/users/${id}`);\n return response.data;\n }\n}\n\n¿Notaste la diferencia? Toda la complejidad — reintentos, timeouts, cifrado — se