前言
關于消息中間件的應用場景,小伙伴們應該都耳熟能詳了吧,比如經常提到的削峰填谷、分布式事務、異步業務處理、大數據分析等等,分布式消息隊列成為其中比較關鍵的橋梁,也就意味著小伙伴們得掌握相關技能;當下相對比較熱門的消息中間件有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),主要功能是保存消息并將其轉發給消費者;
具體詳細小伙伴可以看看官網(https://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
執行命令很簡單,上面只是演示,命令行工具功能可以實現管理界面的相關功能,小伙伴根據需要執行相關命令即可。
命令的功能解釋進入官網有詳解:https://www.rabbitmq.com/rabbitmqctl.8.html
總結
關于RabbitMQ安裝和理論先說這么多,減少一些概念、名詞的糾結。控制篇幅,小伙伴們上WC的時間就能看完~~~;
下一篇聊聊交換機的各種模式,一起通過界面和代碼的方式進行實踐。關注“Code綜藝圈”,和我一起學習吧。