1小時快速上手RabbitMQ(簡介及安裝過程)
前 言
?? 作者簡介:半舊518,長跑型選手,立志堅持寫10年博客,專注于java后端
?專欄簡介:深入、全面、系統(tǒng)的介紹消息中間件
?? 文章簡介:本文將介紹RabbitMQ,一小時快速上手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)與庫存系統(tǒng)、支付系統(tǒng)、物流系統(tǒng)直接通過遠(yuǎn)程調(diào)用方式通信,模塊耦合度較高的情況。

會存在問題:
(1)容錯性較低。
一個庫存系統(tǒng)出問題,通信鏈路斷了,訂單下單就失敗了。

(2)可維護(hù)性低
增加x系統(tǒng),需要修改訂單系統(tǒng)的代碼。再加再改,撤回也改。

引入消息中間件MQ后。訂單系統(tǒng)作為消息生產(chǎn)者生產(chǎn)訂單消息生產(chǎn)消息到MQ,庫存、支付、物流作為消息消費(fèi)者消費(fèi)消息。即使庫存系統(tǒng)出現(xiàn)問題,也可以在恢復(fù)以后再從MQ中消費(fèi)消息,而不會導(dǎo)致訂單失敗。

擴(kuò)展新的x系統(tǒng),只需要x系統(tǒng)把MQ中的消息再消費(fèi)一次即可,訂單系統(tǒng)無需改代碼。

1.2.2 優(yōu)點(diǎn)2:異步提速
引入中間件之前,需要同步完成訂單系統(tǒng)對其它模塊的調(diào)用,即調(diào)用庫存返回后調(diào)用支付,調(diào)用支付返回后調(diào)用物流。

引入中間件之后,25ms返回請求。

1.2.3 優(yōu)點(diǎn)3:削峰填谷
引入消息中間件前,假如A系統(tǒng)來個秒殺活動,會寄。

引入之后,MQ就像一個大倉庫,5000個請求,對MQ小意思。A系統(tǒng)慢慢從倉庫里運(yùn)貨吧。



1.2.4 缺點(diǎn)


1.3常見的消息中間件

2.RabbitMQ的介紹與安裝
2.1 RabbitMQ簡介




2.2 JMS概念

2.3 RabbitMQ安裝
官網(wǎng)地址:https://www.rabbitmq.com/

往下翻一翻,下載軟件和文檔。

由于只是方便學(xué)習(xí),本文基于windows安裝rabbitmq,如果使用linux推薦使用docker進(jìn)行部署。
2.3.1 安裝依賴環(huán)境
由于rabbitmq是基于erlang語言開發(fā)的,因此需要有erlang語言環(huán)境。
先看看官方文檔中,對于erlang的版本要求說明。
https://www.rabbitmq.com/which-erlang.html
可以看到,不同版本的rabbitmq需要的erlang版本不同。這里我們使用3.11.5版的rabbitmq。因此需要的erlang版本是25.0-25.2

通過下列網(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

雙擊安裝。從安裝目錄打開cmd,

使用如下命令安裝管理頁面的插件
rabbitmq-plugins enable rabbitmq_management

雙擊bat腳本啟動

這時,打開瀏覽器輸入http://localhost:15672,賬號密碼默認(rèn)是:guest/guest
大功告成咯!

2.4 rabbitmq管控臺的使用
rabbitmq的管控臺還是比較友好的,可以隨便點(diǎn)點(diǎn)。這里帶大家簡單熟悉下。
添加用戶。


添加虛擬機(jī)。

點(diǎn)擊添加的虛擬機(jī)ittest,進(jìn)入詳情頁面為其授權(quán)。


授權(quán)成功。

其它的您自己點(diǎn)點(diǎn)點(diǎn)吧,很簡單。
3.RabbitMQ快速入門
3.1 需求描述
RabbitMQ有六種工作模式,先來介紹最簡單的一種,實(shí)現(xiàn)一個helloworld。
需求如下:

圖示如下。

3.2 準(zhǔn)備工作
idea新建項目rabbitqmdemo,maven模塊rabbitmq-producer,rabbitmq-consumer

在兩個模塊中引入依賴。
<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í)看著下圖就會了。

代碼如下。
/**
*
* 發(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");//用戶名 默認(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)建隊列Queue
/*
queueDeclare(String queue, boolean durable, boolean exclusive, boolean autoDelete, Map<String, Object> arguments)
參數(shù):
1. queue:隊列名稱
2. durable:是否持久化,當(dāng)mq重啟之后,還在
3. exclusive:
* 是否獨(dú)占。只能有一個消費(fèi)者監(jiān)聽這隊列
* 當(dāng)Connection關(guān)閉時,是否刪除隊列
*
4. autoDelete:是否自動刪除。當(dāng)沒有Consumer時,自動刪除掉
5. arguments:參數(shù)。
*/
//如果沒有一個名字叫hello_world的隊列,則會創(chuàng)建該隊列,如果有則不會創(chuàng)建
channel.queueDeclare("hello_world",true,false,false,null);
/*
basicPublish(String exchange, String routingKey, BasicProperties props, byte[] body)
參數(shù):
1. exchange:交換機(jī)名稱。簡單模式下交換機(jī)會使用默認(rèn)的 ""
2. routingKey:路由名稱
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用戶的管控臺是這樣的,沒有queue

管控臺變成了這個樣子

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");//用戶名 默認(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)建隊列Queue
/*
queueDeclare(String queue, boolean durable, boolean exclusive, boolean autoDelete, Map<String, Object> arguments)
參數(shù):
1. queue:隊列名稱
2. durable:是否持久化,當(dāng)mq重啟之后,還在
3. exclusive:
* 是否獨(dú)占。只能有一個消費(fèi)者監(jiān)聽這隊列
* 當(dāng)Connection關(guān)閉時,是否刪除隊列
*
4. autoDelete:是否自動刪除。當(dāng)沒有Consumer時,自動刪除掉
5. arguments:參數(shù)。
*/
//如果沒有一個名字叫hello_world的隊列,則會創(chuàng)建該隊列,如果有則不會創(chuàng)建
channel.queueDeclare("hello_world",true,false,false,null);
/*
basicConsume(String queue, boolean autoAck, Consumer callback)
參數(shù):
1. queue:隊列名稱
2. autoAck:是否自動確認(rèn)
3. callback:回調(diào)對象
*/
// 接收消息
Consumer consumer = new DefaultConsumer(channel){
/*
回調(diào)方法,當(dāng)收到消息后,會自動執(zhí)行該方法
1. consumerTag:標(biāo)識
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)聽消息
}
}
執(zhí)行結(jié)果如下,消費(fèi)者成功的拿到了消息。

到此這篇關(guān)于1小時快速上手RabbitMQ的文章就介紹到這了,更多相關(guān)RabbitMQ快速上手內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
淺析JavaWeb項目架構(gòu)之Redis分布式日志隊列
架構(gòu)、分布式、日志隊列,標(biāo)題自己都看著唬人,其實(shí)就是一個日志收集的功能,只不過中間加了一個Redis做消息隊列罷了。下面通過本文給大家分享JavaWeb項目架構(gòu)之Redis分布式日志隊列,感興趣的朋友一起看看吧2018-01-01
Windows下Java調(diào)用可執(zhí)行文件代碼實(shí)例
這篇文章主要介紹了Windows下Java調(diào)用可執(zhí)行文件代碼實(shí)例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2019-12-12
如何通過自定義spring?invalidator注解校驗(yàn)數(shù)據(jù)合法性
這篇文章主要介紹了如何通過自定義spring?invalidator注解校驗(yàn)數(shù)據(jù)合法性,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-07-07
SpringBoot整合ShardingSphere的示例代碼
本文主要介紹了SpringBoot整合ShardingSphere的示例代碼,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-09-09
Mybatis日期格式自動轉(zhuǎn)換需要用到的兩個注解說明
這篇文章主要介紹了Mybatis日期格式自動轉(zhuǎn)換需要用到的兩個注解說明,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-08-08
關(guān)于Java整合RocketMQ實(shí)現(xiàn)生產(chǎn)消費(fèi)詳解
這篇文章主要介紹了關(guān)于Java整合RocketMQ實(shí)現(xiàn)生產(chǎn)消費(fèi)詳解,RocketMQ作為一款純java、分布式、隊列模型的開源消息中間件,支持事務(wù)消息、順序消息、批量消息、定時消息、消息回溯等,需要的朋友可以參考下2023-05-05

