關於訊息中介軟體的應用場景,小夥伴們應該都耳熟能詳了吧,比如經常提到的削峰填谷、分散式事務、非同步業務處理、巨量資料分析等等,分散式訊息佇列成為其中比較關鍵的橋樑,也就意味著小夥伴們得掌握相關技能;當下相對比較熱門的訊息中介軟體有RabbitMQ、Kafaka、RocketMQ、ActiveMQ等,在實際應用場景中,發現很多小夥伴和我一樣都是跟著相關框架(CAP、Masstransit等)檔案進行使用,實現功能,並沒有關注訊息佇列相關知識點,總感覺缺少點精髓,所以想著就以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/),接下來我們就開始安裝,然後先上手玩玩。
按照傳統方式安裝,需要進行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: 主機埠和容器埠的對映
埠簡介:
我們主要是來說說RabbitMQ預設的協定AMQP,所以這裡只關注5672、15672、25672即可。如果小夥伴也是用雲伺服器,則需要對應的埠新增到安全組和防火牆中。
通過docker ps
命令檢視容器執行正常之後,就可以通過瀏覽器存取RabbitMQ的管理頁面,如下:
輸入安裝時設定的使用者名稱和密碼就可以登入到管理主介面了。
首頁概覽
首頁會展示一些整體資訊,包括訊息、節點等相關資訊。
連線(Connections)情況
對於Connections和Channels而言,預設安裝完是沒有的,這裡為了展示全一點的資訊,搞了個使用者端連上,在後續的程式碼實戰中我們會好好仔細說說。
點選佇列名稱可以進入連線詳情,如果對應的使用者有許可權,可以強制關掉對應的連線。
Channels情況
Channel是基於Connection的,一個Connection中可以建立多個Channel,提高傳輸效率。
交換機(Exchangs)管理
交換機主要用來進行轉發訊息,可以只設定模式,將訊息投遞到佇列中。
裡面的具體引數資訊,後續會在實際演示情況的時候一一說到。
佇列(Queues)管理
佇列就是為儲存訊息並將其轉發給消費者。
點選佇列進入詳情頁面,可以繫結交換機等操作,如下:
使用者/許可權/虛擬主機(Virtual Host)等管理
使用者管理
針對不同的使用場景新增不同的使用者,並設定對應的許可權。
Virtual Hosts管理
Virtual Hosts的主要目的就是隔離、分類,可以理解為電腦資料夾,不同的檔案進行歸類存放到對應的資料夾中,還可以對其進行設定相關的許可權,這樣就可以讓不同的使用者存取到不同的佇列、交換機,互不影響。
建立好的虛擬主機點選名字進詳情,還能設定對應的許可權。
FeatureFlags、Policies、Limits、Cluster是一些資訊顯示和額外設定,這裡先不截圖,後續用到的時候再細說。
關於使用者角色,RabbitMQ已經內建了幾個,在建立使用者時可以進行選擇,如下圖:
為了演示方便,針對每種角色建立對應的使用者,如下:
每個角色對應的許可權說明如下:
Admin(Administrator)
最高管理許可權,可以檢視所有資訊並進行相關資源的管理,如:建立和刪除Virtual Host、建立和刪除使用者、建立permmission、關閉所有使用者的連線。
上面的截圖就是管理員的操作介面,這裡就不重複截圖了。
Monitoring
可登陸管理控制檯,同時可以檢視rabbitmq節點的相關資訊(程序數,記憶體使用情況,磁碟使用情況等),可以管理對應的交換機和佇列。
在管理頁面只能檢視策略,其他不能檢視和管理:
其實Limits也不能設定,提示不是管理員許可權:
Policymaker
可登陸管理控制檯,但無法檢視節點的相關資訊,主要是進行策略的管理,同時也可以管理自己的交換機、佇列;
Management
可登陸管理控制檯,無法看到節點相關的資訊,能管理自己相關的交換機、佇列等,無法對策略進行管理,其實可以理解為針對個人管理的許可權。
Impersonator
模擬角色,無法登陸管理控制檯
None
不設定角色,無法登陸管理控制檯,通常就是普通的生產者和消費者;
最後彙總為一張圖,許可權從低到高,如下:
如果沒有安裝管理介面外掛,或者說不喜歡用介面操作,也是可以用命令列工具完成介面的上相關操作的。RabbitMQ提供瞭如下命令列工具:
這裡是將RabbitMQ以容器的方式啟動,所以進入容器可執行命令,以rabbitmqctl為例演示:
增加使用者,執行如下命令:
rabbitmqctl add_user codezyq zyq123456
新增成功,但還沒設定許可權,通過介面也可以看到沒有設定對應的許可權:
設定許可權,如下:
rabbitmqctl set_user_tags codezyq administrator
執行命令很簡單,上面只是演示,命令列工具功能可以實現管理介面的相關功能,小夥伴根據需要執行相關命令即可。
命令的功能解釋進入官網有詳解:https://www.rabbitmq.com/rabbitmqctl.8.html
關於RabbitMQ安裝和理論先說這麼多,減少一些概念、名詞的糾結。控制篇幅,小夥伴們上WC的時間就能看完~~~;
下一篇聊聊交換機的各種模式,一起通過介面和程式碼的方式進行實踐。關注「Code綜藝圈」,和我一起學習吧。