Pesan dengan Spring AMQP

1. Ikhtisar

Dalam tutorial ini, kita akan menjelajahi komunikasi berbasis pesan melalui AMQP menggunakan kerangka kerja Spring AMQP. Pertama, kita akan membahas beberapa konsep utama perpesanan. Kemudian, kita akan beralih ke contoh praktis.

2. Komunikasi Berbasis Pesan

Perpesanan adalah teknik untuk berkomunikasi antar aplikasi. Ini bergantung pada penyaluran pesan asinkron alih-alih arsitektur berbasis respons permintaan sinkron. Produsen dan konsumen pesan dipisahkan oleh lapisan perpesanan perantara yang dikenal sebagai perantara pesan . Broker pesan menyediakan fitur seperti penyimpanan pesan yang persisten, pemfilteran pesan, dan transformasi pesan.

Dalam kasus perpesanan antara aplikasi yang ditulis di Java, JMS (Java Message Service) API biasanya digunakan. Untuk interoperabilitas antara vendor dan platform yang berbeda, kami tidak dapat menggunakan klien dan broker JMS. Di sinilah AMQP berguna .

3. AMQP - Protokol Antrian Pesan Lanjut

AMQP adalah spesifikasi kabel standar terbuka untuk komunikasi pesan asinkron. Ini memberikan deskripsi tentang bagaimana pesan harus dibangun.

3.1. Bagaimana Amqp Berbeda dari Jms

Karena AMQP adalah standar protokol biner platform-netral, perpustakaan dapat ditulis dalam bahasa pemrograman yang berbeda, dan berjalan di lingkungan yang berbeda.

Tidak ada penguncian protokol berbasis vendor, seperti yang terjadi saat bermigrasi dari satu broker JMS ke broker lain. Untuk lebih jelasnya lihat JMS vs AMQP dan Memahami AMQP. Beberapa broker AMQP yang banyak digunakan adalah RabbitMQ , OpenAMQ, dan StormMQ.

3.2. Entitas AMQP

Secara singkat, AMQP terdiri dari Bursa, Antrean, dan Pengikatan:

  • Pertukaran seperti kantor pos atau kotak surat dan klien mempublikasikan pesan ke pertukaran AMQP. Ada empat jenis pertukaran bawaan
    • Direct Exchange - Merutekan pesan ke antrian dengan mencocokkan kunci perutean lengkap
    • Fanout Exchange - Merutekan pesan ke semua antrian yang terikat padanya
    • Pertukaran Topik - Merutekan pesan ke beberapa antrian dengan mencocokkan kunci perutean ke sebuah pola
    • Headers Exchange - Merutekan pesan berdasarkan header pesan
  • Antrian terikat ke pertukaran menggunakan kunci routing
  • Pesan dikirim ke pertukaran dengan kunci perutean. Pertukaran kemudian mendistribusikan salinan pesan ke antrian

Untuk lebih jelasnya, lihat Konsep AMQP dan Topologi Perutean.

3.3. Musim semi AMQP

Spring AMQP terdiri dari dua modul: spring-amqp dan spring-rabbit . Bersama-sama, modul-modul ini menyediakan abstraksi untuk:

  • Entitas AMQP - kita menciptakan entitas dengan pesan, Antrian, Binding, dan Bursa kelas

  • Manajemen Koneksi - kami terhubung ke broker RabbitMQ kami dengan menggunakan CachingConnectionFactory
  • Penerbitan Pesan - kami menggunakan RabbitTemplate untuk mengirim pesan
  • Konsumsi Pesan - kami menggunakan @RabbitListener untuk membaca pesan dari antrian

4. Siapkan Broker Rabbitmq

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

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

Kami mengekspos port 5672 sehingga aplikasi kami dapat terhubung ke RabbitMQ.

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

5. Membuat Aplikasi Spring Amqp Kami

Jadi, sekarang mari buat aplikasi kita untuk mengirim dan menerima pesan "Halo, dunia!" pesan dengan menggunakan Spring AMQP.

5.1. Dependensi Maven

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

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

Kami dapat menemukan versi terbaru di Maven Central.

5.2. Menghubungkan ke Broker Rabbitmq Kami

Kami akan menggunakan konfigurasi otomatis Spring Boot untuk membuat kacang ConnectionFactory , RabbitTemplate , dan RabbitAdmin kami . Hasilnya, kami mendapatkan koneksi ke broker RabbitMQ kami di port 5672 menggunakan nama pengguna dan kata sandi default "tamu". Jadi, kami hanya memberi anotasi aplikasi kami dengan @SpringBootApplication :

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

5.3. Buat Antrean Kami

Untuk Membuat Antrian Kita, kita cukup mendefinisikan kacang bertipe Antrian . RabbitAdmin akan menemukan ini dan mengikatnya ke pertukaran default dengan kunci perutean "myQueue":

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

Kami mengatur antrian menjadi tidak tahan lama sehingga antrian dan pesan apa pun di dalamnya akan dihapus ketika RabbitMQ dihentikan. Perhatikan, bagaimanapun, bahwa memulai ulang aplikasi kita tidak akan berpengaruh pada antrian.

5.4. Kirim Pesan Kami

Mari gunakan RabbitTemplate untuk mengirim pesan "Halo, dunia!" pesan:

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

5.5. Konsumsilah Pesan Kami

Kami akan menerapkan konsumen pesan dengan menganotasi metode dengan @RabbitListener :

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

6. Menjalankan Aplikasi Kami

Pertama, kami memulai broker RabbitMQ:

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

Kemudian, kami menjalankan aplikasi boot musim semi dengan menjalankan HelloWorldMessage.java , menjalankan metode main () :

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

Saat aplikasi sedang berjalan kita akan melihat bahwa:

  • Aplikasi mengirimkan pesan ke pertukaran default dengan "myQueue" sebagai kunci perutean
  • Kemudian, antrian "myQueue" menerima pesan tersebut
  • Terakhir, metode mendengarkan menggunakan pesan dari "myQueue" dan mencetaknya di konsol

Kita juga dapat menggunakan halaman manajemen RabbitMQ di // localhost: 15672 untuk melihat bahwa pesan kita telah terkirim dan dikonsumsi.

7. Kesimpulan

Dalam tutorial ini, kami membahas arsitektur berbasis pesan melalui protokol AMQP menggunakan Spring AMQP untuk komunikasi antar aplikasi.

Kode sumber lengkap dan semua cuplikan kode untuk tutorial ini tersedia di proyek GitHub.