Contenido del curso
0:00/6:38
Dividir una API en microservicios escalables
Suscríbete para ver másKafka para comunicar microservicios por eventos
Suscríbete para ver másFlujo de trabajo con Kafka para enrutar microservicios automáticamente
Suscríbete para ver másBases de datos fuera de contenedores Docker
Suscríbete para ver másAutomatiza microservicios ASP.NET con Bash
Suscríbete para ver másAutomatizar microservicios con Bash y Dockerfile
Suscríbete para ver másAzure Service Bus para comunicación entre microservicios
Suscríbete para ver másRest Client como alternativa a Swagger en VS Code
Suscríbete para ver másTres microservicios .NET corriendo sin Docker
Suscríbete para ver másCreación de servicios de consulta con .NET y SQL
Suscríbete para ver másDocker Compose con cinco microservicios .NET
Suscríbete para ver másMonorepo vs multirepo en microservicios
Suscríbete para ver másConfiguración de secretos de GitHub para desplegar en Azure
Suscríbete para ver másDespliegue de aplicaciones con Azure Container Apps desde Docker Hub
Suscríbete para ver másDespliegue automático de microservicios con GitHub Actions
Suscríbete para ver másDesplegando microservicios con GitHub Actions
Suscríbete para ver másPróximos pasos de mejora en arquitectura de microservicios
Suscríbete para ver másConectar dos microservicios mediante un queue de Azure Service Bus requiere configurar un servicio receptor que escuche mensajes en segundo plano sin exponer endpoints HTTP. Aquí verás cómo construir ese servicio receptor en .NET usando un worker, paso a paso, partiendo del transcript de la clase.
¿Qué necesitas para configurar el servicio receptor PeakAge?
Antes de escribir código, prepara las dependencias y la configuración base que la documentación te indica.
El primer paso es agregar los paquetes de NuGet desde la terminal. Copias cada paquete, lo pegas en la terminal y presionas enter. Si trabajas con .NET, el flujo es idéntico. Una vez instalados, el siguiente paso es replicar el archivo appsettings.json que ya usaste en el servicio emisor.
En lugar de reescribirlo, hay un truco práctico: copia todo el contenido del appsettings de AddMember, muévete al proyecto PeakAge y reemplaza el contenido completo con Control A, Control C y pegar. Así heredas el ConnectionString y el QueueName sin errores de tipeo [03:12].
¿Qué es un worker en .NET? Es un servicio que corre en segundo plano, esperando ser despertado cuando llega un evento, como un mensaje nuevo en una cola de Service Bus. No expone endpoints HTTP.
¿Cómo modificar Program.cs para que no exponga una API?
Aquí ocurre el cambio más interesante: el receptor deja de ser una API tradicional.
Al abrir Program.cs verás el código que normalmente expone los métodos de tu API mediante endpoints. Ese código desaparece por completo. La nueva configuración se encarga solo de dos cosas:
appsettings.json.Esto significa que el proyecto ya no escuchará en un puerto HTTP. Su único trabajo será mantenerse activo esperando mensajes desde Azure Service Bus.
¿Cómo se construye el archivo Worker.cs?
El archivo Worker.cs es el corazón del servicio receptor. Lo creas dentro del proyecto PeakAge y pegas el contenido que la documentación indica [05:48].
¿Qué contiene la clase Worker?
Este archivo está pensado para mantenerse "durmiendo" y despertar solo cuando hay actividad en la cola. Su estructura incluye:
ConnectionString y QueueName, que deben coincidir exactamente con lo declarado en appsettings.json.ExecuteAsync, que mantiene al worker activo de forma indefinida y registra los manejadores de eventos.ErrorHandler y StopAsync, que el worker exige implementar para gestionar errores y apagados controlados.Dentro del manejador del mensaje recibido, el body contiene la información que llegó desde el servicio emisor. Una buena práctica de naming es nombrar la variable como mensaje recibido en español si el resto del código está en ese idioma, para mantener consistencia [07:30].
¿Para qué sirve ExecuteAsync en un worker? Es el método que mantiene vivo al servicio en segundo plano y conecta los manejadores de eventos que reaccionan cuando llega un nuevo mensaje a la cola.
¿Cómo verificar que el receptor procesa los mensajes de la cola?
La prueba final demuestra que la comunicación entre microservicios funciona sin HTTP.
Abre dos terminales. En una, ubícate en la carpeta del servicio AddMember. En la otra, en PeakAge. Ejecuta dotnet run en PeakAge y notarás algo distinto: no aparece un puerto expuesto como localhost:5242, porque este servicio no se comunica por HTTP, sino por mensajería.
La aplicación se inicia y, como spoiler, procesa de inmediato los mensajes que estaban en fila esperando. En el ejemplo del transcript aparece el nombre Miranda y dos intentos previos. Al regresar al portal de Azure y actualizar la información, el conteo de mensajes pendientes se resetea a cero [09:15].
Para probar el flujo completo en vivo:
Mensaje recibido 2019, enviado del otro servicio.¿Por qué un microservicio receptor no expone un puerto? Porque su comunicación ocurre a través de un queue de Azure Service Bus, no de HTTP. Solo necesita conectarse al broker de mensajería y escuchar.
Con esto, dos microservicios ya conversan entre sí mediante una cola, lo que abre la puerta al siguiente reto: hacer que el segundo servicio publique mensajes a un topic. ¿Qué diferencias crees que tendrá un topic frente a un queue? Déjalo en los comentarios.
Royer Guerrero Pinilla
Royer Guerrero Pinilla
Seth Karim Luis Martínez
El curso deberia llamarse Introduccion a los microservicios en .NET y Azure
La verdad se da muchas cosas por sentado en lugar de explicar otras cosas que veo mas crucial como funciona un message broker en general y como manejan conceptos como producer, router, exchange, topic, queue diferentes sistemas como RabbitMQ, Kafka, Pub/Sub de GCP, el Service Bus de Azure o SQS + SNS y SQS + EventBridge.
Para muchos es la puerta de entrada de conocer estos sistemas y aqui vemos un copy/paste y ya.
Un poco desepcionante
Tampoco se habla de los beneficios y desventajas de este tipo de sistemas. El orden de los servicios la eventualidad contextual. Menos se tocan topicos mas avanzados como DDD que es donde sale mucho de los eventos de dominio. Sugeiria que se usara un lenguague mas comun como TypeScript pues Platzi incluso ha tenido escula de javascript seguramente la mayoria de estudiantes estan familiarizados con ello no todos los lenguajes tienen namespaces y otros conceptos netos de .net.... En definitiva no es ni introductorio ni menos fundamental
Se pido haber hecho todo en local.