Sistema distribuido de streaming de audio políglota (Go + Java): reproducción en tiempo real vía gRPC, metadatos por RMI y notificaciones por RabbitMQ.
🇪🇸 Español: Combina un servidor de alto rendimiento en Go que sirve fragmentos de audio con gRPC, un servidor Java que orquesta metadatos y expone RMI a clientes Java, y un servicio de notificaciones por RabbitMQ que simula envío de correos con frase motivadora.
🇺🇸 English: Pairs a high-performance Go streaming server (gRPC chunks) with a Java metadata orchestrator (RMI for Java clients) and an email notification service consuming RabbitMQ messages.
Este proyecto implementa una plataforma de streaming de audio utilizando una arquitectura de microservicios políglota. Integra componentes en Go para tareas de alto rendimiento (streaming) y Java para la gestión de lógica de negocio y metadatos.
[Cliente Streaming (Java)]
│── RMI ──▶ [ServidorDeAudiosMetadatos (Java)]
│ │── gRPC ──▶ [ServidorDeStreaming (Go)] ◀── streaming
│ │── RabbitMQ ──▶ [ServidorDeEnvioCorreos (Java)]
│ │── RMI Callback ──▶ [Administrador (Java)]
│
[Administrador (Java)]
└── RMI ──▶ [ServidorDeAudiosMetadatos (Java)]
- RMI: Comunicación entre Cliente Streaming / Administrador y Servidor de Metadatos
- gRPC: Streaming de audio entre Servidor de Metadatos y Servidor de Streaming (Go)
- REST: Notificaciones HTTP desde Servidor de Streaming (Go) hacia Servidor de Metadatos
- RabbitMQ: Mensajería asíncrona para envío de notificaciones de correo
├── Cliente/
│ ├── ClienteStreaming/ # Java + RMI - Reproducción y consulta de audios
│ │ ├── controller/
│ │ ├── facade/
│ │ └── ClienteStreamingMain.java
│ └── Administrador/ # Java + RMI - Registro de audios y CallBacks
│ ├── controller/
│ ├── facade/
│ └── AdministradorMain.java
├── ServidorDeAudiosMetadatos/ # Java - RMI + REST + gRPC + RabbitMQ
│ ├── controller/ # RMI, REST y gRPC controllers
│ ├── facade/ # Lógica de negocio
│ ├── dao/ # Acceso a datos (memoria)
│ └── ServidorMain.java
├── ServidorDeStreaming/ # Go - gRPC - Envío de fragmentos de audio
├── ServidorDeEnvioCorreos/ # Java - RabbitMQ - Notificaciones asíncronas
│ ├── controller/
│ ├── facade/
│ └── ServidorCorreosMain.java
├── shared/ # DTOs e interfaces compartidas
├── proto/ # Archivos .proto para gRPC
└── streaming/ + metadata/ # Código Go generado de protobuf
ServidorDeStreaming: Sirve fragmentos de audio mediante gRPC. Al recibir una solicitud de reproducción, notifica al Servidor de Metadatos vía REST.
ServidorDeAudiosMetadatos: El corazón del sistema. Expone RMI (clientes Java), REST (notificaciones Go) y gRPC (interoperabilidad). Publica mensajes a RabbitMQ al registrar audios.Cliente/ClienteStreaming: Cliente que usa RMI para login, listar tipos de audio, consultar metadatos y reproducir.Cliente/Administrador: Interfaz de gestión con RMI para registrar audios y recibir callbacks cuando los clientes reproducen.ServidorDeEnvioCorreos: Consumidor de RabbitMQ que simula envío de correos con metadatos y frase motivadora.
- Java JDK 8+ y Maven
- Go 1.20+
- RabbitMQ (corriendo localmente en puerto 5672)
| Usuario | Contraseña |
|---|---|
usuario1 |
password123 |
admin |
admin123 |
usuario_go |
password123 |
Para ejecutar el sistema completo de forma manual, siga estos pasos en orden:
Asegúrese de tener RabbitMQ corriendo en su máquina (puerto 5672).
Compile los componentes de Java y genere los stubs de gRPC:
mvn clean compileEste es el núcleo del sistema. Maneja RMI, REST y gRPC.
mvn exec:java -Dexec.mainClass="ServidorDeAudiosMetadatos.ServidorMain"Abra una nueva terminal y ejecute el servidor de alto rendimiento:
cd ServidorDeStreaming
go run main.goAbra una nueva terminal. Este componente escuchará las notificaciones de RabbitMQ:
mvn exec:java -Dexec.mainClass="ServidorDeEnvioCorreos.ServidorCorreosMain"Ahora puede interactuar con el sistema utilizando cualquiera de los clientes:
Administrador (Gestión y Callbacks):
mvn exec:java -Dexec.mainClass="Cliente.Administrador.AdministradorMain"Cliente de Streaming (Usuario final):
mvn exec:java -Dexec.mainClass="Cliente.ClienteStreaming.ClienteStreamingMain"| Servicio | Protocolo | Puerto |
|---|---|---|
| Streaming Server (Go) | gRPC | 50051 |
| Metadata Server (Java) | gRPC | 50052 |
| Metadata Server (Java) | REST | 8081 |
| RMI Registry | RMI | 1099 |
| RabbitMQ | AMQP | 5672 |
Si modificas los archivos en proto/, debes regenerar los stubs:
Para Java (Maven):
mvn generate-sourcesPara Go:
protoc --go_out=. --go-grpc_out=. proto/streaming.proto
protoc --go_out=. --go-grpc_out=. proto/metadata.proto- Java:
mvn compile - Go:
go build ./ServidorDeStreaming/
Los archivos de audio se centralizan en la carpeta audio_files/. El Servidor de Streaming (Go) los lee directamente desde esta ubicación.
- Audios precargados: El sistema viene con archivos de prueba del
1.mp3al5.mp3. - Registro de nuevos audios:
- Ejecute el Cliente Administrador.
- Seleccione la opción 2 (Registrar nuevo audio).
- Ingrese los metadatos (Título, Artista, Género).
- Proporcione la ruta del archivo. Puede usar rutas relativas (ej:
audio_files/1.mp3) o rutas absolutas (ej:C:\Musica\audio.mp3). - El servidor recibirá los bytes, asignará un ID y guardará el archivo automáticamente en la carpeta
audio_files/para que sea reproducible inmediatamente por los clientes.