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