1. Обзор
В этом руководстве мы рассмотрим обмен сообщениями через AMQP с использованием платформы Spring AMQP. Сначала мы рассмотрим некоторые ключевые концепции обмена сообщениями. Затем мы перейдем к практическому примеру.
2. Коммуникация на основе сообщений ``
Обмен сообщениями — это метод обмена данными между приложениями. Он основан на асинхронной передаче сообщений вместо архитектуры, основанной на синхронном запросе и ответе. Производители и потребители сообщений разделены промежуточным уровнем обмена сообщениями, известным как брокер сообщений . Брокер сообщений предоставляет такие функции, как постоянное хранение сообщений, фильтрация сообщений и преобразование сообщений.
В случае обмена сообщениями между приложениями, написанными на Java, обычно используется API JMS (Java Message Service). Для обеспечения взаимодействия между различными поставщиками и платформами мы не сможем использовать клиенты и брокеры JMS. Вот где AMQP пригодится .
3. AMQP — расширенный протокол очереди сообщений ``
AMQP — это открытый стандарт проводной спецификации для асинхронной передачи сообщений. Он содержит описание того, как должно быть построено сообщение.
3.1. Чем Amqp отличается от Jms
Поскольку AMQP является стандартом двоичного протокола, не зависящим от платформы, библиотеки могут быть написаны на разных языках программирования и работать в разных средах.
Нет привязки к протоколу поставщика, как в случае миграции с одного брокера JMS на другой. Дополнительные сведения см. в разделах JMS и AMQP и Общие сведения о AMQP . Некоторые из широко используемых брокеров AMQP — это RabbitMQ ,
OpenAMQ и StormMQ.
3.2. Объекты AMQP ``
Вкратце, AMQP состоит из бирж, очередей и привязок:
Обмены
похожи на почтовые отделения или почтовые ящики, и клиенты публикуют сообщения на обмене AMQP. Есть четыре встроенных типа обменаПрямой обмен — направляет сообщения в очередь, сопоставляя полный ключ маршрутизации.
Fanout Exchange — направляет сообщения во все связанные с ним очереди.
Тематический обмен — направляет сообщения в несколько очередей, сопоставляя ключ маршрутизации с шаблоном.
Обмен заголовками — маршрутизация сообщений на основе заголовков сообщений.
Очереди
привязаны к бирже с помощью ключа маршрутизацииСообщения
отправляются на биржу с ключом маршрутизации. Затем биржа распределяет копии сообщений по очередям.
Дополнительные сведения см. в разделе Концепции AMQP и топологии маршрутизации.
3.3. Весенний AMQP
Spring AMQP состоит из двух модулей: spring-amqp
и spring-rabbit
. Вместе эти модули обеспечивают абстракции для:
- Сущности AMQP — мы создаем сущности с классами
Message, Queue, Binding и Exchange .
`` - Управление соединением — мы подключаемся к нашему брокеру RabbitMQ с помощью
CachingConnectionFactory.
- Публикация сообщений — мы используем
RabbitTemplate
для отправки сообщений - Потребление сообщений — мы используем
@RabbitListener
для чтения сообщений из очереди.
4. Настройте брокера Rabbitmq
Нам нужен брокер RabbitMQ, доступный для подключения. Самый простой способ сделать это — использовать Docker для получения и запуска образа RabbitMQ для нас:
docker run -d -p 5672:5672 -p 15672:15672 --name my-rabbit rabbitmq:3-management
Мы открываем порт 5672, чтобы наше приложение могло подключаться к RabbitMQ.
И мы открываем порт 15672, чтобы мы могли видеть, что делает наш брокер RabbitMQ, либо через пользовательский интерфейс управления: http://localhost:15672,
либо через HTTP API: http://localhost:15672/api/index.html
.
5. Создание нашего приложения Spring Amqp
Итак, теперь давайте создадим наше приложение для отправки и получения простого «Hello, world!» сообщение с помощью Spring AMQP.
5.1. Зависимости Maven
Чтобы добавить модули spring-amqp
и spring-rabbit
в наш проект, мы добавляем зависимость spring-boot-starter-amqp
в наш pom.xml
:
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
<version>2.2.2.RELEASE</version>
</dependency>
</dependencies>
Мы можем найти последнюю версию в Maven Central .
5.2. Подключение к нашему брокеру Rabbitmq
Мы будем использовать автоматическую настройку Spring Boot для создания компонентов ConnectionFactory
, RabbitTemplate
и RabbitAdmin
. В результате мы получаем подключение к нашему брокеру RabbitMQ на порту 5672, используя имя пользователя и пароль по умолчанию «гость». Итак, мы просто аннотируем наше приложение @SpringBootApplication
:
@SpringBootApplication
public class HelloWorldMessageApp {
// ...
}
5.3. Создайте нашу очередь
Чтобы создать нашу очередь, мы просто определяем bean-компонент типа Queue
. RabbitAdmin
найдет это и привяжет к обмену по умолчанию с ключом маршрутизации «myQueue»:
@Bean
public Queue myQueue() {
return new Queue("myQueue", false);
}
Мы устанавливаем очередь как временную, чтобы очередь и любые сообщения в ней удалялись при остановке RabbitMQ. Обратите внимание, однако, что перезапуск нашего приложения не повлияет на очередь.
5.4. Отправить наше сообщение
Давайте используем RabbitTemplate
для отправки нашего «Hello, world!» сообщение:
rabbitTemplate.convertAndSend("myQueue", "Hello, world!");
5.5. Потребляйте наше сообщение
Мы реализуем потребителя сообщений, аннотируя метод с помощью @RabbitListener
:
@RabbitListener(queues = "myQueue")
public void listen(String in) {
System.out.println("Message read from myQueue : " + in);
}
6. Запуск нашего приложения
Сначала мы запускаем брокера RabbitMQ:
docker run -d -p 5672:5672 -p 15672:15672 --name my-rabbit rabbitmq:3-management
Затем мы запускаем приложение весенней загрузки, запустив HelloWorldMessage.java
и выполнив метод main()
:
mvn spring-boot:run -Dstart-class=com.foreach.springamqp.simple.HelloWorldMessageApp
Во время работы приложения мы увидим, что:
- Приложение отправляет сообщение на обмен по умолчанию с «myQueue» в качестве ключа маршрутизации.
- Затем очередь «myQueue» получает сообщение
- Наконец, метод
listen
получает сообщение из «myQueue» и выводит его на консоль.
Мы также можем использовать страницу управления RabbitMQ по адресу http://localhost:15672
, чтобы увидеть, что наше сообщение было отправлено и использовано.
7. Заключение
В этом руководстве мы рассмотрели архитектуру на основе обмена сообщениями по протоколу AMQP с использованием Spring AMQP для связи между приложениями.
Полный исходный код и все фрагменты кода для этого руководства доступны в проекте GitHub .