Beskeder med Spring AMQP
1. Oversigt
I denne vejledning udforsker vi meddelelsesbaseret kommunikation over AMQP ved hjælp af Spring AMQP framework. Først dækker vi nogle af nøglebegreberne i messaging. Derefter går vi videre til et praktisk eksempel.
2. Meddelelsesbaseret kommunikation
Messaging er en teknik til kommunikation mellem applikationer. Den er afhængig af asynkron meddelelsesoverføring i stedet for synkron anmodningsresponsbaseret arkitektur. Producenter og forbrugere af meddelelser afkobles af et mellemliggende beskedlag kaldet en meddelelsesmægler. En meddelelsesmægler giver funktioner som vedvarende lagring af meddelelser, meddelelsesfiltrering og meddelelsestransformation.
I tilfælde af beskeder mellem applikationer skrevet i Java bruges JMS (Java Message Service) API ofte. For interoperabilitet mellem forskellige leverandører og platforme kan vi ikke bruge JMS-klienter og -mæglere. Det er her, AMQP er praktisk.
3. AMQP - Advanced Message Queuing Protocol
AMQP er en åben standard trådspecifikation til asynkron meddelelseskommunikation. Det giver en beskrivelse af, hvordan en besked skal konstrueres.
3.1. Hvordan Amqp er forskellig fra Jms
Da AMQP er en platformneutral binær protokolstandard, kan biblioteker skrives på forskellige programmeringssprog og køre i forskellige miljøer.
Der er ingen leverandørbaseret protokollås, som det er tilfældet ved migrering fra en JMS-mægler til en anden. For flere detaljer henvises til JMS vs AMQP og Understanding AMQP. Nogle af de meget anvendte AMQP-mæglere er RabbitMQ, OpenAMQ og StormMQ.
3.2. AMQP-enheder
Kort fortalt består AMQP af udvekslinger, køer og bindinger:
- Udvekslinger er som posthuse eller postkasser, og klienter offentliggør en besked til en AMQP-børs. Der er fire indbyggede udvekslingstyper
- Direkte udveksling - Router meddelelser til en kø ved at matche en komplet routingnøgle
- Fanout Exchange - Ruter meddelelser til alle køer, der er bundet til det
- Emneudveksling - Ruter meddelelser til flere køer ved at matche en routingnøgle til et mønster
- Headers Exchange - Router meddelelser baseret på beskedoverskrifter
- Køer er bundet til en udveksling ved hjælp af en routingnøgle
- Beskeder sendes til en central med en routingsnøgle. Børsen distribuerer derefter kopier af beskeder til køer
For flere detaljer, se AMQP Concepts and Routing Topologies.
3.3. Forår AMQP
Spring AMQP består af to moduler: forår-amqp og forårskanin. Tilsammen giver disse moduler abstraktioner til:
- AMQP-enheder - vi opretter enheder med Besked, kø, binding og udveksling klasser
- Forbindelsesadministration - vi opretter forbindelse til vores RabbitMQ-mægler ved hjælp af en CachingConnectionFactory
- Udgivelse af meddelelser - vi bruger en RabbitTemplate for at sende beskeder
- Beskedforbrug - vi bruger en @RabbitListener for at læse beskeder fra en kø
4. Opsæt en Rabbitmq-mægler
Vi har brug for en RabbitMQ-mægler, som vi kan oprette forbindelse til. Den enkleste måde at gøre dette på er ved at bruge Docker til at hente og køre et RabbitMQ-billede til os:
docker run -d -p 5672: 5672 -p 15672: 15672 - navn my-rabbit rabbitmq: 3-management
Vi udsætter port 5672, så vores applikation kan oprette forbindelse til RabbitMQ.
Og vi udsætter port 15672, så vi kan se, hvad vores RabbitMQ-mægler gør via enten administrationsgrænsefladen: // localhost: 15672 eller HTTP API: //localhost:15672/api/index.html.
5. Oprettelse af vores Spring Amqp-applikation
Så lad os nu oprette vores ansøgning om at sende og modtage et simpelt “Hej verden!” besked ved hjælp af Spring AMQP.
5.1. Maven afhængigheder
For at tilføje forår-amqp og forårskanin moduler til vores projekt, tilføjer vi spring-boot-starter-amqp afhængighed af vores pom.xml:
org.springframework.boot spring-boot-starter-amqp 2.2.2.RELEASE
Vi kan finde den nyeste version på Maven Central.
5.2. Opretter forbindelse til vores Rabbitmq-mægler
Vi bruger Spring Boot's automatiske konfiguration til at oprette vores ConnectionFactory, RabbitTemplateog RabbitAdmin bønner. Som et resultat får vi forbindelse til vores RabbitMQ-mægler på port 5672 ved hjælp af standardbrugernavnet og adgangskoden til "gæst". Så vi kommenterer bare vores ansøgning med @SpringBootApplication:
@SpringBootApplication offentlig klasse HelloWorldMessageApp {// ...}
5.3. Opret vores kø
For at oprette vores kø definerer vi simpelthen en bønne af typen Kø.RabbitAdmin finder dette og binder det til standardudvekslingen med en routingsnøgle på “myQueue”:
@Bean offentlig kø myQueue () {returner ny kø ("myQueue", falsk); }
Vi indstiller køen til ikke at være holdbar, så køen og eventuelle meddelelser på den fjernes, når RabbitMQ stoppes. Bemærk dog, at genstart af vores applikation ikke har nogen indvirkning på køen.
5.4. Send vores besked
Lad os brug RabbitTemplate at sende vores "Hej verden!" besked:
rabbitTemplate.convertAndSend ("myQueue", "Hej verden!");
5.5. Forbruge vores budskab
Vi implementerer en beskedforbruger ved at kommentere en metode med @RabbitListener:
@RabbitListener (køer = "myQueue") offentlig ugyldig lytning (String in) {System.out.println ("Besked læst fra myQueue:" + in); }
6. Kørsel af vores ansøgning
Først starter vi RabbitMQ-mægleren:
docker run -d -p 5672: 5672 -p 15672: 15672 - navn my-rabbit rabbitmq: 3-management
Derefter kører vi foråret boot-applikationen ved at køre HelloWorldMessage.java, udfører hoved () metode:
mvn spring-boot: run -Dstart-class = com.baeldung.springamqp.simple.HelloWorldMessageApp
Mens applikationen kører, vil vi se, at:
- Applikationen sender en besked til standardudvekslingen med “myQueue” som routingnøgle
- Derefter modtager køen “myQueue” beskeden
- Endelig blev Lyt metode forbruger beskeden fra “myQueue” og udskriver den på konsollen
Vi kan også bruge RabbitMQ-styringssiden på // localhost: 15672 for at se, at vores besked er sendt og fortæret.
7. Konklusion
I denne vejledning dækkede vi meddelelsesbaseret arkitektur over AMQP-protokol ved hjælp af Spring AMQP til kommunikation mellem applikationer.
Den komplette kildekode og alle kodestykker til denne tutorial er tilgængelige på GitHub-projektet.