文章目錄
- 前言
- 一、數據隔離
- 1.用戶管理
- 2.virtual host
- 二、控制臺收發
- 1.交換機
- 2.隊列
- 3.綁定
- 三、編程式收發
- 1.依賴和配置
- 2.收發信息
- 總結
前言
1.了解數據隔離
2.RabbitMQ控制臺收發信息
3.SpringBoot整合RabbitMQ收發信息
一、數據隔離
1.用戶管理
點擊Admin選項卡,首先會看到RabbitMQ控制臺的用戶管理界面
這里的用戶都是RabbitMQ的管理或運維人員。仔細觀察用戶表格中的字段,如下:
- Name:itheima,也就是用戶名
- Tags:administrator,說明itheima用戶是超級管理員,擁有所有權限
- Can access virtual host: /,可以訪問的virtual host,這里的/是默認的virtual host
對于小型企業而言,出于成本考慮,我們通常只會搭建一套MQ集群,公司內的多個不同項目同時使用。這個時候為了避免互相干擾, 我們會利用virtual host的隔離特性,將不同項目隔離。一般會做兩件事情:
- 給每個項目創建獨立的運維賬號,將管理權限分離。
- 給每個項目創建不同的virtual host,將每個項目的數據隔離。 比如,我們給自己項目創建一個新的用戶,命名為dragon,權限為admin
2.virtual host
創建完用戶,你會發現你的用戶是這樣:
別急,需要授權,為你創建的用戶綁定管理的虛擬機。登錄你剛才創建的用戶。
/代表默認虛擬機,我們可以給自己的項目創建一個單獨的virtual host,而不是使用默認的/。
由于我們是登錄dragon賬戶后創建的virtual host,因此回到users菜單,你會發現當前用戶已經具備了對/dragon這個virtual host的訪問權限了
如果你以前在默認的用戶或者你創建的其他用戶創建了隊列,交換機,你可以看到全部沒有,這就是隔離效果,互不干擾。就在當前用戶當前綁定授權的虛擬機操作。
二、控制臺收發
如果RabbitMQ安裝有問題,可以看我文章Docker中的快速安裝RaabbitMQ
1.交換機
點擊Exchanges選項卡,可以看出很多交換機
我們點擊任意交換機,即可進入交換機詳情頁面。仍然會利用控制臺中的publish message 發送一條消息:
這里是由控制臺模擬了生產者發送的消息(這里的生產者就是交換機),可以看到拒絕了,這樣說明交換機沒有存儲消息的能力,由于沒有消費者存在,最終消息丟失了。交換機只負責路由分發消息,所以我們創建隊列,也就是消費者來處理接收消息,讓交換機(生產者)有分發消息的對象。
2.隊列
我們打開Queues選項卡,新建一個隊列:hello.queue1、hello.queue2
此時,我們再次向amq.fanout交換機發送一條消息。會發現消息依然沒有到達隊列!!
怎么回事呢?
發送到交換機的消息,只會路由到與其綁定的隊列,因此僅僅創建隊列是不夠的,我們還需要將其與交換機綁定。
3.綁定
點擊Exchanges選項卡,點擊amq.fanout交換機,進入交換機詳情頁,然后點擊Bindings菜單,在表單中填寫要綁定的隊列名稱
再次進入綁定隊列的交換機內發送信息,回到Queues頁面,可以發現hello.queue中已經有一條消息了
點擊隊列名稱,進入詳情頁,查看隊列詳情,這次我們點擊get message,可以看到信息了
三、編程式收發
- 將來我們開發業務功能的時候,肯定不會在控制臺收發消息,而是應該基于編程的方式。由于RabbitMQ采用了
AMQP協議
,因此它具備跨語言的特性。任何語言只要遵循AMQP協議收發消息,都可以與RabbitMQ交互。并且RabbitMQ官方也提供了各種不同語言的客戶端。但是,RabbitMQ官方提供的Java客戶端編碼相對復雜,一般生產環境下我們更多會結合Spring來使用。而Spring的官方剛好基于RabbitMQ提供了這樣一套消息收發的模板工具:SpringAMQP
。并且還基于SpringBoot對其實現了自動裝配,使用起來非常方便。- SpringAMQP提供了三個功能:
- 自動聲明隊列、交換機及其綁定關系
- 基于注解的監聽器模式,異步接收消息
- 封裝了RabbitTemplate工具,用于發送消息
1.依賴和配置
<parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.7.12</version><relativePath/></parent><properties><maven.compiler.source>8</maven.compiler.source><maven.compiler.target>8</maven.compiler.target></properties><dependencies><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></dependency><!--AMQP依賴,包含RabbitMQ--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-amqp</artifactId></dependency><!--單元測試--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId></dependency></dependencies>
spring:rabbitmq:host: 192.168.198.148 # 你的虛擬機IPport: 5673 # 端口virtual-host: /dragon # 虛擬主機username: dragon # 用戶名password: 123 # 密碼
2.收發信息
這里是創建兩個springboot項目,在途中pom.xml文件粘貼依賴,在這兩個項目內的application.yaml粘貼配置。并且我在控制臺也已經手動創建simple.queue隊列。
接收消息:
隨便創建個類寫如下代碼
@Component
public class SpringRabbitListener {// 利用RabbitListener來聲明要監聽的隊列信息// 將來一旦監聽的隊列中有了消息,就會推送給當前服務,調用當前方法,處理消息。// 可以看到方法體中接收的就是消息體的內容@RabbitListener(queues = "simple.queue")//隊列名public void listenSimpleQueueMessage(String msg) throws InterruptedException {System.out.println("spring 消費者接收到消息:【" + msg + "】");}
}
發送消息:
在publisher項目的測試類里寫如下代碼
@SpringBootTest
public class SpringAmqpTest {@Resourceprivate RabbitTemplate rabbitTemplate;@Testpublic void testSimpleQueue() {// 隊列名稱String queueName = "simple.queue";// 消息String message = "hello, spring amqp!";// 發送消息rabbitTemplate.convertAndSend(queueName, message);}
}
先運行consumer項目的啟動類,再運行測試類發送信息,就可以看到在consumer項目控制臺接收信息了。
總結
以上就是簡單的消息收發,具體的編程化創建虛擬機,隊列以及收發信息,我會在講解交換機的文章中講解。