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 的一點瑣碎知識,感興趣的小夥伴可以試試哦~

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章