Съобщения с Spring AMQP

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 брокер или чрез потребителския интерфейс за управление: // localhost: 15672, или чрез HTTP API: //localhost:15672/api/index.html .

5. Създаване на нашето пролетно приложение Amqp

И така, нека сега създадем нашето приложение, за да изпращаме и получаваме просто „Здравей, свят!“ съобщение с помощта на Spring AMQP.

5.1. Зависимости на Maven

За да добавим модулите spring-amqp и spring-rabbit към нашия проект, ние добавяме зависимостта spring-boot-starter-amqp към нашия pom.xml :

  org.springframework.boot spring-boot-starter-amqp 2.2.2.RELEASE  

Можем да намерим най-новата версия в Maven Central.

5.2. Свързване с нашия Rabbitmq брокер

Ще използваме автоматично конфигуриране Пролет Boot, за да се създаде нашите ConnectionFactory , RabbitTemplate и RabbitAdmin боб . В резултат на това получаваме връзка с нашия брокер RabbitMQ на порт 5672, използвайки потребителското име и паролата по подразбиране за „гост“. И така, ние просто анотираме приложението си с @SpringBootApplication :

@SpringBootApplication public class HelloWorldMessageApp { // ... }

5.3. Създайте нашата опашка

За да създадем нашата опашка, ние просто дефинираме боб от тип Queue . RabbitAdmin ще намери това и ще го обвърже с обмена по подразбиране с маршрутизиращ ключ на “myQueue”:

@Bean public Queue myQueue() { return new Queue("myQueue", false); }

Зададохме опашката да не е издръжлива, така че опашката и всички съобщения в нея ще бъдат премахнати, когато RabbitMQ бъде спрян. Имайте предвид обаче, че рестартирането на нашето приложение няма да има ефект върху опашката.

5.4. Изпратете нашето съобщение

Нека използваме RabbitTemplate, за да изпратим нашето „Здравей, свят!“ съобщение:

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.baeldung.springamqp.simple.HelloWorldMessageApp

Докато приложението работи, ще видим, че:

  • Приложението изпраща съобщение до централата по подразбиране с “myQueue” като ключ за маршрутизиране
  • След това опашката “myQueue” получава съобщението
  • И накрая, методът за слушане консумира съобщението от “myQueue” и го отпечатва на конзолата

Също така можем да използваме страницата за управление на RabbitMQ на // localhost: 15672, за да видим, че нашето съобщение е изпратено и консумирано.

7. Заключение

В този урок разгледахме архитектура, базирана на съобщения, по протокол AMQP, използвайки Spring AMQP за комуникация между приложения.

Пълният изходен код и всички кодови фрагменти за този урок са достъпни в проекта GitHub.