1. Información general
En este tutorial, exploraremos la comunicación basada en mensajes a través de AMQP utilizando el marco Spring AMQP. Primero, cubriremos algunos de los conceptos clave de la mensajería. Luego, pasaremos a un ejemplo práctico.
2. Comunicación basada en mensajes
La mensajería es una técnica para comunicarse entre aplicaciones. Se basa en el paso de mensajes asincrónico en lugar de en la arquitectura síncrona basada en respuesta a solicitudes. Los productores y consumidores de mensajes están desacoplados por una capa de mensajería intermedia conocida como agente de mensajes . Un intermediario de mensajes proporciona funciones como almacenamiento persistente de mensajes, filtrado de mensajes y transformación de mensajes.
En el caso de la mensajería entre aplicaciones escritas en Java, se suele utilizar la API JMS (Java Message Service). Para la interoperabilidad entre diferentes proveedores y plataformas, no podremos utilizar clientes y corredores JMS. Aquí es donde AMQP resulta útil .
3. AMQP: protocolo de cola de mensajes avanzado
AMQP es una especificación de cable estándar abierta para la comunicación de mensajes asíncrona. Proporciona una descripción de cómo se debe construir un mensaje.
3.1. En qué se diferencia Amqp de Jms
Dado que AMQP es un estándar de protocolo binario independiente de la plataforma, las bibliotecas se pueden escribir en diferentes lenguajes de programación y ejecutar en diferentes entornos.
No existe un bloqueo de protocolo basado en el proveedor, como es el caso cuando se migra de un intermediario JMS a otro. Para obtener más detalles, consulte JMS vs AMQP y Understanding AMQP. Algunos de los corredores de AMQP más utilizados son RabbitMQ , OpenAMQ y StormMQ.
3.2. Entidades AMQP
Brevemente, AMQP se compone de intercambios, colas y enlaces:
- Los intercambios son como oficinas de correos o buzones de correo y los clientes publican un mensaje en un intercambio AMQP. Hay cuatro tipos de intercambio integrados
- Intercambio directo: enruta los mensajes a una cola haciendo coincidir una clave de enrutamiento completa
- Fanout Exchange: enruta los mensajes a todas las colas vinculadas a él
- Intercambio de temas: enruta mensajes a varias colas haciendo coincidir una clave de enrutamiento con un patrón
- Intercambio de encabezados: enruta los mensajes según los encabezados de los mensajes
- Las colas están vinculadas a un intercambio mediante una clave de enrutamiento
- Los mensajes se envían a una centralita con una clave de ruta. El intercambio luego distribuye copias de los mensajes a las colas
Para obtener más detalles, consulte Conceptos de AMQP y topologías de enrutamiento.
3.3. Primavera AMQP
Spring AMQP consta de dos módulos: spring-amqp y spring-rabbit . Juntos, estos módulos proporcionan abstracciones para:
- Entidades AMQP: creamos entidades con las clases Message, Queue, Binding e Exchange
- Gestión de conexiones: nos conectamos a nuestro agente RabbitMQ mediante CachingConnectionFactory
- Publicación de mensajes: usamos RabbitTemplate para enviar mensajes
- Consumo de mensajes: usamos un @RabbitListener para leer mensajes de una cola
4. Configure un corredor Rabbitmq
Necesitamos un corredor de RabbitMQ disponible para conectarnos. La forma más sencilla de hacer esto es usando Docker para buscar y ejecutar una imagen de RabbitMQ para nosotros:
docker run -d -p 5672:5672 -p 15672:15672 --name my-rabbit rabbitmq:3-management
Exponemos el puerto 5672 para que nuestra aplicación pueda conectarse a RabbitMQ.
Y exponemos el puerto 15672 para que podamos ver lo que está haciendo nuestro agente RabbitMQ a través de la interfaz de usuario de administración: // localhost: 15672 o la API HTTP: //localhost:15672/api/index.html .
5. Creación de nuestra aplicación Spring Amqp
Entonces, ahora creemos nuestra aplicación para enviar y recibir un simple "¡Hola, mundo!" mensaje utilizando Spring AMQP.
5.1. Dependencias de Maven
Para agregar los módulos spring-amqp y spring-rabbit a nuestro proyecto, agregamos la dependencia spring-boot-starter-amqp a nuestro pom.xml :
org.springframework.boot spring-boot-starter-amqp 2.2.2.RELEASE
Podemos encontrar la última versión en Maven Central.
5.2. Conexión con nuestro corredor Rabbitmq
Vamos a utilizar la configuración automática de la primavera de arranque para crear nuestros ConnectionFactory , RabbitTemplate y RabbitAdmin granos . Como resultado, obtenemos una conexión con nuestro corredor RabbitMQ en el puerto 5672 usando el nombre de usuario y la contraseña predeterminados de "invitado". Entonces, solo anotamos nuestra aplicación con @SpringBootApplication :
@SpringBootApplication public class HelloWorldMessageApp { // ... }
5.3. Crea nuestra cola
Para crear nuestra cola, simplemente definimos un bean de tipo Cola . RabbitAdmin encontrará esto y lo vinculará al intercambio predeterminado con una clave de enrutamiento de "myQueue":
@Bean public Queue myQueue() { return new Queue("myQueue", false); }
Configuramos la cola para que no sea duradera para que la cola y cualquier mensaje en ella se eliminen cuando RabbitMQ se detenga. Sin embargo, tenga en cuenta que reiniciar nuestra aplicación no tendrá ningún efecto en la cola.
5.4. Envíe nuestro mensaje
Vamos a utilizar el RabbitTemplate para enviar nuestro “Hola, mundo!” mensaje:
rabbitTemplate.convertAndSend("myQueue", "Hello, world!");
5.5. Consume nuestro mensaje
Implementaremos un consumidor de mensajes anotando un método con @RabbitListener :
@RabbitListener(queues = "myQueue") public void listen(String in) { System.out.println("Message read from myQueue : " + in); }
6. Ejecución de nuestra aplicación
Primero, iniciamos el corredor RabbitMQ:
docker run -d -p 5672:5672 -p 15672:15672 --name my-rabbit rabbitmq:3-management
Luego, ejecutamos la aplicación de arranque de primavera ejecutando HelloWorldMessage.java , ejecutando el método main () :
mvn spring-boot:run -Dstart-class=com.baeldung.springamqp.simple.HelloWorldMessageApp
Mientras se ejecuta la aplicación veremos que:
- La aplicación envía un mensaje al intercambio predeterminado con "myQueue" como clave de enrutamiento
- Luego, la cola "myQueue" recibe el mensaje
- Finalmente, el método listen consume el mensaje de "myQueue" y lo imprime en la consola.
También podemos usar la página de administración de RabbitMQ en // localhost: 15672 para ver que nuestro mensaje ha sido enviado y consumido.
7. Conclusión
En este tutorial, cubrimos la arquitectura basada en mensajería sobre el protocolo AMQP utilizando Spring AMQP para la comunicación entre aplicaciones.
El código fuente completo y todos los fragmentos de código para este tutorial están disponibles en el proyecto GitHub.