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