1小時(shí)快速上手RabbitMQ(簡(jiǎn)介及安裝過(guò)程)
前 言
?? 作者簡(jiǎn)介:半舊518,長(zhǎng)跑型選手,立志堅(jiān)持寫(xiě)10年博客,專(zhuān)注于java后端
?專(zhuān)欄簡(jiǎn)介:深入、全面、系統(tǒng)的介紹消息中間件
?? 文章簡(jiǎn)介:本文將介紹RabbitMQ,一小時(shí)快速上手RabbitMQ
1.MQ的介紹
1.1 MQ的基本概念
1.2 MQ的優(yōu)缺點(diǎn)
下面是MQ的優(yōu)缺點(diǎn)
1.2.1 優(yōu)點(diǎn)1:應(yīng)用解耦
考慮由訂單系統(tǒng)與庫(kù)存系統(tǒng)、支付系統(tǒng)、物流系統(tǒng)直接通過(guò)遠(yuǎn)程調(diào)用方式通信,模塊耦合度較高的情況。
會(huì)存在問(wèn)題:
(1)容錯(cuò)性較低。
一個(gè)庫(kù)存系統(tǒng)出問(wèn)題,通信鏈路斷了,訂單下單就失敗了。
(2)可維護(hù)性低
增加x系統(tǒng),需要修改訂單系統(tǒng)的代碼。再加再改,撤回也改。
引入消息中間件MQ后。訂單系統(tǒng)作為消息生產(chǎn)者生產(chǎn)訂單消息生產(chǎn)消息到MQ,庫(kù)存、支付、物流作為消息消費(fèi)者消費(fèi)消息。即使庫(kù)存系統(tǒng)出現(xiàn)問(wèn)題,也可以在恢復(fù)以后再?gòu)腗Q中消費(fèi)消息,而不會(huì)導(dǎo)致訂單失敗。
擴(kuò)展新的x系統(tǒng),只需要x系統(tǒng)把MQ中的消息再消費(fèi)一次即可,訂單系統(tǒng)無(wú)需改代碼。
1.2.2 優(yōu)點(diǎn)2:異步提速
引入中間件之前,需要同步完成訂單系統(tǒng)對(duì)其它模塊的調(diào)用,即調(diào)用庫(kù)存返回后調(diào)用支付,調(diào)用支付返回后調(diào)用物流。
引入中間件之后,25ms返回請(qǐng)求。
1.2.3 優(yōu)點(diǎn)3:削峰填谷
引入消息中間件前,假如A系統(tǒng)來(lái)個(gè)秒殺活動(dòng),會(huì)寄。
引入之后,MQ就像一個(gè)大倉(cāng)庫(kù),5000個(gè)請(qǐng)求,對(duì)MQ小意思。A系統(tǒng)慢慢從倉(cāng)庫(kù)里運(yùn)貨吧。
1.2.4 缺點(diǎn)
1.3常見(jiàn)的消息中間件
2.RabbitMQ的介紹與安裝
2.1 RabbitMQ簡(jiǎn)介
2.2 JMS概念
2.3 RabbitMQ安裝
官網(wǎng)地址:https://www.rabbitmq.com/
往下翻一翻,下載軟件和文檔。
由于只是方便學(xué)習(xí),本文基于windows安裝rabbitmq,如果使用linux推薦使用docker進(jìn)行部署。
2.3.1 安裝依賴(lài)環(huán)境
由于rabbitmq是基于erlang語(yǔ)言開(kāi)發(fā)的,因此需要有erlang語(yǔ)言環(huán)境。
先看看官方文檔中,對(duì)于erlang的版本要求說(shuō)明。
https://www.rabbitmq.com/which-erlang.html
可以看到,不同版本的rabbitmq需要的erlang版本不同。這里我們使用3.11.5版的rabbitmq。因此需要的erlang版本是25.0-25.2
通過(guò)下列網(wǎng)址可以下載erlang25.2:https://www.erlang.org/patches/otp-25.2
選擇下圖中的windows installer,下載exe安裝包。
點(diǎn)擊exe文件安裝即可。
配置環(huán)境變量。
cmd鍵入erl -version判斷是否配置成功
C:\Users\24724>erl -version Erlang (SMP,ASYNC_THREADS) (BEAM) emulator version 13.1.3
2.3.2 安裝rabbitmq
下載exe安裝包。
https://www.rabbitmq.com/install-windows.html
版本選用:3.11.5
雙擊安裝。從安裝目錄打開(kāi)cmd,
使用如下命令安裝管理頁(yè)面的插件
rabbitmq-plugins enable rabbitmq_management
雙擊bat腳本啟動(dòng)
這時(shí),打開(kāi)瀏覽器輸入http://localhost:15672,賬號(hào)密碼默認(rèn)是:guest/guest
大功告成咯!
2.4 rabbitmq管控臺(tái)的使用
rabbitmq的管控臺(tái)還是比較友好的,可以隨便點(diǎn)點(diǎn)。這里帶大家簡(jiǎn)單熟悉下。
添加用戶(hù)。
添加虛擬機(jī)。
點(diǎn)擊添加的虛擬機(jī)ittest,進(jìn)入詳情頁(yè)面為其授權(quán)。
授權(quán)成功。
其它的您自己點(diǎn)點(diǎn)點(diǎn)吧,很簡(jiǎn)單。
3.RabbitMQ快速入門(mén)
3.1 需求描述
RabbitMQ有六種工作模式,先來(lái)介紹最簡(jiǎn)單的一種,實(shí)現(xiàn)一個(gè)helloworld。
需求如下:
圖示如下。
3.2 準(zhǔn)備工作
idea新建項(xiàng)目rabbitqmdemo,maven模塊rabbitmq-producer,rabbitmq-consumer
在兩個(gè)模塊中引入依賴(lài)。
<dependencies> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>5.1.7.RELEASE</version> </dependency> <dependency> <groupId>org.springframework.amqp</groupId> <artifactId>spring-rabbit</artifactId> <version>2.1.8.RELEASE</version> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-test</artifactId> <version>5.1.7.RELEASE</version> </dependency> </dependencies>
3.3 生產(chǎn)者實(shí)現(xiàn)
producer下新建Producer_HelloWorld.java
。
其要實(shí)現(xiàn)的代碼邏輯其實(shí)看著下圖就會(huì)了。
代碼如下。
/** * * 發(fā)送消息 */ public class Producer_HelloWorld { public static void main(String[] args) throws IOException, TimeoutException { //1.創(chuàng)建連接工廠 ConnectionFactory factory = new ConnectionFactory(); //2. 設(shè)置參數(shù) factory.setHost("localhost");//ip 默認(rèn)值 localhost factory.setPort(5672); //端口 默認(rèn)值 5672 factory.setVirtualHost("/ittest");//虛擬機(jī) 默認(rèn)值/ factory.setUsername("guest");//用戶(hù)名 默認(rèn) guest factory.setPassword("guest");//密碼 默認(rèn)值 guest //3. 創(chuàng)建連接 Connection Connection connection = factory.newConnection(); //4. 創(chuàng)建Channel Channel channel = connection.createChannel(); //5. 創(chuàng)建隊(duì)列Queue /* queueDeclare(String queue, boolean durable, boolean exclusive, boolean autoDelete, Map<String, Object> arguments) 參數(shù): 1. queue:隊(duì)列名稱(chēng) 2. durable:是否持久化,當(dāng)mq重啟之后,還在 3. exclusive: * 是否獨(dú)占。只能有一個(gè)消費(fèi)者監(jiān)聽(tīng)這隊(duì)列 * 當(dāng)Connection關(guān)閉時(shí),是否刪除隊(duì)列 * 4. autoDelete:是否自動(dòng)刪除。當(dāng)沒(méi)有Consumer時(shí),自動(dòng)刪除掉 5. arguments:參數(shù)。 */ //如果沒(méi)有一個(gè)名字叫hello_world的隊(duì)列,則會(huì)創(chuàng)建該隊(duì)列,如果有則不會(huì)創(chuàng)建 channel.queueDeclare("hello_world",true,false,false,null); /* basicPublish(String exchange, String routingKey, BasicProperties props, byte[] body) 參數(shù): 1. exchange:交換機(jī)名稱(chēng)。簡(jiǎn)單模式下交換機(jī)會(huì)使用默認(rèn)的 "" 2. routingKey:路由名稱(chēng) 3. props:配置信息 4. body:發(fā)送消息數(shù)據(jù) */ String body = "hello rabbitmq~~~"; //6. 發(fā)送消息 channel.basicPublish("","hello_world",null,body.getBytes()); //7.釋放資源 channel.close(); connection.close(); } }
代碼運(yùn)行前,guest用戶(hù)的管控臺(tái)是這樣的,沒(méi)有queue
管控臺(tái)變成了這個(gè)樣子
3.4 消費(fèi)者實(shí)現(xiàn)
consumer模塊新建Consumer_HelloWorld.java
。
public class Consumer_HelloWorld { public static void main(String[] args) throws IOException, TimeoutException { //1.創(chuàng)建連接工廠 ConnectionFactory factory = new ConnectionFactory(); //2. 設(shè)置參數(shù) factory.setHost("localhost");//ip 默認(rèn)值 localhost factory.setPort(5672); //端口 默認(rèn)值 5672 factory.setVirtualHost("/ittest");//虛擬機(jī) 默認(rèn)值/ factory.setUsername("guest");//用戶(hù)名 默認(rèn) guest factory.setPassword("guest");//密碼 默認(rèn)值 guest //3. 創(chuàng)建連接 Connection Connection connection = factory.newConnection(); //4. 創(chuàng)建Channel Channel channel = connection.createChannel(); //5. 創(chuàng)建隊(duì)列Queue /* queueDeclare(String queue, boolean durable, boolean exclusive, boolean autoDelete, Map<String, Object> arguments) 參數(shù): 1. queue:隊(duì)列名稱(chēng) 2. durable:是否持久化,當(dāng)mq重啟之后,還在 3. exclusive: * 是否獨(dú)占。只能有一個(gè)消費(fèi)者監(jiān)聽(tīng)這隊(duì)列 * 當(dāng)Connection關(guān)閉時(shí),是否刪除隊(duì)列 * 4. autoDelete:是否自動(dòng)刪除。當(dāng)沒(méi)有Consumer時(shí),自動(dòng)刪除掉 5. arguments:參數(shù)。 */ //如果沒(méi)有一個(gè)名字叫hello_world的隊(duì)列,則會(huì)創(chuàng)建該隊(duì)列,如果有則不會(huì)創(chuàng)建 channel.queueDeclare("hello_world",true,false,false,null); /* basicConsume(String queue, boolean autoAck, Consumer callback) 參數(shù): 1. queue:隊(duì)列名稱(chēng) 2. autoAck:是否自動(dòng)確認(rèn) 3. callback:回調(diào)對(duì)象 */ // 接收消息 Consumer consumer = new DefaultConsumer(channel){ /* 回調(diào)方法,當(dāng)收到消息后,會(huì)自動(dòng)執(zhí)行該方法 1. consumerTag:標(biāo)識(shí) 2. envelope:獲取一些信息,交換機(jī),路由key... 3. properties:配置信息 4. body:數(shù)據(jù) */ @Override public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException { System.out.println("consumerTag:"+consumerTag); System.out.println("Exchange:"+envelope.getExchange()); System.out.println("RoutingKey:"+envelope.getRoutingKey()); System.out.println("properties:"+properties); System.out.println("body:"+new String(body)); } }; channel.basicConsume("hello_world",true,consumer); //關(guān)閉資源?不要,因?yàn)橐恢北O(jiān)聽(tīng)消息 } }
執(zhí)行結(jié)果如下,消費(fèi)者成功的拿到了消息。
到此這篇關(guān)于1小時(shí)快速上手RabbitMQ的文章就介紹到這了,更多相關(guān)RabbitMQ快速上手內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
淺析JavaWeb項(xiàng)目架構(gòu)之Redis分布式日志隊(duì)列
架構(gòu)、分布式、日志隊(duì)列,標(biāo)題自己都看著唬人,其實(shí)就是一個(gè)日志收集的功能,只不過(guò)中間加了一個(gè)Redis做消息隊(duì)列罷了。下面通過(guò)本文給大家分享JavaWeb項(xiàng)目架構(gòu)之Redis分布式日志隊(duì)列,感興趣的朋友一起看看吧2018-01-01Windows下Java調(diào)用可執(zhí)行文件代碼實(shí)例
這篇文章主要介紹了Windows下Java調(diào)用可執(zhí)行文件代碼實(shí)例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-12-12如何通過(guò)自定義spring?invalidator注解校驗(yàn)數(shù)據(jù)合法性
這篇文章主要介紹了如何通過(guò)自定義spring?invalidator注解校驗(yàn)數(shù)據(jù)合法性,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-07-07SpringBoot整合ShardingSphere的示例代碼
本文主要介紹了SpringBoot整合ShardingSphere的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-09-09Mybatis日期格式自動(dòng)轉(zhuǎn)換需要用到的兩個(gè)注解說(shuō)明
這篇文章主要介紹了Mybatis日期格式自動(dòng)轉(zhuǎn)換需要用到的兩個(gè)注解說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-08-08Java 數(shù)據(jù)庫(kù)連接池 Tomcat介紹
這篇文章主要給大家分享了 Java 數(shù)據(jù)庫(kù)連接池 Tomcat介紹,omcat 是一個(gè)小型的輕量級(jí)應(yīng)用服務(wù)器,在中小型系統(tǒng)和并發(fā)訪問(wèn)用戶(hù)不是很多的場(chǎng)合下被普遍使用,是開(kāi)發(fā)和調(diào)試JSP 程序的首選。下面來(lái)看看文章內(nèi)容的詳細(xì)介紹吧2021-11-11關(guān)于Java整合RocketMQ實(shí)現(xiàn)生產(chǎn)消費(fèi)詳解
這篇文章主要介紹了關(guān)于Java整合RocketMQ實(shí)現(xiàn)生產(chǎn)消費(fèi)詳解,RocketMQ作為一款純java、分布式、隊(duì)列模型的開(kāi)源消息中間件,支持事務(wù)消息、順序消息、批量消息、定時(shí)消息、消息回溯等,需要的朋友可以參考下2023-05-05