RabbitMQ 中的 VirtualHost 該如何理解
當(dāng)我們第一次安裝好一個 RabbitMQ 之后,我們可能都會通過 Web 頁面去管理這個 RabbitMQ,默認(rèn)情況下,我們第一次使用的默認(rèn)用戶是 guest。
登錄成功后,在 admin 選項卡可以查看所有用戶:
可以看到,每個用戶都有一個 Can access virtual hosts 屬性,這個屬性是啥意思呢?
今天松哥來和大家稍微捋一捋。
1. 多租戶
RabbitMQ 中有一個概念叫做多租戶,怎么理解呢?
我們安裝一個 RabbitMQ 服務(wù)器,每一個 RabbitMQ 服務(wù)器都能創(chuàng)建出許多虛擬的消息服務(wù)器,這些虛擬的消息服務(wù)器就是我們所說的虛擬主機(virtual host),一般簡稱為 vhost。
本質(zhì)上,每一個 vhost 都是一個獨立的小型 RabbitMQ 服務(wù)器,這個 vhost 中會有自己的消息隊列、消息交換機以及相應(yīng)的綁定關(guān)系等等,并且擁有自己獨立的權(quán)限,不同的 vhost 中的隊列和交換機不能互相綁定,這樣技能保證運行安全又能避免命名沖突。
我們并不需要特別的去看待 vhost,他就跟普通的物理 RabbitMQ 一樣,不同的 vhost 能夠提供邏輯上的分離,確保不同的應(yīng)用消息隊列能夠安全獨立運行。
要我來說,我們該怎么看待 vhost 和 RabbitMQ 的關(guān)系呢?RabbitMQ 相當(dāng)于一個 Excel 文件,而 vhost 則是 Excel 文件中的一個個 sheet,我們所有的操作都是在某一個 sheet 上進(jìn)行操作。
本質(zhì)上來說,vhost 算是 AMQP 協(xié)議中的概念。
2. 命令行創(chuàng)建 vhost
先來看看如何通過命令行創(chuàng)建 vhost。
因為松哥這里的 RabbitMQ 是用 docker 安裝的,所以我們首先進(jìn)入到 docker 容器中:
- docker exec -it some-rabbit /bin/bash
然后執(zhí)行如下命令創(chuàng)建一個名為 /myvh 的 vhost:
- rabbitmqctl add_vhost myvh
最終執(zhí)行結(jié)果如下:
然后通過如下命令可以查看已有的 vhost:
- rabbitmqctl list_vhosts
當(dāng)然這個命令也可以添加兩個選項 name 和 tracing,name 表示 vhost 的名稱,tracing 則表示是否使用了 tracing 功能(tracing 可以幫助追蹤 RabbitMQ 中消息的流入流出情況),如下圖:
可以通過如下命令刪除一個 vhost:
- rabbitmqctl delete_vhost myvh
當(dāng)刪除一個 vhost 的時候,與這個 vhost 相關(guān)的消息隊列、交換機以及綁定關(guān)系等,統(tǒng)統(tǒng)都會被刪除。
給一個用戶設(shè)置 vhost:
- rabbitmqctl set_permissions -p myvh guest ".*" ".*" ".*"
前面參數(shù)都好說,最后面三個 ".*" 含義分別如下:
- 用戶在所有資源上都擁有可配置權(quán)限(創(chuàng)建/刪除消息隊列、創(chuàng)建/刪除交換機等)。
- 用戶在所有資源上都擁有寫權(quán)限(發(fā)消息)。
- 用戶在所有資源上都擁有讀權(quán)限(消息消費,清空隊列等)。
禁止一個用戶訪問某個 vhost:
- rabbitmqctl clear_permissions -p myvh guest
3. 管理頁面創(chuàng)建 vhost
當(dāng)然我們也可以在網(wǎng)頁端管理 vhost:
在 admin 選項卡中,點擊右邊的 Virtual Hosts,如下:
然后點擊下邊的 Add a new virtual host ,可以添加一個新的 vhost:
進(jìn)入到某一個 vhost 之后,可以修改其權(quán)限以及刪除一個 vhost,如下圖:
4. 用戶管理
因為 vhost 通常跟用戶一起出現(xiàn),所以這里我也順便說下 user 的相關(guān)操作。
添加一個用戶名為 javaboy,密碼為 123 的用戶,方式如下:
- rabbitmqctl add_user javaboy 123
通過如下命令可以修改用戶密碼(將 javaboy 的密碼改為 123456):
- rabbitmqctl change_password javaboy 123456
通過如下命令可以驗證用戶密碼:
- rabbitmqctl authenticate_user javaboy 123456
驗證成功和驗證失敗的情況分別如下:
通過如下命令可以查看當(dāng)前的所有用戶:
第一列是用戶名,第二列是用戶角色。
關(guān)于用戶角色,我在上篇文章中已經(jīng)聊過了,這里就不再贅述。傳送門:RabbitMQ 管理頁面該如何使用。
給用戶設(shè)置角色的命令如下(給 javaboy 設(shè)置 administrator 角色):
- rabbitmqctl set_user_tags javaboy administrator
最后,刪除一個用戶的命令如下:
- rabbitmqctl delete_user javaboy
5. 小結(jié)
好啦,關(guān)于 RabbitMQ 的一點瑣碎知識,感興趣的小伙伴可以試試哦~
本文轉(zhuǎn)載自微信公眾號「江南一點雨」,可以通過以下二維碼關(guān)注。轉(zhuǎn)載本文請聯(lián)系江南一點雨公眾號。











































