『RabbitMQ』入門指南(安裝,配置,應用)

前言

RabbitMQ 是在 AMQP(Advanced Message Queuing Protocol) 協議標準基礎上完整的,可復用的企業消息系統。它遵循 Mozilla Public License 開源協議,采用 Erlang 實現的工業級的消息隊列(MQ)服務器,建立在 Erlang OTP 平臺上(因為采用 Erlang 開發,所以 RabbitMQ 穩定性和可靠性比較高

其他主流 MQ 產品

  • ActiveMQ:Apache 出品,最流行的,能力強勁的開源消息總線,基于 JMS(Java Message Service)規范
  • RocketMQ:阿里低延遲、高并發、高可用、高可靠的分布式消息中間件,基于 JMS,目前由 Apache 基金會維護
  • Kafka:分布式,分區的,多副本的,多訂閱者的消息發布訂閱系統(分布式 MQ 系統),可以用于搜索日志,監控日志,訪問日志等

本文為 RabbitMQ 入門教程,主要將會講解 RabbitMQ 安裝配置(Windows),相關概念,及項目中具體應用

image.png

安裝

Erlang

官網下載鏈接:Downloads - Erlang/OTP

RabbitMQ 服務器必須首先安裝 Erlang 運行環境,同時安裝時需要注意 RabbityMQ 所依賴的 Erlang 版本,我們可以查看下方官方版本對應信息

版本對應:RabbitMQ Erlang Version Requirements — RabbitMQ

本次使用版本 Erlang OTP 25.3(點擊跳轉下載鏈接)

image.png

雙擊執行 exe 安裝程序,除了安裝路徑其他都按照默認即可

然后配置環境變量

ERLANG_HOME = D:\Erlang\Erlang\Erlang OTP

并且添加 /bin 目錄到 Path 環境變量中,即添加 %ERLANG_HOME%\bin 到 Path 中

安裝配置之后,打開 CMD,輸入 erl 然后回車鍵,會彈出版本信息,表示 Erlang 安裝成功

RabbitMQ

官方下載頁面:RabbitMQ Changelog — RabbitMQ

下載鏈接: RabbitMQ 3.12.0

安裝 exe 文件,執行安裝包,同樣除了安裝路徑外其他保持默認

配置環境變量

RABBITMQ_SERVER = D:\RabbitMQ\RabbitMQ\rabbitmq_server-3.12.0

然后添加 %RABBITMQ_SERVER%\sbin 到 Path 環境變量中

查看所有插件

rabbitmq-plugins list

注:如果出現問題請參考最后一章 徹底卸載

image.png

之后我們需要安裝 rabbitmq_management 插件,可以使用可視化的方式查看 RabbitMQ 服務器實例的狀態,以及操控 RabbitMQ 服務器

# 安裝插件
rabbitmq-plugins enable rabbitmq_management

訪問管理界面: http://localhost:15672/ (賬號密碼:guest / guest)

image.png

前期安裝配置完畢,下面可以配合官方入門文檔學習

官方文檔:RabbitMQ Tutorials — RabbitMQ

消息隊列

定義

消息指的是兩個應用間傳遞的數據。數據的類型有很多種形式,可能只包含文本字符串,也可能包含嵌入對象。

“消息隊列(Message Queue)”是在消息的傳輸過程中保存消息的容器。在消息隊列中,通常有生產者和消費者兩個角色。生產者只負責發送數據到消息隊列,誰從消息隊列中取出數據處理,他不管。消費者只負責從消息隊列中取出數據處理,他不管這是誰發送的數據

image.png

作用

解耦。如圖所示。假設有系統 B、C、D 都需要系統 A 的數據,于是系統 A 調用三個方法發送數據到 B、C、D。這時,系統 D 不需要了,那就需要在系統 A 把相關的代碼刪掉。假設這時有個新的系統 E 需要數據,這時系統 A 又要增加調用系統 E 的代碼。為了降低這種強耦合,就可以使用 MQ,系統 A 只需要把數據發送到 MQ,其他系統如果需要數據,則從 MQ 中獲取即可

image.png

異步。如圖所示。一個客戶端請求發送進來,系統 A 會調用系統 B、C、D 三個系統,同步請求的話,響應時間就是系統 A、B、C、D 的總和,也就是 800ms。如果使用 MQ,系統 A 發送數據到 MQ,然后就可以返回響應給客戶端,不需要再等待系統 B、C、D 的響應,可以大大地提高性能。對于一些非必要的業務,比如發送短信,發送郵件等等,就可以采用 MQ

image.png

削峰。如圖所示。這其實是 MQ 一個很重要的應用。假設系統 A 在某一段時間請求數暴增,有 5000 個請求發送過來,系統 A 這時就會發送 5000 條 SQL 進入 MySQL 進行執行,MySQL 對于如此龐大的請求當然處理不過來,MySQL 就會崩潰,導致系統癱瘓。如果使用 MQ,系統 A 不再是直接發送 SQL 到數據庫,而是把數據發送到 MQ,MQ 短時間積壓數據是可以接受的,然后由消費者每次拉取 2000 條進行處理,防止在請求峰值時期大量的請求直接發送到 MySQL 導致系統崩潰

image.png

特點

可靠性:通過支持消息持久化,支持事務,支持消費和傳輸的 ack 等來確保可靠性

路由機制:支持主流的訂閱消費模式,如廣播,訂閱,headers 匹配等

擴展性:多個 RabbitMQ 節點可以組成一個集群,也可以根據實際業務情況動態地擴展集群中節點

高可用性:隊列可以在集群中的機器上設置鏡像,使得在部分節點出現問題的情況下隊仍然可用

多種協議:RabbitMQ 除了原生支持 AMQP 協議,還支持 STOMP,MQTT 等多種消息中間件協議

多語言客戶端:RabbitMQ 幾乎支持所有常用語言,比如 Java、Python、Ruby、PHP、C#、JavaScript 等

管理界面:RabbitMQ 提供了易用的用戶界面,使得用戶可以監控和管理消息、集群中的節點等

插件機制:RabbitMQ 提供了許多插件,以實現從多方面進行擴展,當然也可以編寫自己的插件

應用

本章將會集成 rabbitmq 到 SpringBoot 中,并使用 rabbitmq-provider (生產者)和 rabbitmq-consumer(消費者) 兩個項目進行具體講解, 也可以在父項目中創建這兩個模塊(本文采用父子模塊方式)

所有代碼示例已經上傳到 GitHub 倉庫

倉庫地址:ReturnTmp/rabbitmq-demo: rabbitmq 實例代碼 (github.com)

生產者

配置

創建子模塊 rabbitmq-provider

依賴配置(也可以 IDEA 初始化模塊直接勾選)

        <!--rabbitmq--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-amqp</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency>

application.yml

server:  port: 8021  
spring:  application:  name: rabbitmq-provider  rabbitmq:  host: 127.0.0.1  port: 5672  username: root  password: 111111  virtual-host: RootHost

其中虛擬 host 配置項不是必須的,需要自行創建 vhost,如果未自行創建,默認為 virtual-host: /

注:vhost 可以理解為虛擬 broker,即 mini-RabbitMQ?server,其內部均含有獨立的 queue、bind、exchange 等,最重要的是擁有獨立的權限系統,可以做到 vhost 范圍內的用戶控制。當然,從 RabbitMQ 全局角度,vhost 可以作為不同權限隔離的手段

可以按照如下步驟創建 vhost

image.png

然后創建用戶(管理員)

image.png

然后我們需要為用戶分配權限,指定使用我們剛剛創建的 vhost

image.png

代碼

創建直連交換機配置類

注:RabbitMQ 共有四種交換機,分別為:直連交換機,扇形交換機,主題交換機,首部交換機。這里使用直連交換機演示,其他讀者可以自行嘗試

@Configuration
public class DirectRabbitConfig {//隊列 起名:TestDirectQueue@Beanpublic Queue TestDirectQueue() {// durable:是否持久化,默認是false,持久化隊列:會被存儲在磁盤上,當消息代理重啟時仍然存在,暫存隊列:當前連接有效// exclusive:默認也是false,只能被當前創建的連接使用,而且當連接關閉后隊列即被刪除。此參考優先級高于durable// autoDelete:是否自動刪除,當沒有生產者或者消費者使用此隊列,該隊列會自動刪除。//   return new Queue("TestDirectQueue",true,true,false);//一般設置一下隊列的持久化就好,其余兩個就是默認falsereturn new Queue("TestDirectQueue", true);}//Direct交換機 起名:TestDirectExchange@BeanDirectExchange TestDirectExchange() {//  return new DirectExchange("TestDirectExchange",true,true);return new DirectExchange("TestDirectExchange", true, false);}//綁定  將隊列和交換機綁定, 并設置用于匹配鍵:TestDirectRouting@BeanBinding bindingDirect() {return BindingBuilder.bind(TestDirectQueue()).to(TestDirectExchange()).with("TestDirectRouting");}@BeanDirectExchange lonelyDirectExchange() {return new DirectExchange("lonelyDirectExchange");}}

然后寫簡單的接口進行消息推送(可以視情況寫為定時任務)

@RestController
public class SendMessageController {@AutowiredRabbitTemplate rabbitTemplate;  //使用RabbitTemplate,這提供了接收/發送等等方法@GetMapping("/sendDirectMessage")public String sendDirectMessage() {String messageId = String.valueOf(UUID.randomUUID());String messageData = "test message, hello!";String createTime = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));Map<String, Object> map = new HashMap<>();map.put("messageId", messageId);map.put("messageData", messageData);map.put("createTime", createTime);//將消息攜帶綁定鍵值:TestDirectRouting 發送到交換機TestDirectExchangerabbitTemplate.convertAndSend("TestDirectExchange", "TestDirectRouting", map);return "ok";}
}

啟動項目,調用接口: http://localhost:8021/sendDirectMessage

查看 RabbitMQ 管理頁面查看是否推送成功

image.png

image.png

消費者

配置

創建子模塊 rabbitmq-consumer

依賴配置

        <!--rabbitmq--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-amqp</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency>

application.yml

server:  port: 8022  
spring:  application:  name: rabbitmq-consumer  rabbitmq:  host: 127.0.0.1  port: 5672  username: root  password: 111111  virtual-host: RootHost
代碼

創建消息接收監聽類

@Component
@RabbitListener(queues = "TestDirectQueue")
public class DirectReceiver {@RabbitHandlerpublic void process(Map testMessage) {System.out.println("DirectReceiver receive message: " + testMessage.toString());}
}

之后啟動項目,查看消費者接收情況

image.png

序列化

發送接收消息可能出現 Failed to convert message 問題,可以通過使用 JSON 序列化傳輸信息方式解決

生產者
@Configuration
public class RabbitMQConfig implements InitializingBean {/*** 自動注入RabbitTemplate模板*/@Resourceprivate RabbitTemplate rabbitTemplate;/*** 發送消息JSON序列化*/@Overridepublic void afterPropertiesSet() {//使用JSON序列化rabbitTemplate.setMessageConverter(new Jackson2JsonMessageConverter());}
}
消費者
@Configuration
public class RabbitMQConfig {@Beanpublic MessageConverter jsonMessageConverter(ObjectMapper objectMapper) {return new Jackson2JsonMessageConverter(objectMapper);}
}

徹底卸載

我們安裝中可能出現各種問題,一般情況下是 RabbitMQ 和 Erlang 版本不對應,需要完全卸載 RabbitMQ 和 Erlang,可以按照如下步驟卸載

注:博主首次安裝使用的是 Erlang 20.3 Rabbit 3.7.15 ,之后似乎小版本不對應,出現問題,需要重新卸載安裝

(1)打開 Windows 控制面板,雙擊“程序和功能”。

(2)在當前安裝的程序列表中,右鍵單擊 RabbitMQ Server,然后單擊“卸載”。

(3)在當前安裝的程序列表中,右鍵單擊“Erlang OTP”,然后單擊“卸載”。

(4)打開 Windows 任務管理器。

(5)在任務管理器中,查找進程 epmd.exe。 如果此進程仍在運行,請右鍵單擊該進程,然后單擊“結束進程”。

(6)刪除 RabbitMQ 和 Erlang 的所有安裝目錄。

(7)刪除文件 C:\Windows\System32\config\systemprofile.erlang.cookie如果存在)。

(8)轉到用戶文件夾:C:\Users\[username],然后刪除文件.erlang.cookie。

(9)同樣在 User 文件夾中,轉到 AppData \ Roaming \ RabbitMQ。刪除 RabbitMQ 文件夾。

(10)刪除注冊表 HKEY_LOCAL_MACHINE\SOFTWARE\Ericsson\Erlang\ErlSrv 的子項。

(11)打開運行 cmd->sc delete RabbitMQ。

(12)打開運行->regedit 找到 RabbitMQ 節點,刪掉即可(如果存在

參考鏈接

  • Windows 下安裝 RabbitMQ 服務器及基本配置 - 藍之風 - 博客園 (cnblogs.com)
  • RabbitMQ Windows 安裝、配置、使用 - 小白教程-阿里云開發者社區 (aliyun.com)
  • Windows 如何完全卸載 RabbitMQ 和 Erlang 刪除注冊表
  • windows 下 Erlang 與 RabbitMQ 重新安裝時,由于卸載不干凈導致各類錯誤
  • 超詳細的 RabbitMQ 入門,看這篇就夠了!-阿里云開發者社區 (aliyun.com)
  • RabbitMQ 整合 Spring Boot,實現 Hello World
  • Springboot 整合 RabbitMq ,用心看完這一篇就夠了
  • RabbitMq 核心知識點小結 - 知乎 (zhihu.com)
  • RabbitMQ消費消息坑:failed to convert serialized Message content - jiuchengi

本文由博客一文多發平臺 OpenWrite 發布!

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

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

相關文章

產品經理提問常用的ChatGPT通用提示詞模板

如何評估產品市場的潛力和可行性&#xff1f; 如何定義和明確產品的目標用戶和需求&#xff1f; 如何進行競品分析和比較&#xff0c;制定產品的差異化策略&#xff1f; 如何設計產品的功能和特性&#xff0c;滿足用戶需求&#xff1f; 如何制定產品的定價策略和銷售計劃&a…

qml View3D使用介紹

在Qt Quick 3D中,View3D 是一個用于展示 3D 內容的 QML 類型。View3D 允許你將 3D 場景集成到 Qt Quick 2D 用戶界面中,這意味著你可以在傳統的 2D UI 元素(如按鈕、文本和圖像)與 3D 圖形之間無縫地進行整合。 View3D 提供了一個視口,用于渲染 3D 場景。它可以包括多個 …

HTTPS攻擊怎么防御?

HTTPS 簡介 超文本傳輸安全協議&#xff08; HTTPS &#xff09;是一種通過計算機網絡進行安全通信的傳輸協議。HTTPS 經由 HTTP 進行通信&#xff0c;但利用 SSL/TLS 來加密數據包。 HTTPS 開發的主要目的&#xff0c;是提供對網站服務器的身份認證&#xff0c;保護交換數據的…

批量將本地N個英文Html文檔進行中文翻譯-操作篇

Unity3D特效百例案例項目實戰源碼Android-Unity實戰問題匯總游戲腳本-輔助自動化Android控件全解手冊再戰Android系列Scratch編程案例軟考全系列Unity3D學習專欄藍橋系列ChatGPT和AIGC &#x1f449;關于作者 專注于Android/Unity和各種游戲開發技巧&#xff0c;以及各種資源分…

QtCreator9.02不支持JDK11解決

最終效果 使用Android Studio 下載Android SDK Platform 31與Sources for Android 31 下載Android SDK Build Tools 31.0.0 下載NDK 25.1 ,23.1 ,21.3 重要: 下載Android SDK Command-Line Tools ,選擇10.0或者9.0其中一個版本 其它版本不支持JDK11 ,本例選擇10.0 下載CMak…

如何進行MySQL的主從復制(MySQL5.7)

背景&#xff1a;在一些Web服務器開發中&#xff0c;系統用戶在進行數據訪問時&#xff0c;基本都是直接操作數據庫MySQL進行訪問&#xff0c;而這種情況下&#xff0c;若只有一臺MySQL服務器&#xff0c;可能會存在如下問題 數據的讀和寫的所有壓力都會由一臺數據庫獨…

淺析jdk8所包含的主要特性

至今Java 8仍然是許多開發者首選的JDK版本&#xff0c;Java 8的生態系統非常成熟&#xff0c;許多庫和框架都已經適配了Java 8。遷移到新的Java版本可能需要重新評估和調整現有的依賴關系&#xff0c;這對于一些大型項目可能是一個挑戰。那么Java 8有哪些特性讓多數開發者鐘愛呢…

西米支付:如何設計和構建游戲支付系統?

如何設計和構建游戲支付系統&#xff1f; 目前&#xff0c;游戲開發中最常見的支付方式包括微信支付、支付寶支付和蘋果支付等。今天&#xff0c;我將與大家分享游戲支付系統的架構和設計。 游戲支付的主要業務流程是指游戲玩家在游戲中購買虛擬物品或服務所進行的支付過程。一…

ElasticSearch 7 SQL 詳解

平時使用Elasticsearch的時候,會在Kibana中使用Query DSL來查詢數據.每次要用到Query DSL時都基本忘光了,需要重新在回顧一遍,最近發現Elasticsearch已經支持SQL查詢了(6.3版本以后),整理了下一些用法. 簡介 Elasticsearch SQL是一個X-Pack組件,它允許針對Elasticsearch實時執…

ESP32之避障

ESP32之避障 圖片 程序 int Led27;//定義LED 接口 int buttonpin4; //定義光遮斷傳感器接口 int val;//定義數字變量val void setup() { pinMode(Led,OUTPUT);//定義LED 為輸出接口 pinMode(buttonpin,INPUT);//定義避障傳感器為輸出接口 } void loop() {Serial.begin(9600);…

保姆級 Keras 實現 YOLO v3 一

保姆級 Keras 實現 YOLO v3 一 一. YOLO v3 總覽二. 特征提取網絡特征提取網絡代碼實現 三. 特征融合特征融合代碼實現 四. 網絡輸出模型輸出代碼實現 五. 網絡模型代碼實現六. 代碼下載 如果要給 YOLO 目標檢測算法一個評價的話, 就是快和準, 現在已經到了 v8, 但是我為什么還…

如何開啟MySQL的慢查詢日志

說明&#xff1a;如果需要查看某一條SQL查詢速度慢&#xff0c;并對慢的SQL進行優化&#xff0c;那么開啟MySQL慢查詢日志是一定要做的事情&#xff0c;本文介紹如何開啟MySQL的慢查詢日志&#xff1b; 查看MySQL慢查詢是否開啟 首先&#xff0c;輸入下面的命令&#xff0c;查…

為什么 x86 操作系統從 0x7c00 處開始

0x00&#xff1a;x86 架構 BIOS 引導加載程序中的"0x7C00"之謎 你知道 x86 操作系統中的"0x7C00"這個神奇數字嗎 ? "0x7C00" 是BIOS加載MBR&#xff08;主引導記錄&#xff0c;磁盤中的第一個扇區&#xff09;的內存地址。操作系統或引導加載…

2-Linux學習環境搭建

1 Linux學習環境搭建 1.1 虛擬化介紹 # win 機器----》裝一個虛擬化軟件----》虛擬化出linux操作系統# kvm vmware openstack docker k8s # kvm vmware 虛擬化軟件 -運行在linux上&#xff0c;做虛擬化的軟件 -vmware運行在win&#xff0c;linux&#xff0c;商業軟件…

AMEYA360:瑞薩面向高端工業傳感器系統推出高精度模擬前端的32位RX MCU

全球半導體解決方案供應商瑞薩電子&#xff08;TSE&#xff1a;6723&#xff09;宣布面向高端工業傳感器系統推出一款全新RX產品——RX23E-B&#xff0c;擴展32位微控制器&#xff08;MCU&#xff09;產品線。新產品作為廣受歡迎的RX產品家族的一員&#xff0c;具有高精度模擬前…

hadoop2.x linux集群部署

hadoop2.x 集群部署 下載hadoop需要提前準備好jdk1.8 和rsync 和ssl集群信息解壓安裝配置環境變量配置site配置文件(/hadoop/etc/hadoop目錄下)core-site.xmlhdfs-site.xmlyarn-site.xmlmapred-site.xmlhadoop-env.sh要追加java_home!配置節點slaves 配置免密ssh訪問沒有ssh-co…

【計算方法與科學建模】矩陣特征值與特征向量的計算(四):乘冪法及其python實現

文章目錄 一、Jacobi 旋轉法二、Jacobi 過關法三、Householder 方法四、乘冪法 矩陣的特征值&#xff08;eigenvalue&#xff09;和特征向量&#xff08;eigenvector&#xff09;在很多應用中都具有重要的數學和物理意義。 本文將詳細介紹乘冪法的基本原理和步驟&#xff0c;并…

【JavaSE】基礎筆記 - 異常(Exception)

目錄 1、異常的概念和體系結構 1.1、異常的概念 1.2、 異常的體系結構 1.3 異常的分類 2、異常的處理 2.1、防御式編程 2.2、異常的拋出 2.3、異常的捕獲 2.3.1、異常聲明throws 2.3.2、try-catch捕獲并處理 3、自定義異常類 1、異常的概念和體系結構 1.1、異常的…

datasets.Dataset.map方法學習筆記

Dataset.map 方法概要 可以將datasets中的Dataset實例看做是一張數據表。map方法會將輸入的function按照指定的方式應用在每一行&#xff08;每一行稱為一個example&#xff09;上。本文采用一下示例進行說明&#xff1a; from datasets import Dataset # datasets.__versi…

前端開發工具集合

文章目錄 Visual Studio Code (VS Code)安裝及配置一、安裝二、常用插件三、相關配置四、統一配置代碼 Visual Studio Code (VS Code)安裝及配置 一、安裝 下載地址&#xff1a;https://code.visualstudio.com/ ?> VS Code 下載慢&#xff0c;解決辦法請點擊 雙擊下載文件…