Permesejan dengan Spring AMQP

1. Gambaran keseluruhan

Dalam tutorial ini, kita akan meneroka komunikasi berasaskan mesej melalui AMQP menggunakan rangka kerja Spring AMQP. Pertama, kita akan merangkumi beberapa konsep utama pemesejan. Kemudian, kita akan beralih kepada contoh praktikal.

2. Komunikasi Berasaskan Mesej

Pemesejan adalah teknik untuk berkomunikasi antara aplikasi. Ia bergantung pada penyampaian mesej tidak segerak dan bukannya seni bina berdasarkan permintaan permintaan segerak. Pengeluar dan pengguna mesej dipisahkan oleh lapisan pesanan antara yang dikenali sebagai broker mesej . Broker mesej menyediakan ciri seperti penyimpanan mesej berterusan, penyaringan mesej, dan transformasi mesej.

Dalam hal pemesejan antara aplikasi yang ditulis di Java, API JMS (Java Message Service) biasanya digunakan. Untuk interoperabiliti antara vendor dan platform yang berbeza, kami tidak akan dapat menggunakan klien dan broker JMS. Di sinilah AMQP sangat berguna .

3. AMQP - Protokol Antrian Mesej Lanjutan

AMQP adalah spesifikasi wayar standard terbuka untuk komunikasi mesej tidak segerak. Ini memberikan penerangan tentang bagaimana mesej harus dibina.

3.1. Bagaimana Amqp Berbeza dengan Jms

Oleh kerana AMQP adalah standard protokol binari berkecuali platform, perpustakaan boleh ditulis dalam bahasa pengaturcaraan yang berbeza, dan dijalankan pada persekitaran yang berbeza.

Tidak ada penguncian protokol berasaskan vendor, seperti yang berlaku ketika melakukan migrasi dari satu broker JMS ke broker lain. Untuk keterangan lebih lanjut rujuk JMS vs AMQP dan Memahami AMQP. Beberapa broker AMQP yang banyak digunakan adalah RabbitMQ , OpenAMQ, dan StormMQ.

3.2. Entiti AMQP

Secara ringkas, AMQP terdiri dari Pertukaran, Antrean, dan Ikatan:

  • Pertukaran adalah seperti pejabat pos atau peti mel dan pelanggan menerbitkan mesej ke pertukaran AMQP. Terdapat empat jenis pertukaran terbina dalam
    • Pertukaran Langsung - Menghala mesej ke barisan dengan memadankan kunci penghalaan yang lengkap
    • Fanout Exchange - Menghala mesej ke semua barisan yang terikat dengannya
    • Pertukaran Topik - Merutekan mesej ke beberapa barisan dengan memadankan kunci penghala ke corak
    • Pertukaran Header - Mengarahkan mesej berdasarkan tajuk mesej
  • Antrian diikat ke pertukaran menggunakan kunci routing
  • Mesej dihantar ke pertukaran dengan kunci penghala. Pertukaran kemudian menyebarkan salinan mesej ke barisan

Untuk maklumat lebih lanjut, lihat Konsep AMQP dan Topologi Laluan.

3.3. AMQP musim bunga

Spring AMQP merangkumi dua modul: spring-amqp dan spring-rabbit . Bersama-sama, modul ini memberikan abstraksi untuk:

  • Entiti AMQP - kita mewujudkan entiti dengan mesej, Queue, mengikat dan Bursa kelas

  • Pengurusan Sambungan - kami berhubung dengan broker RabbitMQ kami dengan menggunakan CachingConnectionFactory
  • Penerbitan Mesej - kami menggunakan RabbitTemplate untuk menghantar mesej
  • Penggunaan Mesej - kami menggunakan @RabbitListener untuk membaca mesej dari barisan

4. Sediakan Broker Rabbitmq

Kami memerlukan broker RabbitMQ yang tersedia untuk kami sambungkan. Cara termudah untuk melakukannya adalah dengan menggunakan Docker untuk mengambil dan menjalankan gambar RabbitMQ untuk kami:

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

Kami mendedahkan port 5672 sehingga aplikasi kami dapat menyambung ke RabbitMQ.

Dan, kami memaparkan port 15672 sehingga kami dapat melihat apa yang dilakukan oleh broker RabbitMQ kami melalui UI pengurusan: // localhost: 15672 atau HTTP API: //localhost:15672/api/index.html .

5. Membuat Aplikasi Spring Amqp Kami

Jadi, sekarang mari buat aplikasi kami untuk menghantar dan menerima "Hello, world!" mesej dengan menggunakan Spring AMQP.

5.1. Ketergantungan Maven

Untuk menambahkan modul spring-amqp dan spring-rabbit ke projek kami, kami menambahkan pergantungan spring-boot-starter-amqp ke pom.xml kami :

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

Kami boleh mendapatkan versi terbaru di Maven Central.

5.2. Menyambung ke Broker Rabbitmq Kami

Kami akan menggunakan konfigurasi automatik Spring Boot untuk membuat kacang ConnectionFactory , RabbitTemplate , dan RabbitAdmin kami . Akibatnya, kami mendapat sambungan ke broker RabbitMQ kami di port 5672 menggunakan nama pengguna dan kata laluan lalai "tamu". Oleh itu, kami hanya memberi penjelasan mengenai aplikasi kami dengan @SpringBootApplication :

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

5.3. Buat Baris Kami

Untuk Membuat Antrian Kami, kami hanya menentukan sebiji kacang Antrian jenis . RabbitAdmin akan menemui ini dan mengikatnya ke pertukaran lalai dengan kunci routing "myQueue":

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

Kami menetapkan antrian agar tidak tahan lama supaya barisan dan sebarang mesej di atasnya akan dikeluarkan semasa RabbitMQ dihentikan. Namun, perhatikan bahawa memulakan semula aplikasi kami tidak akan memberi kesan pada barisan.

5.4. Hantar Mesej Kami

Mari kita gunakan RabbitTemplate untuk menghantar "Hello, world!" mesej:

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

5.5. Gunakan Mesej Kami

Kami akan melaksanakan pengguna mesej dengan memberi penjelasan kaedah dengan @RabbitListener :

@RabbitListener(queues = "myQueue") public void listen(String in) { System.out.println("Message read from myQueue : " + in); }

6. Menjalankan Permohonan Kami

Pertama, kita memulakan broker RabbitMQ:

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

Kemudian, kami menjalankan aplikasi spring boot dengan menjalankan HelloWorldMessage.java , menjalankan kaedah utama () :

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

Semasa aplikasi berjalan, kita akan melihat bahawa:

  • Aplikasi ini mengirimkan pesan ke pertukaran lalai dengan "myQueue" sebagai kunci penghala
  • Kemudian, barisan "myQueue" menerima mesej
  • Akhirnya, kaedah mendengar menggunakan mesej dari "myQueue" dan mencetaknya di konsol

Kami juga boleh menggunakan halaman pengurusan RabbitMQ di // localhost: 15672 untuk melihat bahawa mesej kami telah dihantar dan dimakan.

7. Kesimpulannya

Dalam tutorial ini, kami membahas seni bina berasaskan pesanan melalui protokol AMQP menggunakan Spring AMQP untuk komunikasi antara aplikasi.

Kod sumber yang lengkap dan semua coretan kod untuk tutorial ini terdapat di projek GitHub.