Перейти к основному содержимому

Обмен сообщениями с помощью Spring AMQP

· 5 мин. чтения

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 .