RabbitMQ細說之開篇
前言
關於消息中間件的應用場景,小夥伴們應該都耳熟能詳了吧,比如經常提到的削峰填谷、分散式事務、非同步業務處理、大數據分析等等,分散式消息隊列成為其中比較關鍵的橋樑,也就意味著小夥伴們得掌握相關技能;當下相對比較熱門的消息中間件有RabbitMQ、Kafaka、RocketMQ、ActiveMQ等,在實際應用場景中,發現很多小夥伴和我一樣都是跟著相關框架(CAP、Masstransit等)文檔進行使用,實現功能,並沒有關注消息隊列相關知識點,總感覺缺少點精髓,所以想著就以RabbitMQ為著手點,一起學習學習相關細節。
正文
1. 簡介
1.1 RabbitMQ 概要
RabbitMQ是基於Erlang語言開發的開源消息中間件,比較輕量級,廣泛應用於分散式系統中存儲消息、轉發消息,具有高可用,高可擴性,易用性等特徵。
RabbitMQ支援多種消息傳遞協議,默認採用的是AMQP協議,通過插件擴展的方式可以支援STOMP、MQTT、RabbitMQ Stream協議。
-
AMQP協議簡單理解
AMQP:(全稱:Advanced Message Queuing Protocol-是高級消息隊列協議) ,是一個提供統一消息服務的應用層標準高級消息隊列協議,是一種二進位協議;基於此協議的客戶端與消息中間件可傳遞消息,並不受客戶端/中間件不同產品、不同的開發語言等條件的限制。
-
核心組成部分
RabbitMQ基於AMQP實現,主要組成部分及流程如下:

上圖簡介:
生產者負責將消息投遞到伺服器中,消費者負責訂閱接收消息,然後進行對應的業務處理。經過的核心組成部分如下:
生產者(Producer) :負責產生消息,並將消息發送到伺服器上;
消費者(Consumer) :負責消息的消費,即訂閱消息,然後處理相關的業務邏輯;
Message :消息:服務與應用程式之間傳送的數據,由一些屬性和消息體組成,通過屬性可以設置消息的優先順序,延遲等高級特性;
伺服器(Server) :又稱Broker ,接受客戶端的連接。保證消息能夠按照指定的方式進行傳輸; 連接(Connection) :應用程式與Broker的網路連接(TCP-IP/ 三次握手和四次揮手); Channel:虛擬連接,它是基於Connection連接建立的,幾乎所有的操作都在Channel中進行,Channel是進行消息讀寫的通道,客戶端可以建立多個Channel,每個Channel代表一個會話任務;
Virtual Host 虛擬地址,用於進行邏輯隔離,一個虛擬主機可以有若干個Exchange和Queue,同一個虛擬主機裡面不能有相同名字的Exchange; 交換機(Exchange) :接受消息,根據路由鍵投遞消息到綁定的隊列,本身不具備消息存儲的能力; Bindings:Exchange和Queue之間的虛擬關係,Binding中可以有多個routing key; Routing key:是一個路由規則,虛擬機可以用它來確定如何路由一個特定消息; 隊列(Queue) :也稱為消息隊列(Message Queue),主要功能是保存消息並將其轉發給消費者;
具體詳細小夥伴可以看看官網(//www.rabbitmq.com/),接下來我們就開始安裝,然後先上手玩玩。
2. 安裝及介面簡介
2.1 安裝
按照傳統方式安裝,需要進行Erlang語言環境安裝、配置用戶,為了方便,這裡還是用我最喜歡(偷懶)的Docker方式安裝,關於Docker相關係列的教程,點擊《Docker系列》看詳細內容。
這裡演示還是使用阿里雲伺服器,完成Docker環境安裝之後,直接執行如下命令即可完成RabbitMq的安裝:
docker run -di --name RabbitDemo -e RABBITMQ_DEFAULT_USER=admin -e RABBITMQ_DEFAULT_PASS=admin -p 15672:15672 -p 5672:5672 -p 25672:25672 -p 61613:61613 -p 1883:1883 rabbitmq:management
命令簡介:
-d:指定後台啟動容器;
--name:指定容器名稱為RabbtiDemo;
-e: 指定環境變數,設置RabbitMQ的用戶名和密碼;
-p: 主機埠和容器埠的映射
埠簡介:
- 5672:RabbitMQ的通訊埠;
- 15672:RabbitMQ HTTP API的埠,啟動Management插件,可查看和管理RabbitMQ相關資訊。
- 25672:RabbitMQ節點間的CLI通訊埠;
- 1883、8883:MQTT插件啟動時的埠。
- 61613、61614:STOMP客戶端插件啟用時的埠。
- 15674、15675:基於Websocket的STOMP埠和MOTT埠
我們主要是來說說RabbitMQ默認的協議AMQP,所以這裡只關注5672、15672、25672即可。如果小夥伴也是用雲伺服器,則需要對應的埠添加到安全組和防火牆中。
通過docker ps 命令查看容器運行正常之後,就可以通過瀏覽器訪問RabbitMQ的管理頁面,如下:

輸入安裝時設置的用戶名和密碼就可以登錄到管理主介面了。
2.2 介面初識
-
首頁概覽
首頁會展示一些整體資訊,包括消息、節點等相關資訊。

-
連接(Connections)情況
對於Connections和Channels而言,默認安裝完是沒有的,這裡為了展示全一點的資訊,搞了個客戶端連上,在後續的程式碼實戰中我們會好好仔細說說。

點擊隊列名稱可以進入連接詳情,如果對應的用戶有許可權,可以強制關掉對應的連接。

-
Channels情況
Channel是基於Connection的,一個Connection中可以創建多個Channel,提高傳輸效率。

-
交換機(Exchangs)管理
交換機主要用來進行轉發消息,可以只設置模式,將消息投遞到隊列中。

裡面的具體參數資訊,後續會在實際演示情況的時候一一說到。
-
隊列(Queues)管理
隊列就是為存儲消息並將其轉發給消費者。

點擊隊列進入詳情頁面,可以綁定交換機等操作,如下:

-
用戶/許可權/虛擬主機(Virtual Host)等管理
用戶管理
針對不同的使用場景添加不同的用戶,並設置對應的許可權。

Virtual Hosts管理
Virtual Hosts的主要目的就是隔離、分類,可以理解為電腦文件夾,不同的文件進行歸類存放到對應的文件夾中,還可以對其進行設置相關的許可權,這樣就可以讓不同的用戶訪問到不同的隊列、交換機,互不影響。

創建好的虛擬主機點擊名字進詳情,還能配置對應的許可權。
FeatureFlags、Policies、Limits、Cluster是一些資訊顯示和額外配置,這裡先不截圖,後續用到的時候再細說。
2.3 角色分類細說
關於用戶角色,RabbitMQ已經內置了幾個,在創建用戶時可以進行選擇,如下圖:

為了演示方便,針對每種角色創建對應的用戶,如下:

每個角色對應的許可權說明如下:
-
Admin(Administrator)
最高層理許可權,可以查看所有資訊並進行相關資源的管理,如:創建和刪除Virtual Host、創建和刪除用戶、創建permmission、關閉所有用戶的連接。
上面的截圖就是管理員的操作介面,這裡就不重複截圖了。
-
Monitoring
可登陸管理控制台,同時可以查看rabbitmq節點的相關資訊(進程數,記憶體使用情況,磁碟使用情況等),可以管理對應的交換機和隊列。
在管理頁面只能查看策略,其他不能查看和管理:

其實Limits也不能配置,提示不是管理員許可權:

-
Policymaker
可登陸管理控制台,但無法查看節點的相關資訊,主要是進行策略的管理,同時也可以管理自己的交換機、隊列;

-
Management
可登陸管理控制台,無法看到節點相關的資訊,能管理自己相關的交換機、隊列等,無法對策略進行管理,其實可以理解為針對個人管理的許可權。

-
Impersonator
模擬角色,無法登陸管理控制台

-
None
不設置角色,無法登陸管理控制台,通常就是普通的生產者和消費者;

最後匯總為一張圖,許可權從低到高,如下:

3. 命令行工具
如果沒有安裝管理介面插件,或者說不喜歡用介面操作,也是可以用命令行工具完成介面的上相關操作的。RabbitMQ提供了如下命令行工具:
- rabbitmqctl:用於服務管理和一般操作員任務;
- rabbitmq-diagnostics:用於診斷和健康檢查;
- rabbitmq-plugins:用於插件管理;
- rabbitmq-queues:用於隊列上的維護任務,特別是仲裁隊列;
- rabbitmq-upgrade:用於與升級相關的維護任務;
這裡是將RabbitMQ以容器的方式啟動,所以進入容器可執行命令,以rabbitmqctl為例演示:
增加用戶,執行如下命令:

rabbitmqctl add_user codezyq zyq123456
新增成功,但還沒設置許可權,通過介面也可以看到沒有設置對應的許可權:

設置許可權,如下:
rabbitmqctl set_user_tags codezyq administrator
執行命令很簡單,上面只是演示,命令行工具功能可以實現管理介面的相關功能,小夥伴根據需要執行相關命令即可。
命令的功能解釋進入官網有詳解://www.rabbitmq.com/rabbitmqctl.8.html
總結
關於RabbitMQ安裝和理論先說這麼多,減少一些概念、名詞的糾結。控制篇幅,小夥伴們上WC的時間就能看完~~~;
下一篇聊聊交換機的各種模式,一起通過介面和程式碼的方式進行實踐。關注「Code綜藝圈」,和我一起學習吧。

















