J.J. Huang   2019-04-14   Spring Boot   瀏覽次數:次  

SpringBoot - 第二十六章 | RabbitMQ的集成和使用

📑 目錄
  1. RabbitMQ介绍
  2. Message Broker 與 AMQP 簡介
  3. Docker RabbitMQ準備
  4. 相關配置
    1. 加入pom的依賴
    2. 參數配置
  5. 建立 RabbitConfig (RabbitMQ的配置類)
  6. 建立 Sender (消息生產者)
  7. 建立 Receiver (消息消費者)
  8. 建立 DemoController
  9. 對接測試
  10. 測試
    1. 測試結果

上兩篇文章講了緩存資料庫Redis的使用,在開發過程中,一般上在系統或者應用間通信或者進行異步通知(登錄後發送短信或者郵件等)時,都會使用消息隊列進行解決此業務場景的解耦問題。常見的MQ有kafka、activemq、zeromq、rabbitmq 等等,各大MQ的對比和優劣勢可以自行Google,這章節講解下消息隊列RabbitMQ的集成和簡單使用示例。

RabbitMQ介绍

RabbitMQ是一個開源的AMQP實現,伺服器端用Erlang語言編寫,支持多種客戶端,如:Python、Ruby、.NET、Java、JMS、C、PHP、ActionScript、XMPP、STOMP等,支持AJAX。用於在分佈式系統中存儲轉發消息,在易用性、擴展性、高可用性等方面表現不俗。

RabbitMQ官方​‌‌‌​​‌‌​‌‌‌​​​​​‌‌‌​​‌​​‌‌​‌​​‌​‌‌​‌‌‌​​‌‌​​‌‌‌​‌‌​​​‌​​‌‌​‌‌‌‌​‌‌​‌‌‌‌​‌‌‌​‌​​​​‌​‌‌​‌​​‌‌​​‌​​​‌‌​​​​​​‌‌​​​‌​​‌‌‌​​‌​​‌‌​​​​​​‌‌​‌​​​​‌‌​​​‌​​‌‌​‌​​​​‌​‌‌​‌​‌‌‌​​‌‌​‌‌‌​​​​​‌‌‌​​‌​​‌‌​‌​​‌​‌‌​‌‌‌​​‌‌​​‌‌‌​‌‌​​​‌​​‌‌​‌‌‌‌​‌‌​‌‌‌‌​‌‌‌​‌​​​​‌‌​​‌​​​‌‌​‌‌​

Message Broker 與 AMQP 簡介

Message Broker是一種消息驗證、傳輸、路由的架構模式,其設計目標主要應用於下面這些場景:

  • 消息路由到一個或多個目的地
  • 消息轉化為其他的表現方式
  • 執行消息的聚集、消息的分解,並將結果發送到他們的目的地,然後重新組合相應返回給消息用戶
  • 調用Web服務來檢索資料
  • 響應事件或錯誤
  • 使用發布-訂閱模式來提供內容或基於主題的消息路由

AMQP是Advanced Message Queuing Protocol的簡稱,它是一個面向消息中間件的開放式標準應用層協議。 AMQP定義了這些特性:

  • 消息方向
  • 消息隊列
  • 消息路由(包括:點到點和發布-訂閱模式)
  • 可靠性
  • 安全性

Docker RabbitMQ準備

1
docker run --name myrabbitmq -p 15672:15672 -p 5672:5672 -d rabbitmq:management

命令說明:​‌‌‌​​‌‌​‌‌‌​​​​​‌‌‌​​‌​​‌‌​‌​​‌​‌‌​‌‌‌​​‌‌​​‌‌‌​‌‌​​​‌​​‌‌​‌‌‌‌​‌‌​‌‌‌‌​‌‌‌​‌​​​​‌​‌‌​‌​​‌‌​​‌​​​‌‌​​​​​​‌‌​​​‌​​‌‌‌​​‌​​‌‌​​​​​​‌‌​‌​​​​‌‌​​​‌​​‌‌​‌​​​​‌​‌‌​‌​‌‌‌​​‌‌​‌‌‌​​​​​‌‌‌​​‌​​‌‌​‌​​‌​‌‌​‌‌‌​​‌‌​​‌‌‌​‌‌​​​‌​​‌‌​‌‌‌‌​‌‌​‌‌‌‌​‌‌‌​‌​​​​‌‌​​‌​​​‌‌​‌‌​

1
2
3
4
5
- --name myrabbitmq :將 Container 取名為 myrabbitmq
- -p 15672:15672 :將 Container 的 15672 Port 映射到主機的 15672 Port
- -p 5672:5672 :將 Container 的 5672 Port 映射到主機的 5672 Port
- -d :後台執行 Container ,並返回ID
- rabbitmq:management :指定安裝的鏡像rabbitmq:management

相關配置

可以通過引入spring-boot-starter-amqp用於支持RabbitMQ。

加入pom的依賴

1
2
3
4
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>

參數配置

在src/main/resources/application.properties中配置RabbitMQ訊息

1
2
3
4
5
# rabbitmq 相關配置
spring.rabbitmq.host=127.0.0.1
spring.rabbitmq.port=5672
spring.rabbitmq.username=guest
spring.rabbitmq.password=guest

配置自動加載類為:org.springframework.boot.autoconfigure.amqp.RabbitAutoConfiguration​‌‌‌​​‌‌​‌‌‌​​​​​‌‌‌​​‌​​‌‌​‌​​‌​‌‌​‌‌‌​​‌‌​​‌‌‌​‌‌​​​‌​​‌‌​‌‌‌‌​‌‌​‌‌‌‌​‌‌‌​‌​​​​‌​‌‌​‌​​‌‌​​‌​​​‌‌​​​​​​‌‌​​​‌​​‌‌‌​​‌​​‌‌​​​​​​‌‌​‌​​​​‌‌​​​‌​​‌‌​‌​​​​‌​‌‌​‌​‌‌‌​​‌‌​‌‌‌​​​​​‌‌‌​​‌​​‌‌​‌​​‌​‌‌​‌‌‌​​‌‌​​‌‌‌​‌‌​​​‌​​‌‌​‌‌‌‌​‌‌​‌‌‌‌​‌‌‌​‌​​​​‌‌​​‌​​​‌‌​‌‌​

建立 RabbitConfig (RabbitMQ的配置類)

用於配置隊列、交換器、路由等高級訊息。這裡我們以入門為主,先以最小化的配置來定義,以完成一個基本的生產和消費過程。

建立 Sender (消息生產者)

通過注入RabbitTemplate接口的實例來實現消息的發送。在該生產者,會將接收到的字符串,發送到名為J.J.Huang的隊列中。

建立 Receiver (消息消費者)

通過@RabbitListener註解定義該類對J.J.Huang隊列的監聽,並用@RabbitHandler註解來指定對消息的處理方法。所以,該消費者實現了對J.J.Huang隊列的消費,消費操作為輸出消息的字符串內容。​‌‌‌​​‌‌​‌‌‌​​​​​‌‌‌​​‌​​‌‌​‌​​‌​‌‌​‌‌‌​​‌‌​​‌‌‌​‌‌​​​‌​​‌‌​‌‌‌‌​‌‌​‌‌‌‌​‌‌‌​‌​​​​‌​‌‌​‌​​‌‌​​‌​​​‌‌​​​​​​‌‌​​​‌​​‌‌‌​​‌​​‌‌​​​​​​‌‌​‌​​​​‌‌​​​‌​​‌‌​‌​​​​‌​‌‌​‌​‌‌‌​​‌‌​‌‌‌​​​​​‌‌‌​​‌​​‌‌​‌​​‌​‌‌​‌‌‌​​‌‌​​‌‌‌​‌‌​​​‌​​‌‌​‌‌‌‌​‌‌​‌‌‌‌​‌‌‌​‌​​​​‌‌​​‌​​​‌‌​‌‌​

建立 DemoController

對接測試

在Rabbitmq的控制台,connections,可以看見連接對象的。說明已經正常啟動了。

SpringBoot - 第二十六章 - 圖 1 (01)

在Rabbitmq的控制台,Queues,可以查看到隊列J.J.Huang的消息。​‌‌‌​​‌‌​‌‌‌​​​​​‌‌‌​​‌​​‌‌​‌​​‌​‌‌​‌‌‌​​‌‌​​‌‌‌​‌‌​​​‌​​‌‌​‌‌‌‌​‌‌​‌‌‌‌​‌‌‌​‌​​​​‌​‌‌​‌​​‌‌​​‌​​​‌‌​​​​​​‌‌​​​‌​​‌‌‌​​‌​​‌‌​​​​​​‌‌​‌​​​​‌‌​​​‌​​‌‌​‌​​​​‌​‌‌​‌​‌‌‌​​‌‌​‌‌‌​​​​​‌‌‌​​‌​​‌‌​‌​​‌​‌‌​‌‌‌​​‌‌​​‌‌‌​‌‌​​​‌​​‌‌​‌‌‌‌​‌‌​‌‌‌‌​‌‌‌​‌​​​​‌‌​​‌​​​‌‌​‌‌​

SpringBoot - 第二十六章 - 圖 2 (02)

測試

測試結果

SpringBoot - 第二十六章 - 圖 1 (03) SpringBoot - 第二十六章 - 圖 1 (03)

SpringBoot - 第二十六章 - 圖 3 (04)

SpringBoot - 第二十六章 - 圖 4 (05)​‌‌‌​​‌‌​‌‌‌​​​​​‌‌‌​​‌​​‌‌​‌​​‌​‌‌​‌‌‌​​‌‌​​‌‌‌​‌‌​​​‌​​‌‌​‌‌‌‌​‌‌​‌‌‌‌​‌‌‌​‌​​​​‌​‌‌​‌​​‌‌​​‌​​​‌‌​​​​​​‌‌​​​‌​​‌‌‌​​‌​​‌‌​​​​​​‌‌​‌​​​​‌‌​​​‌​​‌‌​‌​​​​‌​‌‌​‌​‌‌‌​​‌‌​‌‌‌​​​​​‌‌‌​​‌​​‌‌​‌​​‌​‌‌​‌‌‌​​‌‌​​‌‌‌​‌‌​​​‌​​‌‌​‌‌‌‌​‌‌​‌‌‌‌​‌‌‌​‌​​​​‌‌​​‌​​​‌‌​‌‌​

註:以上參考了
oKongSpringBoot | 第十二章:RabbitMQ的集成和使用文章。
程序猿DD-翟永超Spring Boot中使用RabbitMQ 文章。
一起来学 SpringBoot 2.x | 第十二篇:初探 RabbitMQ 消息队列