Razmjena poruka s proljetnim AMQP-om

1. Pregled

U ovom uputstvu istražit ćemo komunikaciju zasnovanu na porukama putem AMQP-a pomoću proljetnog AMQP okvira. Prvo ćemo pokriti neke od ključnih pojmova razmjene poruka. Zatim ćemo prijeći na praktični primjer.

2. Komunikacija zasnovana na poruci

Poruke su tehnika za komunikaciju između aplikacija. Oslanja se na asinkrono prosljeđivanje poruka umjesto na sinkronu arhitekturu koja se temelji na odgovoru na zahtjev. Proizvođači i potrošači poruka razdvojeni su srednjim slojem za razmjenu poruka poznatim kao posrednik poruka. Posrednik poruka pruža značajke poput trajnog pohranjivanja poruka, filtriranja poruka i transformacije poruka.

U slučaju razmjene poruka između aplikacija napisanih na Javi, obično se koristi JMS (Java Message Service) API. Radi interoperabilnosti između različitih dobavljača i platformi, nećemo moći koristiti JMS klijente i brokere. Tu AMQP dobro dolazi.

3. AMQP - Napredni protokol za čekanje poruka

AMQP je otvorena standardna specifikacija žice za asinkronu komunikaciju porukama. Sadrži opis načina na koji poruku treba konstruirati.

3.1. Po čemu se Amqp razlikuje od Jms-a

Budući da je AMQP standard binarnog protokola neutralan za platformu, knjižnice se mogu pisati na različitim programskim jezicima i izvoditi u različitim okruženjima.

Ne postoji zaključavanje protokola zasnovano na dobavljaču, kao što je slučaj prilikom prelaska s jednog JMS posrednika na drugog. Za više detalja pogledajte JMS vs AMQP i Razumijevanje AMQP-a. Neki od široko korištenih AMQP brokera su RabbitMQ, OpenAMQ i StormMQ.

3.2. AMQP entiteti

Ukratko, AMQP se sastoji od razmjena, redova čekanja i veza:

  • Razmjene su poput poštanskih ureda ili poštanskih sandučića, a klijenti objavljuju poruku na AMQP centrali. Postoje četiri ugrađena tipa razmjene
    • Izravna razmjena - usmjerava poruke u red uspoređivanjem kompletnog ključa usmjeravanja
    • Fanout Exchange - usmjerava poruke u sve redove koji su na nju povezani
    • Razmjena tema - usmjerava poruke u više redova usklađivanjem ključa usmjeravanja s uzorkom
    • Razmjena zaglavlja - usmjerava poruke na temelju zaglavlja poruka
  • Redovi su vezani za razmjenu pomoću usmjerivačkog ključa
  • Poruke šalju se na razmjenu s ključem usmjeravanja. Zatim razmjena distribuira kopije poruka u redove čekanja

Za više detalja pogledajte AMQP koncepti i topologije usmjeravanja.

3.3. Proljetni AMQP

Opruga AMQP sastoji se od dva modula: proljeće-amqp i proljeće-zec. Ovi moduli zajedno pružaju apstrakcije za:

  • AMQP entiteti - mi stvaramo entitete s Poruka, red čekanja, povezivanje i razmjena razreda

  • Upravljanje vezama - povezujemo se s našim RabbitMQ posrednikom pomoću a CachingConnectionFactory
  • Objavljivanje poruka - koristimo a RabbitTemplate za slanje poruka
  • Potrošnja poruka - koristimo a @RabbitListener za čitanje poruka iz reda

4. Postavljanje Rabbitmq brokera

Potreban nam je RabbitMQ posrednik koji nam je dostupan za povezivanje. Najjednostavniji način za to je korištenje Dockera za dohvaćanje i pokretanje slike RabbitMQ za nas:

docker run -d -p 5672: 5672 -p 15672: 15672 --name my-rabbit rabbitmq: 3-management

Izlažemo port 5672 kako bi se naša aplikacija mogla povezati s RabbitMQ.

Izlažemo port 15672 kako bismo mogli vidjeti što naš RabbitMQ broker radi putem bilo kojeg korisničkog sučelja za upravljanje: // localhost: 15672 ili HTTP API: //localhost:15672/api/index.html.

5. Izrada naše proljetne aplikacije Amqp

Dakle, sada izradimo našu aplikaciju za slanje i primanje jednostavnog "Zdravo, svijete!" poruku pomoću Spring AMQP-a.

5.1. Ovisnosti Mavena

Da biste dodali proljeće-amqp i proljeće-zec modula našem projektu, dodajemo opruga-čizma-starter-amqp ovisnost o našoj pom.xml:

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

Najnoviju verziju možemo pronaći u Maven Central.

5.2. Povezivanje s našim Rabbitmq posrednikom

Za izradu našeg poslužit ćemo se automatskom konfiguracijom Spring Boota ConnectionFactory, RabbitTemplate, i RabbitAdmin grah. Kao rezultat, dobivamo vezu s našim posrednikom RabbitMQ na portu 5672 koristeći zadano korisničko ime i lozinku "gost". Dakle, samo bilježimo našu prijavu s @SpringBootApplication:

@SpringBootApplication javna klasa HelloWorldMessageApp {// ...}

5.3. Stvorite naš red

Da bismo stvorili naš red, jednostavno definiramo grah tipa Red.RabbitAdmin pronaći će ovo i povezati ga sa zadanom razmjenom s ključem usmjeravanja "myQueue":

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

Red smo postavili tako da nije trajan, tako da će se red i sve poruke na njemu ukloniti kad se zaustavi RabbitMQ. Međutim, imajte na umu da ponovno pokretanje naše aplikacije neće imati utjecaja na red čekanja.

5.4. Pošaljite našu poruku

Idemo koristiti RabbitTemplate poslati naš "Zdravo, svijete!" poruka:

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

5.5. Konzumirajte našu poruku

Potrošača poruka implementirat ćemo označavanjem metode s @RabbitListener:

@RabbitListener (queues = "myQueue") javno void preslušavanje (niz u) {System.out.println ("Poruka pročitana iz myQueue:" + in); }

6. Pokretanje naše aplikacije

Prvo pokrećemo RabbitMQ brokera:

docker run -d -p 5672: 5672 -p 15672: 15672 --name my-rabbit rabbitmq: 3-management

Zatim pokrećemo proljetni program za pokretanje HelloWorldMessage.java, izvršavajući glavni() metoda:

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

Dok je aplikacija pokrenuta, vidjet ćemo da:

  • Aplikacija šalje poruku zadanoj razmjeni s "myQueue" kao ključem usmjeravanja
  • Zatim, red "myQueue" prima poruku
  • Napokon, slušati metoda troši poruku iz "myQueue" i ispisuje je na konzoli

Također možemo koristiti stranicu za upravljanje RabbitMQ na // localhost: 15672 kako bismo vidjeli da je naša poruka poslana i potrošena.

7. Zaključak

U ovom smo tutorijalu pokrili arhitekturu zasnovanu na porukama putem protokola AMQP koristeći Spring AMQP za komunikaciju između aplikacija.

Kompletni izvorni kôd i svi isječci koda za ovu lekciju dostupni su na projektu GitHub.


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