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實現,主要組成部分及流程如下:

    75184569eb6bd66ea56ec30c33f73018.png

    上圖簡介:

    生產者負責將消息投遞到服務器中,消費者負責訂閱接收消息,然后進行對應的業務處理。經過的核心組成部分如下:

    生產者(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的管理頁面,如下:

e667d01d68a16e8538e327f4fd766913.png

輸入安裝時設置的用戶名和密碼就可以登錄到管理主界面了。

2.2 界面初識
  • 首頁概覽

    首頁會展示一些整體信息,包括消息、節點等相關信息。

    c798b50a1667b0c452b63bf9b0142f3b.png
  • 連接(Connections)情況

    對于Connections和Channels而言,默認安裝完是沒有的,這里為了展示全一點的信息,搞了個客戶端連上,在后續的代碼實戰中我們會好好仔細說說。

    ab7c351f121307078e9f362345ec19c8.png

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

    15b85ac60aa67d7a2ca06a36182de61d.png
  • Channels情況

    Channel是基于Connection的,一個Connection中可以創建多個Channel,提高傳輸效率。

    12b1dcf604e0c3eb3b8ba3f25c583eda.png
  • 交換機(Exchangs)管理

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

    f4caa597f5979ac531ec26554a3d6620.png

    里面的具體參數信息,后續會在實際演示情況的時候一一說到。

  • 隊列(Queues)管理

    隊列就是為存儲消息并將其轉發給消費者。

    585566f53d6b4aa99de16c77574185fc.png

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

    f30893babab3d1817ad38b6afab6151d.png
  • 用戶/權限/虛擬主機(Virtual Host)等管理

    用戶管理

    針對不同的使用場景添加不同的用戶,并設置對應的權限。

    db0809b68eb6cb6db362321a542aebe4.png

    Virtual Hosts管理

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

    dcaa8adf61daa3c94d5dfc0833763fb5.png

    創建好的虛擬主機點擊名字進詳情,還能配置對應的權限。

    FeatureFlags、Policies、Limits、Cluster是一些信息顯示和額外配置,這里先不截圖,后續用到的時候再細說。

2.3 角色分類細說

關于用戶角色,RabbitMQ已經內置了幾個,在創建用戶時可以進行選擇,如下圖:

0da7653a744b224aa94a714bc45d222f.png

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

0378b58c994702aabfebc409f8578e01.png

每個角色對應的權限說明如下:

  • Admin(Administrator)

    最高管理權限,可以查看所有信息并進行相關資源的管理,如:創建和刪除Virtual Host、創建和刪除用戶、創建permmission、關閉所有用戶的連接。

    上面的截圖就是管理員的操作界面,這里就不重復截圖了。

  • Monitoring

    可登陸管理控制臺,同時可以查看rabbitmq節點的相關信息(進程數,內存使用情況,磁盤使用情況等),可以管理對應的交換機和隊列。

    在管理頁面只能查看策略,其他不能查看和管理:

    93d904613543f0d13fa6a477883a66ea.png

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

    1ebe9b9f0cff1b442ceb272de1df0e89.png
  • Policymaker

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

    94937e4ca8bc991ee0951c60d4e5ad20.png
  • Management

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

    7fe76af5b1df56e2a824efe24ac1ee15.png
  • Impersonator

    模擬角色,無法登陸管理控制臺

    3aa32a188a34de5fcb7df3c5ffe9fb6b.png
  • None

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

    6b7a16f7d83072f44a7bc29fccee7cfc.png

最后匯總為一張圖,權限從低到高,如下:

675644c05bfbfe59cc14551a6a759989.png

3. 命令行工具

如果沒有安裝管理界面插件,或者說不喜歡用界面操作,也是可以用命令行工具完成界面的上相關操作的。RabbitMQ提供了如下命令行工具:

  • rabbitmqctl:用于服務管理和一般操作員任務;

  • rabbitmq-diagnostics:用于診斷和健康檢查;

  • rabbitmq-plugins:用于插件管理;

  • rabbitmq-queues:用于隊列上的維護任務,特別是仲裁隊列;

  • rabbitmq-upgrade:用于與升級相關的維護任務;

這里是將RabbitMQ以容器的方式啟動,所以進入容器可執行命令,以rabbitmqctl為例演示:

增加用戶,執行如下命令:

dac23c2c2ee5d77d553fa87c93fc2a0a.png
rabbitmqctl?add_user?codezyq?zyq123456

新增成功,但還沒設置權限,通過界面也可以看到沒有設置對應的權限:

59f2adb7a86de7f4ccdf971edaec18d3.png

設置權限,如下:

rabbitmqctl?set_user_tags?codezyq?administrator

執行命令很簡單,上面只是演示,命令行工具功能可以實現管理界面的相關功能,小伙伴根據需要執行相關命令即可。

命令的功能解釋進入官網有詳解:https://www.rabbitmq.com/rabbitmqctl.8.html

總結

關于RabbitMQ安裝和理論先說這么多,減少一些概念、名詞的糾結。控制篇幅,小伙伴們上WC的時間就能看完~~~;

下一篇聊聊交換機的各種模式,一起通過界面和代碼的方式進行實踐。關注“Code綜藝圈”,和我一起學習吧。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/284418.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/284418.shtml
英文地址,請注明出處:http://en.pswp.cn/news/284418.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【Java】五種常見排序之-----------冒泡排序

冒泡排序: 原理: 將關鍵字較小的值不斷地上浮,將關鍵字值較大的不斷下沉;時間復雜度:O(n^2)空間復雜度:最優(即已經排好序)為0,平均空間復雜度為O(1);核心代碼:for(int i…

混戰的低代碼江湖,如何區分「李逵」和「李鬼」?

作者:APICloud 創始人劉鑫 這兩年,無論是資本層面,還是企業IT部門的關注,“低代碼”都是絕對的熱點。互聯網圈也似在一夜之間冒出了各種各樣的低代碼公司。 到底什么是低代碼?低代碼是新技術么?低代碼開發能…

關于捕獲鍵盤信息的processDialogkey方法2--具體應用

自定義控件里的keydown方法無法捕獲所有的按鍵消息的處理方法1(自定義控件里的keydown方法無法獲取的鍵值如上下左右鍵等) 處理辦法具體如下: 1、首先在自定義控件UserControl1中重寫ProcessDialogKey方法 自定義控件UserControl1中重寫Proce…

指針

指針 題目一: 計算兩數的和與差 本題要求實現一個計算輸入的兩數的和與差的簡單函數。 函數接口定義: void sum_diff( float op1, float op2, float psum, float pdiff ); 其中op1和op2是輸入的兩個實數,psum和pdiff是計算得出的和與差。 裁判…

【MapGIS精品教程】006:MapGIS根據經緯度計算各比例尺圖幅編號

己知某點的經緯度或圖幅西南圖廓點的經緯度,計算該點所在圖幅號。 例題一:某點的經度為11433′45″,緯度為3922′30″,計算所在1:250000圖幅的編號。 文章目錄 1. 公式計算編號的方法2. 軟件計算編號的方法1. 公式計算編號的方法 求解過程: 第一步,利用下列公式計算其所…

寫出一個緩存系統的偽代碼001

/*** 寫出一個緩存系統的偽代碼*/ public class CacheDemo {private Map<String, Object> map new HashMap<String, Object>();public static void main(String[] args) {// TODO Auto-generated method stub} public synchronized Object getData(String key)…

分析完百年飛機空難數據,我發現了這幾條“保命”小秘訣

來 源&#xff5c;Giao數據 數 據 | YaJie 文 章 | 張子豪,YaJie 本文爬取了飛機失事網1908-2020年空難相關數據&#xff0c;包括空難發生次數、機組和乘客的死亡人數與死亡率、不同季節的空難發生次數、空難相關文本的關鍵詞、空難高發地、空難高發航空公司、空難高發機型以…

用 QuestPDF操作生成PDF更快更高效!

QuestPDFQuestPDF是一個開源的工具庫&#xff0c;可以在.NET或者.Net Core中生成pdf文檔它提供了一個布局引擎&#xff0c;設計時考慮到了完整的分頁支持以及靈活性要求&#xff01;比市面上常見的Aspose和iTextSharp好用太多了&#xff01;GitHub地址安裝Install-Package Ques…

ASP.NET vs MVC vs WebForms

許多ASP.NET開發人員開始接觸MVC認為MVC與ASP.NET完全沒有關系&#xff0c;是一個全新的Web開發&#xff0c;事實上ASP.NET是創建WEB應用的框架而MVC是能夠用更好的方法來組織并管理代碼的一種更高級架構體系&#xff0c;所以可以稱之為ASP.NET MVC。 我們可將原來的ASP.NET稱為…

產品經理有哪些類型?

不知道大家是如何給產品經理這個職業進行分類&#xff0c; 按負責的產品&#xff1f;按等級&#xff1f;按工作年限&#xff1f;按工作方向等&#xff1f; 一、按工作內容分 1. 功能設計產品經理 最常見的了&#xff0c;負責的工作就是設計出功能來。從 APP 的界面&#xff0…

在Blazor 中自定義權限驗證

Blazor是什么Blazor 是微軟在 .NET 里推出的一個 WEB 客戶端 UI 交互的框架&#xff0c;使用 Blazor 你可以代替 JavaScript 來實現自己的頁面交互邏輯&#xff0c;可以很大程度上進行 C# 代碼的復用&#xff0c;Blazor 對于 .NET 開發人員來說是一個不錯的選擇。需求背景其實我…

看出每個應用程序最高可用內存是多少

int maxMemory (int) (Runtime.getRuntime().maxMemory() / 1024); Log.d("TAG", "Max memory is " maxMemory "KB"); 轉載于:https://www.cnblogs.com/coderwjq/p/6501639.html

中文分詞之HMM模型詳解

文章轉載自: http://yanyiwu.com/work/2014/04/07/hmm-segment-xiangjie.html HMM(Hidden Markov Model): 隱式馬爾科夫模型。 HMM模型可以應用在很多領域&#xff0c;所以它的模型參數描述一般都比較抽象&#xff0c;以下篇幅針對HMM的模型參數介紹直接使用它在中文分詞中的實…

【ArcGIS微課1000例】0035:地圖面狀符號設計教程

地圖符號是表示地圖內容的基本手段,它由形狀不同、大小不一、色彩有別的圖形和文字組成。 地圖符號是地圖的語言,是一種圖形語言。它與文字語言相比較,最大的特點是形象直觀,一目了然。 本文講解ArcGIS中面狀符號設計方法。 文章目錄 一、新建符號樣式二、面狀符號設計1. 斜…

MySQL奪命15問,你能堅持到第幾問?

前言 MySQL在面試中經常被問到&#xff0c;本文總結了面試中的經典問題。 1. 數據庫三大范式是什么&#xff1f; 第一范式&#xff1a;每個列都不可以再拆分。 第二范式&#xff1a;在第一范式的基礎上&#xff0c;非主鍵列完全依賴于主鍵&#xff0c;而不能是依賴于主鍵的一部…

ios元素定位

原文地址http://www.cnblogs.com/meitian/p/7373460.html 第一種&#xff1a;通過Appium1.6的Inspector來查看 具體安裝方式前面的隨筆已經介紹了&#xff1a;http://www.cnblogs.com/meitian/p/7360017.html可以通過定位找到元素xpath或name個人不推薦用這個方法&#xff0c;實…

分治法——循環賽日程表

1、問題描述&#xff1a;有n2^k個遠動員選手&#xff0c;設計比賽日程表實現&#xff1a;&#xff08;1&#xff09;每個選手必須與n-1個選手比賽&#xff08;2&#xff09;每個選手一天只比賽一場&#xff08;3&#xff09;比賽共進行n-1天輸入&#xff1a;n人輸出&#xff1a…

使用 LSM-Tree 思想基于.NET 6.0 C# 寫個 KV 數據庫(案例版)

文章有點長&#xff0c;耐心看完應該可以懂實際原理到底是啥子。這是一個KV數據庫的C#實現&#xff0c;目前用.NET 6.0實現的&#xff0c;目前算是屬于雛形&#xff0c;骨架都已經完備&#xff0c;畢竟剛完工不到一星期。當然&#xff0c;這個其實也算是NoSQL的雛形&#xff0c…

35.使用攔截器實現權限驗證

轉自&#xff1a;https://wenku.baidu.com/view/84fa86ae360cba1aa911da02.html 為了說明此問題&#xff0c;我們建立struts2auth項目&#xff0c;流程圖如下&#xff1a; 簡短說明&#xff1a;當我們訪問main.jsp頁面&#xff0c;并試圖通過此頁面中的鏈接地址&#xff1a;not…

如何保證緩存和數據庫的一致性?

1. 問題分析 2. Cache-Aside 2.1 讀緩存 2.2 寫緩存 2.3 延遲雙刪 2.4 如何確保原子性 3. Read-Through/Write-Through 3.1 Read-Through 3.2 Write-Through 4. Write Behind 很多小伙伴在面試的時候&#xff0c;應該都遇到過類似的問題&#xff0c;如何確保緩存和數據庫…