Posielanie správ s jarným AMQP

1. Prehľad

V tomto tutoriáli preskúmame komunikáciu založenú na správach cez AMQP pomocou jarného rámca AMQP. Najskôr si vysvetlíme niektoré kľúčové koncepty zasielania správ. Potom prejdeme k praktickému príkladu.

2. Komunikácia založená na správach

Správy sú technikou komunikácie medzi aplikáciami. Spolieha sa na asynchrónne odovzdávanie správ namiesto na synchrónnu architektúru založenú na reakcii na požiadavku. Producenti a spotrebitelia správ sú oddelení medziľahlou vrstvou správ známou ako sprostredkovateľ správ. Sprostredkovateľ správ poskytuje funkcie, ako je trvalé ukladanie správ, filtrovanie správ a transformácia správ.

V prípade zasielania správ medzi aplikáciami napísanými v prostredí Java sa bežne používa rozhranie API JMS (Java Message Service). Z dôvodu interoperability medzi rôznymi dodávateľmi a platformami nebudeme môcť používať klientov a sprostredkovateľov JMS. To je miesto, kde sa AMQP hodí.

3. AMQP - Advanced Protocol Queuing Protocol

AMQP je špecifikácia otvoreného štandardného drôtu pre komunikáciu asynchrónnych správ. Poskytuje popis toho, ako by sa mala správa vytvoriť.

3.1. Ako sa Amqp líši od Jms

Pretože AMQP je platformovo neutrálny štandard binárneho protokolu, môžu byť knižnice napísané v rôznych programovacích jazykoch a spustené v rôznych prostrediach.

Neexistuje žiadny blokovaný protokol založený na dodávateľoch, ako je to v prípade migrácie z jedného sprostredkovateľa JMS na druhého. Viac podrobností nájdete v publikáciách JMS vs AMQP a Understanding AMQP. Niektorí zo široko používaných sprostredkovateľov AMQP sú RabbitMQ, OpenAMQ a StormMQ.

3.2. Entity AMQP

Stručne povedané, AMQP sa skladá z výmeny, fronty a väzby:

  • Výmeny sú ako pošty alebo poštové schránky a klienti zverejňujú správu na burze AMQP. Existujú štyri vstavané typy ústrední
    • Priama výmena - smeruje správy do frontu priradením úplného smerovacieho kľúča
    • Fanout Exchange - smeruje správy do všetkých s nimi spojených frontov
    • Výmena tém - smeruje správy do viacerých radov priraďovaním smerovacieho kľúča k vzoru
    • Výmena hlavičiek - smeruje správy na základe hlavičiek správ
  • Fronty sú viazaní na burzu pomocou smerovacieho kľúča
  • Správy sa zasielajú na burzu smerovacím kľúčom. Burza potom distribuuje kópie správ do radov

Viac podrobností nájdete v AMQP Koncepty a topológie topológie.

3.3. Jarný AMQP

Spring AMQP sa skladá z dvoch modulov: jar-amqp a jar-zajac. Tieto moduly spoločne poskytujú abstrakcie pre:

  • Entity AMQP - entity vytvárame pomocou Správy, fronty, väzby a výmeny triedy

  • Správa pripojení - k nášmu brokerovi RabbitMQ sa pripájame pomocou a CachingConnectionFactory
  • Zverejňovanie správ - používame a KrálikŠablóna na posielanie správ
  • Spotreba správ - používame a @RabbitListener na čítanie správ z frontu

4. Nastavte Rabbitmq Broker

Potrebujeme sprostredkovateľa RabbitMQ, ktorý je nám k dispozícii na pripojenie. Najjednoduchší spôsob, ako to urobiť, je použitie programu Docker na načítanie a spustenie obrazu RabbitMQ pre nás:

docker run -d -p 5672: 5672 -p 15672: 15672 - meno môj-králik rabbitmq: 3-management

Vystavujeme port 5672, aby sa naša aplikácia mohla pripojiť k RabbitMQ.

A vystavujeme port 15672, aby sme mohli vidieť, čo náš sprostredkovateľ RabbitMQ robí, buď prostredníctvom používateľského rozhrania pre správu: // localhost: 15672 alebo HTTP API: //localhost:15672/api/index.html.

5. Vytvorenie našej aplikácie Spring Amqp

Poďme si teda vytvoriť našu aplikáciu na odosielanie a prijímanie jednoduchých správ „Hello, world!“ správu pomocou Spring AMQP.

5.1. Maven závislosti

Za účelom pridania jar-amqp a jar-zajac moduly do nášho projektu, pridáme spring-boot-starter-amqp závislosť na našom pom.xml:

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

Najnovšiu verziu nájdeme v Maven Central.

5.2. Pripojenie k nášmu sprostredkovateľovi Rabbitmq

Na vytvorenie našej použijeme automatickú konfiguráciu Spring Boot ConnectionFactory, KrálikŠablónaa RabbitAdmin fazuľa. Vo výsledku získame spojenie s našim sprostredkovateľom RabbitMQ na porte 5672 pomocou predvoleného používateľského mena a hesla „guest“. Našu aplikáciu teda iba anotujeme @SpringBootApplication:

@SpringBootApplication verejná trieda HelloWorldMessageApp {// ...}

5.3. Vytvorte si náš front

Aby sme vytvorili náš front, jednoducho definujeme fazuľu typu Fronta.RabbitAdmin toto nájde a naviaže ho na predvolenú výmenu pomocou smerovacieho kľúča „myQueue“:

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

Frontu sme nastavili ako nestálu, aby sa po zastavení RabbitMQ fronta a všetky správy v nej odstránili. Upozorňujeme však, že reštartovanie našej aplikácie nebude mať na front žiadny vplyv.

5.4. Pošlite našu správu

Poďme Použi KrálikŠablóna poslať náš „Ahoj, svet!“ správa:

rabbitTemplate.convertAndSend ("myQueue", "Hello, world!");

5.5. Konzumujte naše posolstvo

Spotrebiteľa správy implementujeme anotáciou metódy pomocou @RabbitListener:

@RabbitListener (queues = "myQueue") public void listen (String in) {System.out.println ("Správa načítaná z myQueue:" + in); }

6. Spustenie našej aplikácie

Najskôr spustíme sprostredkovateľa RabbitMQ:

docker run -d -p 5672: 5672 -p 15672: 15672 - meno môj-králik rabbitmq: 3-management

Potom spustíme jarnú bootovaciu aplikáciu HelloWorldMessage.java, vykonávajúci hlavný() metóda:

mvn spring-boot: run -Dstart-class = com.baeldung.springamqp.simple.HelloWorldMessageApp

Keď je aplikácia spustená, uvidíme, že:

  • Aplikácia odošle správu na predvolenú ústredňu s smerovacím kľúčom „myQueue“
  • Potom frontu „myQueue“ prijme správa
  • Nakoniec počúvaj metóda spotrebuje správu z „myQueue“ a vytlačí ju na konzolu

Môžeme tiež použiť stránku správy RabbitMQ na adrese // localhost: 15672 aby sme zistili, že naša správa bola odoslaná a vyčerpaná.

7. Záver

V tomto tutoriáli sme sa venovali architektúre založenej na zasielaní správ cez protokol AMQP pomocou Spring AMQP na komunikáciu medzi aplikáciami.

Kompletný zdrojový kód a všetky útržky kódu pre tento tutoriál sú k dispozícii v projekte GitHub.


$config[zx-auto] not found$config[zx-overlay] not found