RabbitMQ con Spring Boot: Enviando mensajes entre microservicios

RabbitMQ con Spring Boot: Enviando mensajes entre microservicios

Introducción a RabbitMQ y su Uso en Microservicios

Contexto de la Serie

  • Se inicia una serie titulada "Guiado por Eventos", donde se discuten diferentes mecanismos de comunicación entre microservicios.
  • El enfoque del día es sobre RabbitMQ, un bus de mensajes que facilita la comunicación entre microservicios basados en eventos.

Ventajas y Desventajas de RabbitMQ

  • RabbitMQ es fácil de implementar tanto en producción como localmente, lo que lo hace accesible para desarrolladores.
  • Aunque es más sencillo, se considera menos robusto para entornos productivos comparado con otras soluciones como Apache Kafka.

Características Fundamentales de RabbitMQ

Funcionamiento Básico

  • RabbitMQ permite el envío y recepción de mensajes mediante un sistema basado en colas, donde los publicadores envían mensajes a las colas y los consumidores los procesan.

Componentes Clave

  • Los componentes principales incluyen:
  • Publicador: Envía mensajes a una cola.
  • Consumidor/Suscriptor: Recibe y procesa los mensajes desde la cola.

Elementos Técnicos Esenciales

Ruteo y Colas

  • La característica "exchange" permite el ruteo interno de mensajes utilizando claves específicas (routing keys).
  • Las colas son fundamentales para el paso de mensajes; el proceso de "binding" conecta las claves con las colas correspondientes.

Métodos Virtuales

  • Existen agrupaciones virtuales dentro de RabbitMQ que facilitan la gestión y organización de los recursos.

Integración con Spring Boot

Configuración Inicial

  • Para integrar RabbitMQ con Spring Boot, se debe añadir la dependencia correspondiente al proyecto, facilitando así el uso del protocolo AMQP.

Ejecución Local

  • Se puede ejecutar RabbitMQ localmente usando Docker. Se proporcionan comandos específicos para iniciar la imagen del contenedor correctamente.

Comandos Importantes

Configuración y Uso de RabbitMQ en Docker

Exposición de Puertos y Descarga de Imagen

  • Se expone un puerto para la conexión de la aplicación y otro para la interfaz web, utilizando una imagen de Docker específica que se descarga automáticamente si es la primera vez.

Acceso a la Interfaz Web

  • Una vez que la imagen está en ejecución, se puede acceder a la interfaz web a través del navegador usando el puerto 15672, donde se gestionan las colas.

Credenciales por Defecto

  • La configuración inicial ofrece un usuario y contraseña por defecto: "guest" como usuario y "guest" como contraseña para acceder a RabbitMQ.

Ejecución Práctica con Docker

  • Para iniciar RabbitMQ, se utiliza un comando específico en la terminal. Si ya se tiene descargada la imagen, el contenedor inicia rápidamente.

Acceso a RabbitMQ

  • Al acceder al puerto 15672, se solicita ingresar las credenciales. Una vez dentro, se observa que no hay colas disponibles inicialmente.

Configuración del Proyecto Spring Boot

  • En el proyecto Spring Boot creado, se revisan las dependencias necesarias. Se destaca que no es necesario ser un proyecto MVC para utilizar RabbitMQ.

Dependencias Esenciales

  • Las dependencias incluyen spring-boot-starter-amqp, lo cual permite realizar pruebas unitarias con RabbitMQ. El código fuente será compartido para su estudio.

Archivo de Configuración

  • Se menciona el archivo application.properties donde se configuran los parámetros necesarios para conectar con RabbitMQ en producción.

Parámetros de Conexión

  • Se especifica el host de RabbitMQ junto con los puertos utilizados (como el 5672), así como las credenciales necesarias para establecer comunicación entre aplicaciones.

Componentes Productor y Consumidor

  • Se explica que RabbitMQ consta de dos componentes principales: productor y consumidor. El enfoque actual es configurar un consumidor mediante anotaciones específicas en Spring Boot.

Implementación del Consumidor

¿Cómo crear y probar una cola en RabbitMQ?

Creación de la Cola

  • Se inicia el proceso de creación de una cola llamada "cola uno" dentro del sistema, utilizando la interfaz de archivos para configurarla adecuadamente.
  • La cola se confirma como creada y en ejecución, aunque inicialmente no hay mensajes en ella. Se planea enviar un mensaje para realizar pruebas.

Envío y Recepción de Mensajes

  • Al iniciar el proyecto, se establece una conexión con RabbitMQ. Se observa que se ha creado correctamente la conexión necesaria para operar.
  • Se utiliza la interfaz web de RabbitMQ para enviar un mensaje a la cola creada. El consumidor está preparado para recibir y procesar este mensaje.
  • Tras enviar el mensaje, se verifica que el consumidor lo recibe e imprime correctamente, confirmando así que el flujo de mensajes funciona.

Procesamiento Eficiente

  • El consumidor procesa los mensajes lentamente (cada cinco segundos), lo cual es crucial en arquitecturas de microservicios ya que permite manejar cargas sin sobrecargar el sistema.
  • Este enfoque evita caídas del servicio al permitir que los consumidores procesen los mensajes a su propio ritmo.

Configuración del Publicador

  • Se explora la configuración del publicador dentro del proyecto, asegurándose de que esté vinculado a la misma cola utilizada por los consumidores.
  • Se define un "binding" tipo "queue", garantizando que las colas estén correctamente conectadas dentro del contexto del proyecto.

Implementación del Servicio Publicador

  • El publicador inyecta un template Rabbit y configura cómo enviar mensajes a la cola especificada mediante métodos definidos previamente.
  • Es importante habilitar anotaciones específicas como @EnableRabbit para asegurar el correcto funcionamiento del publicador en Spring.

Pruebas Finales

  • Un componente adicional llamado "public ser" permite utilizar métodos desde cualquier clase para enviar mensajes a la cola específica creada anteriormente.
  • Se implementa un método denominado centroRabbit que envía un mensaje aleatorio a través del controlador diseñado específicamente para pruebas.

¿Cómo enviar objetos complejos en RabbitMQ?

Introducción a la mensajería con RabbitMQ

  • Se presenta un ejemplo de cómo se envían mensajes entre suscriptores, destacando que en la vida real estos procesos se separan en proyectos independientes.
  • Se menciona que los mensajes enviados son de tipo string, pero en aplicaciones reales se utilizan objetos más complejos, como instancias de clases (ej. clase Persona).

Envío de objetos complejos

  • Se discuten los cambios necesarios para enviar objetos más complejos en lugar de solo strings, enfatizando la importancia de serializar estos objetos.
  • Se introduce una nueva clase dentro del paquete que implementa la interfaz Serializable, lo cual es crucial para el envío correcto de datos.

Implementación y pruebas

  • El consumidor se ajusta para recibir un objeto Data en lugar de un string, permitiendo así el manejo de datos más estructurados.
  • Se realiza una prueba donde se envía un objeto Data completo al bloque de mensajería rápida, mostrando cómo se puede utilizar este método para pasar información más rica.

Resultados y conclusiones

  • Al realizar las pruebas, se confirma que ahora es posible enviar datos complejos correctamente; el mensaje enviado incluye tanto el objeto como su contenido.
Video description

RabbitMQ es un software de intercambio de mensajes de código abierto que funciona como un middleware de mensajería. Implementa el estándar Advanced Message Queuing Protocol (AMQP). Está licenciado bajo MPL y escrito en Erlang. Acá el código del video: https://github.com/yoandypv/spring-boot-rabbit-mq * Aprende más en nuestro blog: https://sacavix.com/ * Apóyanos en Patreon: https://www.patreon.com/sacavix_tech (Con tu apoyo en Patreon accedes a ventajas exclusivas como directos, preguntas y respuestas en el chat, respuestas a tus dudas y acceso a nuestro libro "Patrones para la implementación de una arquitectura basada en microservicios". En este vídeo aprenderás: * ¿Qué es RabbitMQ? * ¿Cúales son sus componentes? * Instalaremos RabbitMQ usando docker. * Crearemos una cola usando RabbitMQ. * Enviaremos un mensaje desde la consola de RabbitMQ. * Crearemos un Productor y un Consumidor usando Spring Boot. Espero te sea útil el vídeo. #rabbitmq, #eventdriven, #microservicios. #springboot