Üzenetküldés a tavaszi AMQP-vel

1. Áttekintés

Ebben az oktatóanyagban az AMQP-n keresztüli üzenetalapú kommunikációt tárjuk fel a tavaszi AMQP keretrendszer használatával. Először kitérünk az üzenetküldés néhány kulcsfontosságú fogalmára. Ezután áttérünk egy gyakorlati példára.

2. Üzenetalapú kommunikáció

Az üzenetküldés az alkalmazások közötti kommunikáció technikája. Aszinkron üzenetátadásra támaszkodik a szinkron kérés válasz-alapú architektúra helyett. Az üzenetek előállítóit és fogyasztóit az üzenetközvetítő néven ismert közbenső üzenetküldési réteg választja el. Az üzenetközvetítő olyan szolgáltatásokat nyújt, mint az üzenetek tartós tárolása, az üzenetszűrés és az üzenetátalakítás.

Java-ban írt alkalmazások közötti üzenetküldés esetén általában a JMS (Java Message Service) API-t használják. A különböző gyártók és platformok közötti interoperabilitás érdekében nem tudjuk használni a JMS klienseit és brókereit. Itt jön jól az AMQP.

3. AMQP - Advanced Message Queuing Protocol

Az AMQP egy nyílt szabványos vezetékes specifikáció az aszinkron üzenetkommunikációhoz. Leírást ad arról, hogyan kell egy üzenetet felépíteni.

3.1. Miben különbözik az Amqp a JMS-től

Mivel az AMQP platform-semleges bináris protokoll-szabvány, a könyvtárak különböző programozási nyelveken írhatók, és különböző környezetekben futtathatók.

Nincs szállító alapú protokollzár, mint például az egyik JMS-közvetítőtől a másikig történő áttérés esetén. További részletek: JMS vs AMQP és Az AMQP megértése. Néhány széles körben használt AMQP bróker a RabbitMQ, OpenAMQ és StormMQ.

3.2. AMQP entitások

Röviden: az AMQP tőzsdékből, várólistákból és kötésekből áll:

  • Cserék olyanok, mint a postahivatalok vagy a postaládák, és az ügyfelek üzenetet tesznek közzé egy AMQP központban. Négy beépített cseretípus létezik
    • Közvetlen csere - Üzeneteket irányít egy sorba a teljes útválasztási kulcs összeegyeztetésével
    • Fanout Exchange - Üzeneteket irányít az összes hozzá kötött sorba
    • Témacsere - Üzeneteket továbbít több sorba úgy, hogy egy útválasztási kulcsot egy mintához illeszt
    • Fejlécek cseréje - Üzenetek továbbítása üzenetfejlécek alapján
  • Sorok útválasztókulcs segítségével kapcsolódnak egy központhoz
  • üzenetek útválasztó kulccsal egy központba küldik. A központ ezután az üzenetek másolatait sorokban terjeszti

További részletekért olvassa el az AMQP koncepciókat és az útválasztási topológiákat.

3.3. Tavaszi AMQP

A tavaszi AMQP két modult tartalmaz: tavasz-amqp és tavaszi nyúl. Ezek a modulok együtt absztrakciókat nyújtanak:

  • AMQP entitások - az Üzenet, várólista, kötés és csere osztályok

  • Kapcsolatkezelés - a RabbitMQ alkuszhoz kapcsolódunk a CachingConnectionFactory
  • Üzenetkiadás - a RabbitTemplate üzeneteket küldeni
  • Üzenetfogyasztás - a @RabbitListener üzeneteket olvasni egy sorból

4. Állítson be egy Rabbitmq Brokert

Szükségünk van egy RabbitMQ brókerre, amelyhez csatlakozhatunk. Ennek legegyszerűbb módja, ha a Docker segítségével lekérünk és futtatunk egy RabbitMQ képet:

docker futtatás -d -p 5672: 5672 -p 15672: 15672 - neve nyulam nyúlmq: 3-menedzsment

Kitesszük az 5672-es portot, hogy alkalmazásunk csatlakozni tudjon a RabbitMQ-hoz.

És kitesszük az 15672-es portot, hogy láthassuk, mit csinál a RabbitMQ brókerünk a kezelői felhasználói felületen keresztül: // localhost: 15672 vagy a HTTP API: //localhost:15672/api/index.html.

5. A tavaszi Amqp alkalmazásunk létrehozása

Tehát most hozzuk létre az alkalmazást egy egyszerű „Hello, világ!” Küldésére és fogadására. üzenetet a Spring AMQP használatával.

5.1. Maven-függőségek

A tavasz-amqp és tavaszi nyúl modulokat a projektünkhöz, hozzáadjuk a spring-boot-starter-amqp függőség a mi pom.xml:

  org.springframework.boot spring-boot-starter-amqp 2.2.2. KÖZLEMÉNY 

A legújabb verziót itt találjuk: Maven Central.

5.2. Csatlakozás a Rabbitmq brókerünkhöz

A Spring Boot automatikus konfigurációját használjuk a létrehozáshoz ConnectionFactory, RabbitTemplate, és RabbitAdmin bab. Ennek eredményeként kapcsolatot kapunk RabbitMQ brókerünkkel az 5672-es porton az alapértelmezett felhasználói név és jelszó felhasználásával. Tehát csak feljegyezzük alkalmazásunkat @SpringBootApplication:

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

5.3. Hozza létre a várólistánkat

A várólista létrehozása érdekében egyszerűen meghatározunk egy típusú babot Sor.RabbitAdmin megtalálja ezt és összekapcsolja az alapértelmezett cserével egy „myQueue” útválasztó kulccsal:

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

A várólistát nem tartósnak állítjuk be, így a RabbitMQ leállításakor a sor és a rajta lévő üzenetek eltávolításra kerülnek. Ne feledje azonban, hogy alkalmazásunk újraindítása nincs hatással a sorra.

5.4. Küldje el üzenetünket

Nézzük használja a RabbitTemplate küldeni a "Hello, világ!" üzenet:

rabbitTemplate.convertAndSend ("myQueue", "Hello, világ!");

5.5. Fogyassza az üzenetünket

Az üzenetfogyasztót úgy valósítjuk meg, hogy egy metódussal jelöljük a @RabbitListener:

@RabbitListener (queues = "myQueue") public void listen (String in) {System.out.println ("Üzenet olvasva a myQueue-ból:" + be); }

6. Alkalmazásunk futtatása

Először elindítjuk a RabbitMQ brókert:

docker futtatás -d -p 5672: 5672 -p 15672: 15672 - név nyúl nyúlmq: 3-menedzsment

Ezután futtatjuk a tavaszi rendszerindító alkalmazást HelloWorldMessage.java, végrehajtva a fő() módszer:

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

Amíg az alkalmazás fut, látni fogjuk, hogy:

  • Az alkalmazás üzenetet küld az alapértelmezett központnak, a „myQueue” mint útválasztási kulcs
  • Ezután a „myQueue” sor fogadja az üzenetet
  • Végül a hallgat metódus elfogyasztja a „myQueue” üzenetet, és kinyomtatja a konzolra

Használhatjuk a RabbitMQ kezelő oldalt is // localhost: 15672 hogy üzenetünket elküldték és elfogyasztották.

7. Következtetés

Ebben az oktatóanyagban az AMQP protokollon keresztüli üzenetküldés-alapú architektúrát ismertettük, az alkalmazások közötti kommunikációhoz a Spring AMQP-t használva.

Az oktatóanyag teljes forráskódja és összes kódrészlete elérhető a GitHub projektben.