文章目錄
- RabbitMQ最新入門教程
- 1.什么是消息隊列
- 2.為什么使用消息隊列
- 3.消息隊列協議
- 4.安裝Erlang
- 5.安裝RabbitMQ
- 6.RabbitMQ核心模塊
- 7.RabbitMQ六大模式
- 7.1 簡單模式
- 7.2 工作模式
- 7.3 發布訂閱模式
- 7.4 路由模式
- 7.5 主題模式
- 7.6 RPC模式
- 8.RabbitMQ四種交換機
- 8.1 直連交換機
- 8.2 主題交換機
- 8.3 扇形交換機
- 8.4 首部交換機
- 9.RabbitMQ Management使用
- 9.1 Queues操作
- 9.2 Exchanges操作
- 10.在Java中使用RabbitMQ
- 11.SpringBoot整合RabbitMQ
- 參考
RabbitMQ最新入門教程
1.什么是消息隊列
消息指的是兩個應用間傳遞的數據。數據的類型有很多種形式,可能只包含文本字符串,也可能包含嵌入對象。
“消息隊列(Message Queue)”是在消息的傳輸過程中保存消息的容器。在消息隊列中,通常有生產者和消費者兩個角色。生產者只負責發送數據到消息隊列,誰從消息隊列中取出數據處理,他不管。消費者只負責從消息隊列中取出數據處理,他不管這是誰發送的數據。
常用的 MQ 有 ActiveMQ、RabbitMQ、Kafka、RocketMQ。
消息隊列 | 誕生時間 | 優點 | 缺點 | 使用場景 | 特點 |
---|---|---|---|---|---|
ActiveMQ | 2007 年 | 功能全面,支持消息持久化、事務處理、集群等功能;跨平臺性和兼容性良好,能與不同系統集成 | 性能在高并發場景下相對其他幾款稍遜一籌;配置復雜,容易出現性能問題;社區活躍度不如 RabbitMQ 和 Kafka | 適用于企業級應用中多種不同類型系統之間的消息通信和集成,例如,在包含多種不同技術架構子系統的大型企業應用中,作為消息橋梁實現各子系統之間的通信和協作 | 功能全面、協議支持豐富、跨平臺性好 |
RabbitMQ | 2007 年 | 可靠性高,支持多種消息持久化方式;路由功能強大,交換器類型豐富;客戶端支持廣泛,幾乎涵蓋所有主流編程語言;社區活躍,文檔豐富,易于學習和使用 | 性能相對 Kafka 等稍低,在處理大規模、高并發消息時可能存在瓶頸;Erlang 語言編寫,對開發者技術棧有一定要求 | 適用于各種規模的企業級應用,尤其是對消息可靠性和靈活性要求較高的場景,如電商系統中的訂單處理、物流通知,金融系統中的交易消息處理等 | 可靠性強、路由靈活、語言支持廣泛 |
Kafka | 2011 年 | 高吞吐量,能處理海量消息數據,低延遲;支持水平擴展,可通過添加節點增加處理能力;消息持久化到磁盤,數據可靠性高;適用于實時數據處理、日志收集和分析等場景 | 不適合處理大量的小消息;對消息的順序性支持相對較弱,雖然可以通過一些配置保證,但會影響性能;運維相對復雜,需要一定的技術門檻 | 常用于大數據處理、實時流計算、日志收集與分析等領域,如電商網站的用戶行為日志收集、金融行業的交易流水記錄等,以便進行實時分析和處理 | 高吞吐量、可擴展性好、數據持久化 |
RocketMQ | 2012 年 | 支持大規模消息堆積和高并發消息處理;提供豐富的消息過濾機制和事務消息功能;擴展性和運維管理能力良好 | 開源社區活躍度相比 RabbitMQ 和 Kafka 稍低;對某些復雜場景的支持可能不夠靈活,需要一定的二次開發 | 在電商、金融等領域應用廣泛,尤其適用于對消息可靠性、事務性和高并發處理要求較高的場景,如電商的訂單支付、庫存變更等業務場景 | 支持高并發、消息過濾功能強大、事務消息支持 |
2.為什么使用消息隊列
-
解耦。如圖所示。假設有系統B、C、D都需要系統A的數據,于是系統A調用三個方法發送數據到B、C、D。這時,系統D不需要了,那就需要在系統A把相關的代碼刪掉。假設這時有個新的系統E需要數據,這時系統A又要增加調用系統E的代碼。為了降低這種強耦合,就可以使用MQ,系統A只需要把數據發送到MQ,其他系統如果需要數據,則從MQ中獲取即可。
-
異步。如圖所示。一個客戶端請求發送進來,系統A會調用系統B、C、D三個系統,同步請求的話,響應時間就是系統A、B、C、D的總和,也就是800ms。如果使用MQ,系統A發送數據到MQ,然后就可以返回響應給客戶端,不需要再等待系統B、C、D的響應,可以大大地提高性能。對于一些非必要的業務,比如發送短信,發送郵件等等,就可以采用MQ。
-
削峰。如圖所示。這其實是MQ一個很重要的應用。假設系統A在某一段時間請求數暴增,有5000個請求發送過來,系統A這時就會發送5000條SQL進入MySQL進行執行,MySQL對于如此龐大的請求當然處理不過來,MySQL就會崩潰,導致系統癱瘓。如果使用MQ,系統A不再是直接發送SQL到數據庫,而是把數據發送到MQ,MQ短時間積壓數據是可以接受的,然后由消費者每次拉取2000條進行處理,防止在請求峰值時期大量的請求直接發送到MySQL導致系統崩潰。
3.消息隊列協議
常見的消息中間件協議有:OpenWire、AMQP、MQTT、Kafka、OpenMessage協議。RabbitMQ 實現的兩個核心協議:AMQP 1.0 和 AMQP 0-9-1。
協議名稱 | 簡介 | 特點 | 應用場景 |
---|---|---|---|
OpenWire | ActiveMQ 默認的通信協議,基于 TCP/IP,提供了豐富的消息傳遞功能,支持多種編程語言。 | 支持多種消息傳遞模式,如點對點、發布 / 訂閱等;具有較好的兼容性和擴展性。 | 適用于企業級應用中,需要可靠消息傳遞和多種消息模式支持的場景。 |
AMQP(高級消息隊列協議) | 一種面向消息中間件的開放標準協議,具有豐富的功能集,支持事務、消息確認等。 | 具有很強的規范性和通用性,支持多種語言,能保證消息的可靠傳遞和處理。 | 常用于金融、電商等對數據一致性和可靠性要求較高的領域。 |
MQTT(消息隊列遙測傳輸) | 輕量級的發布 / 訂閱模式的消息傳輸協議,基于 TCP/IP,具有低帶寬、低功耗、高可靠性等特點。 | 采用簡單的客戶端 - 服務器架構,消息以主題進行分類,適合資源受限的設備和網絡環境。 | 廣泛應用于物聯網、移動應用、實時監控等場景,如智能家居設備之間的通信。 |
Kafka | 由 Apache 開發的分布式流平臺,其協議主要用于處理大規模的實時數據。 | 具有高吞吐量、可擴展性、持久性和容錯性等特點,支持消息的批量處理和異步處理。 | 常用于大數據處理、實時數據處理、日志收集等場景,如電商網站的用戶行為日志收集和分析。 |
OpenMessage | 是阿里云開源的新一代分布式消息中間件協議,旨在提供高性能、高可靠、高可擴展的消息通信能力。 | 支持大規模集群部署,具有低延遲、高并發的特點,同時提供了豐富的消息特性,如事務消息、順序消息等。 | 適用于互聯網公司的大規模分布式系統,尤其是對消息處理性能和可靠性要求極高的場景,如電商的訂單系統、物流系統等。 |
4.安裝Erlang
-
安裝 Erlang。RabbitMQ 服務器是用 Erlang 語言編寫的,它的安裝包里并沒有集成 Erlang 的環境,因此需要先安裝 Erlang。下載鏈接,傻瓜式安裝,一直點next就行。
-
為 Erlang 配置環境變量。「編輯系統環境變量」->「環境變量」->「系統變量」->「path」->「編輯」->「新建」,填入 Erlang 的 bin 路徑(
D:\Erlang\Erlang OTP\bin
)。 -
驗證是否安裝成功。「cmd」->「輸入
erl -version
」
5.安裝RabbitMQ
-
安裝 RabbitMQ 服務器端,下載鏈接,傻瓜式安裝,一直點 next 就行。
-
安裝完成后,進入安裝目錄(
sbin
目錄下),運行 cmd,輸入rabbitmqctl.bat status
可確認 RabbitMQ 的啟動狀態。 -
輸入
rabbitmq-plugins enable rabbitmq_management
,啟用客戶端管理 UI 的插件。 -
在瀏覽器地址欄輸入 http://localhost:15672/ 進入管理端界面。賬號與密碼默認是:guest/guest。出現如下界面,則表示安裝成功完成。
note:在通過 rabbitmqctl.bat status
查看 RabbitMQ 的啟動狀態時,出現了錯誤。Error: unable to perform an operation on node 'rabbit@WIN-H34GJTET6NT'. Please see diagnostics information and suggestions below.
這個錯誤是因為 erlang 和 rabbitmq 的 .erlang.cookie
不同步所導致的。
解決辦法:將 C:\Users\Administrator\.erlang.cookie
復制到 C:\Windows\System32\config\systemprofile
目錄,重啟 rabbitMQ 服務。
6.RabbitMQ核心模塊
- Publisher:生產者,發送消息給交換機。
- consumer:消費者,消費消息,和隊列進行綁定。
- exchange:交換機,負責消息路由。生產者發送的消息由交換機決定投遞到哪個隊列。交換機只能路由消息,無法存儲消息。交換機只會路由消息給與其綁定的隊列,因此隊列必須與交換機綁定。
- queue:隊列,存儲消息。生產者投遞的消息會暫存在消息隊列中,等待消費者處理。
- Virtual Host:虛擬主機,起到數據隔離的作用。每個虛擬主機相互獨立,有各自的exchange、queue,因為RabiitMQ性能很強,單個項目使用會造成巨大的浪費,所以多個項目,實現一套MQ,virtual host就是為了不同交換機產生隔離。
7.RabbitMQ六大模式
7.1 簡單模式
簡單模式是最基本的工作模式,也是最簡單的消息傳遞模式。在簡單模式中,一個生產者將消息發到一個隊列中,一個消費者從隊列中獲取并消費消息。這種模式適用于單個生產者和單個消費者的簡單場景,消息的處理是同步的。
7.2 工作模式
工作模式用于實現一個任務在多個消費者之間的并發處理,在工作隊列模式中,一個生產者將消息發到一個隊列中,多個消費者從隊列中獲取并處理消息,每個消息只能被一個消費者處理。這種模式適用于多個消費者并發處理消息的情況,提高了系統的處理能力和吞吐量。
7.3 發布訂閱模式
發布/訂閱模式用于實現一條消息被多個消費者同時接受和處理。在發布/訂閱模式中,一個生產者將消息發送到交換器(Exchange)中,交換器將消息廣播到所有綁定的隊列,每個隊列對應一個消費者。這種模式適用于消息需要被多個消費者同時接受和處理的廣播場景,如日志訂閱和消息通知等。
7.4 路由模式
路由模式用于實現根據消息的路由鍵(Routing Key)將消息路由到不同的隊列中。在路由模式中,一個生產者將消息發送到交換器中,并制定消息的路由鍵,交換器根據路由鍵將消息路由到與之匹配的隊列中。這種模式適用于根據不同的條件將消息分發到不同的隊列中,以實現消息的篩選和分發。
7.5 主題模式
主題模式是一種更靈活的消息路由,它使用通配符匹配路由鍵,將消息路由到多個隊列中。在主題模式中,一個生產者將消息發送到交換器中,并指定主題(Topic)作為路由鍵,交換器根據通配符匹配將消息路由到與之匹配的隊列中。
7.6 RPC模式
RPC模式是一種用于實現分布式系統中遠程調用的工作模式。指的是通過RabbitMQ來實現一種RPC的能力。
8.RabbitMQ四種交換機
生產者發布消息、消費者接收消息,但是這中間的消息是怎么傳遞的,就用到了一個很重要的概念交換機(Exchange),RabbitMQ 消息投遞到交換機上之后,通過路由關系再投遞到指定的一個或多個隊列上。
Exchange 參數介紹:
- Name:交換機名稱
- Type:交換機類型 direct、topic、fanout、headers
- Durability:是否需要持久化
- Auto Delete:最后一個綁定到 Exchange 上的隊列刪除之后自動刪除該 Exchange
- Internal:當前 Exchange 是否應用于 RabbitMQ 內部使用,默認false。
- Arguments:擴展參數
Exchange 四種類型:
- direct:不需要 Exchange 進行綁定,根據 RoutingKey 匹配消息路由到指定的隊列。
- topic:生產者指定 RoutingKey 消息根據消費端指定的隊列通過模糊匹配的方式進行相應轉發,兩種通配符模式:
#
:可匹配一個或多個關鍵字*
:只能匹配一個關鍵字
- fanout:這種模式只需要將隊列綁定到交換機上即可,是不需要設置路由鍵的。
- headers:根據發送消息內容中的 headers 屬性來匹配
8.1 直連交換機
direct 通過 RoutingKey 匹配消息路由到指定的隊列,因此也可以無需指定交換機,在不指定交換機的情況下會使用 AMQP default
默認的交換機,另外在消息投遞時要注意 RoutingKey 要完全匹配才能被隊列所接收,否則消息會被丟棄的。
上圖三個隊列,第一個隊列的 Binding routingKey 為 black,第二個隊列和第三個隊列的 Binding routingKey 為 green,也很清晰的能看到消息投遞 1 僅被 Queue1 接收,而 消息投遞 2 同時可以被廣播到 Queue2 和 Queue3,這是因為 Queue2 和 Queue3 的路由鍵是相同的,再一次的說明了交換機的 direct 模式是通過 RoutingKey 進行消息路由的。
8.2 主題交換機
生產者指定 RoutingKey ,消費端根據指定的隊列通過模糊匹配的方式進行相應轉發。
上圖展示了交換機 Topic 模式的消息流轉過程,Queue1 的路由鍵通過使用 \*
符合匹配到了 black.test1 和 black.test2 但是 black.test3.1 由于有多個關鍵字是匹配不到的。另一個隊列 Queue2 使用了 #
符號即可以一個也可以匹配多個關鍵字,同時匹配到了 black.test4 和 black.test5.1。
8.3 扇形交換機
fanout 只需要將隊列綁定到交換機上即可,是不需要設置路由鍵的,便可將消息轉發到綁定的隊列上,由于不需要路由鍵,所以 fanout 也是四個交換機類型中最快的一個,如果是做廣播模式的就很適合。
8.4 首部交換機
Headers 類型的交換機是根據發送消息內容中的 headers 屬性來匹配的,headers 類型的交換機基本上不會用到,因此這里也不會過多介紹,掌握以上三種類型的交換機模型在平常的業務場景中就足夠了。
9.RabbitMQ Management使用
通過 http://localhost:15672 訪問 RabbitMQ 的控制臺管理工具 RabbitMQ Management,用戶名/密碼都是 guest。
9.1 Queues操作
-
創建隊列。點擊「導航欄Queues」->「Add a new queue」展開隊列信息,填好信息后,add 添加。
-
添加成功后,可以在 All queues 下看到添加的隊列。點擊隊列名就會跳轉到隊列詳情頁面。
-
在隊列詳情頁面,可以進行一些操作,如下圖所示。
9.2 Exchanges操作
-
創建隊列。點擊「導航欄Exchanges」->「Add a new exchange」展開交換機信息,填好信息后,add 添加。
-
在交換機詳情頁面,同樣可以進行一些操作,如下圖所示。
10.在Java中使用RabbitMQ
模擬一個最簡單的場景,一個生產者發送消息到隊列中,一個消費者從隊列中讀取消息并打印。
-
第一步,在項目中添加 RabbitMQ 客戶端依賴:
<dependency><groupId>com.rabbitmq</groupId><artifactId>amqp-client</artifactId><version>5.22.0</version> </dependency> <dependency><groupId>org.slf4j</groupId><artifactId>slf4j-api</artifactId><version>2.0.16</version> </dependency> <dependency><groupId>org.slf4j</groupId><artifactId>slf4j-simple</artifactId><version>2.0.16</version><!-- 注意,若無type為jar則報錯--><type>jar</type> </dependency>
note:如果沒有導入 slf4j-api 和 slf4j-simple 依賴,會報錯 SLF4J: Failed to load class “org.slf4j.impl.StaticLoggerBinder”. SLF4J: Defaulting to no-operation (NOP) logger implementation. 如下:
-
第二步,創建生產者類。
import com.rabbitmq.client.Channel; import com.rabbitmq.client.Connection; import com.rabbitmq.client.ConnectionFactory;import java.io.IOException; import java.nio.charset.StandardCharsets; import java.util.concurrent.TimeoutException;public class Producer {// 聲明隊列名稱,設置為final static表示全局唯一常量private final static String QUEUE_NAME = "test";public static void main(String[] args) throws IOException, TimeoutException {// 創建RabbitMQ連接工廠實例ConnectionFactory factory = new ConnectionFactory();// 使用try-with-resources自動關閉連接和通道try(Connection connection = factory.newConnection();Channel channel = connection.createChannel()){// 聲明持久化隊列(durable=true),若隊列不存在則創建channel.queueDeclare(QUEUE_NAME, true, false, false, null);// 定義要發送的消息內容String message = "this is a rabbitmq test in java";// 發布消息到默認交換機(""),路由到指定隊列channel.basicPublish("", QUEUE_NAME, null, message.getBytes(StandardCharsets.UTF_8));// 打印發送成功的消息內容System.out.println("發送消息:"+ message);}// 資源會在此自動關閉} }
-
第三步,創建消費者類。
import com.rabbitmq.client.Channel; import com.rabbitmq.client.Connection; import com.rabbitmq.client.ConnectionFactory; import com.rabbitmq.client.DeliverCallback;import java.io.IOException; import java.nio.charset.StandardCharsets; import java.util.concurrent.TimeoutException;public class Consumer {// 與生產者保持一致的隊列名稱private final static String QUEUE_NAME = "test";public static void main(String[] args) throws IOException, TimeoutException {// 創建RabbitMQ連接工廠ConnectionFactory factory = new ConnectionFactory();// 建立TCP連接Connection connection = factory.newConnection();// 創建AMQP通道(輕量級連接)Channel channel = connection.createChannel();// 聲明持久化隊列(需與生產者配置一致)channel.queueDeclare(QUEUE_NAME, true, false, false, null);System.out.println("等待接收消息");// 定義消息回調函數,處理接收到的消息DeliverCallback deliverCallback = (consumerTag, delivery) -> {// 將字節數組轉換為UTF-8字符串String message = new String(delivery.getBody(), StandardCharsets.UTF_8);System.out.println("接收消息:" + message);};// 啟動消費者并設置自動確認模式(autoAck=true)channel.basicConsume(QUEUE_NAME, true, deliverCallback, consumerTag -> { // 消費者取消時的回調(空實現)});} }
-
第四步,運行,查看效果。
11.SpringBoot整合RabbitMQ
-
新建一個 SpringBoot 項目。
-
修改
pom.xml
文件,添加 RabbitMQ 依賴。<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.5.9</version><relativePath/> <!-- lookup parent from repository --></parent><groupId>org.example</groupId><artifactId>RabbitMQSpring</artifactId><version>0.0.1-SNAPSHOT</version><name>RabbitMQSpring</name><description>RabbitMQSpring</description><properties><java.version>1.8</java.version></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-amqp</artifactId></dependency><dependency><groupId>org.springframework.amqp</groupId><artifactId>spring-rabbit-test</artifactId><scope>test</scope></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build></project>
-
將配置文件
application.properties
重命名為application.yml
,并修改配置文件的內容。spring:application:name: RabbitMQSpringrabbitmq:host: localhostport: 5672username: guestpassword: guestvirtual-host: /server:port: 8088logging:level:org.example.rabbitmqspring: debug
-
在項目根目錄下創建 config 包,在 config 包下創建一個 RabbitMQ 配置類 RabbitMQConfig。
package org.example.rabbitmqspring.config;import org.springframework.amqp.core.Binding; import org.springframework.amqp.core.BindingBuilder; import org.springframework.amqp.core.DirectExchange; import org.springframework.amqp.core.Queue; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration;@Configuration public class RabbitMQConfig {// 交換機的名稱public static final String DEFAULT_EXCHANGE = "exchange";// 路由Key的名稱public static final String DEFAULT_ROUTE = "route";// 隊列的名稱public static final String DEFAULT_QUEUE = "queue";/*** 聲明交換機* @return DirectExchange*/@Beanpublic DirectExchange exchange() {return new DirectExchange(DEFAULT_EXCHANGE);}/*** 聲明隊列* @return Queue*/@Beanpublic Queue queue(){return new Queue(DEFAULT_QUEUE);}/*** 聲明路由Key(交換機和隊列的關系)* @param exchange DirectExchange* @param queue Queue* @return Binding*/@Beanpublic Binding binding(DirectExchange exchange, Queue queue){return BindingBuilder.bind(queue).to(exchange).with(DEFAULT_ROUTE);}}
-
在項目根目錄下創建 producer 包,在 producer 包下創建一個 RabbitProducer 類。
package org.example.rabbitmqspring.producer;import org.example.rabbitmqspring.config.RabbitMQConfig; import org.springframework.amqp.rabbit.core.RabbitTemplate; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component;/*** RabbitMQ消息生產者組件,負責將消息發送到指定隊列* 基于Spring AMQP的RabbitTemplate實現消息發送*/ @Component // 聲明為Spring管理的組件,會自動掃描并注冊到應用上下文中 public class RabbitProducer {private final RabbitTemplate rabbitTemplate; // RabbitMQ操作模板,用于發送和接收消息@Autowired // 通過構造器注入RabbitTemplate實例public RabbitProducer(RabbitTemplate rabbitTemplate){this.rabbitTemplate = rabbitTemplate;}/*** 發送消息到默認交換機和路由* @param message 待發送的消息內容*/public void sendMessage(String message){ // 調用RabbitTemplate將消息轉換并發送到指定交換機和路由鍵rabbitTemplate.convertAndSend(RabbitMQConfig.DEFAULT_EXCHANGE, RabbitMQConfig.DEFAULT_ROUTE, message);} }
-
在項目根目錄下創建 consumer 包,在 consumer 包下創建一個 RabbitConsumer 類。
package org.example.rabbitmqspring.consumer;import org.example.rabbitmqspring.config.RabbitMQConfig; import org.springframework.amqp.rabbit.annotation.RabbitHandler; import org.springframework.amqp.rabbit.annotation.RabbitListener; import org.springframework.stereotype.Component;/*** RabbitMQ消息消費者組件,自動監聽配置的默認隊列* 基于Spring AMQP的注解驅動模型實現消息監聽*/ @Component // 聲明為Spring組件,由Spring容器管理實例化 @RabbitListener(queues = RabbitMQConfig.DEFAULT_QUEUE) // 監聽配置類中定義的默認隊列 public class RabbitMQConsumer {/*** 消息處理方法,當隊列接收到新消息時自動觸發* @param message 從隊列中獲取的字符串消息體*/@RabbitHandler // 聲明為RabbitMQ消息處理方法public void receive(String message){System.out.printf("收到一條消息: %s", message);} }
-
在項目根目錄下創建 controller 包,在 controller 包下創建一個 MessageController 類。
package org.example.rabbitmqspring.controller;import org.example.rabbitmqspring.producer.RabbitProducer; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RestController;@RestController // 聲明該類為RESTful風格的控制器,會自動將返回值轉換為JSON格式 @RequestMapping(path = "/message", produces = "application/json;charset=utf-8") // 映射請求路徑,設置響應內容類型為JSON且字符集為UTF-8 public class MessageController {private final RabbitProducer producer; // 依賴注入RabbitMQ消息生產者@Autowired // 自動注入RabbitProducer實例public MessageController(RabbitProducer producer){this.producer = producer;}@RequestMapping(value = "/send", method = RequestMethod.POST) // 映射/send路徑的POST請求public void sendMessage(String message){ // 處理發送消息的請求,接收一個字符串類型的消息producer.sendMessage(message); // 調用生產者的發送消息方法} }
-
使用 API 測試工具,測試發送消息。
測試工具推薦:Postman、Apifox。
由于 Postman 需要訪問外網才能使用,不支持中文等使用門檻,對于國內開發者來說并不是一個最好的首選 API 管理工具,所以 Apifox 會更適合我們使用。
🤗🤗🤗
參考
- 超詳細的RabbitMQ入門,看這篇就夠了!
- 圖文實踐 RabbitMQ 不同類型交換機消息投遞機制
- RabbitMQ的介紹
- RabbitMQ安裝和使用詳細教程