SpringBoot中整合RabbitMQ(測(cè)試+部署上線最新完整)的過(guò)程
一、RabbitMQ安裝
由于在測(cè)試環(huán)境中,我們現(xiàn)在虛擬機(jī)上基于docker安裝mq
docker run
-e RABBITMQ_DEFAULT_USER=quick
-e RABBITMQ_DEFAULT_PASS=123
-v mq-plugins:/plugins
–name mq
–hostname mq
-p 15672:15672
-p 5672:5672
–network your-net
-d
rabbitmq:3.8-management
在docker環(huán)境上運(yùn)行改指令
前兩個(gè)是登錄的用戶名密碼
network是連接的網(wǎng)絡(luò),如果用默認(rèn)網(wǎng)絡(luò)的話就不需要寫
最后一個(gè)是版本,這個(gè)是目前測(cè)試的版本
二、啟動(dòng)RabbitMQ

由于目前是測(cè)試階段,這里我使用之前學(xué)習(xí)的時(shí)候的版本。


創(chuàng)建新用戶后重新登陸,然后創(chuàng)建一個(gè)單獨(dú)的 _Virtual Hosts (虛擬主機(jī))_來(lái)進(jìn)行隔離。

三、編寫Java代碼
1、引入依賴
<!--rabbitmq-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>2、配置yml
spring:
rabbitmq:
host: ${quick.rabbitmq.host}
port: ${quick.rabbitmq.port} # 端口
virtual-host: ${quick.rabbitmq.virtual-host} # 虛擬主機(jī)
username: ${quick.rabbitmq.username} # 用戶名
password: ${quick.rabbitmq.password} # 密碼
quick:
rabbitmq:
host: 192.168.75.101 #服務(wù)器ip地址(此處為虛擬機(jī)地址)
port: 5672 # 端口
virtual-host: /xxx # 虛擬主機(jī)
username: xxx # 用戶名
password: xxx # 密碼
listener:
simple:
acknowledge-mode: auto # 自動(dòng)ack
retry:
enabled: true # 開(kāi)啟消費(fèi)者失敗重試
initial-interval: 1000ms # 初識(shí)的失敗等待時(shí)長(zhǎng)為1秒
multiplier: 1 # 失敗的等待時(shí)長(zhǎng)倍數(shù),下次等待時(shí)長(zhǎng) = multiplier * last-interval
max-attempts: 3 # 最大重試次數(shù)
stateless: false # true無(wú)狀態(tài);false有狀態(tài)。如果業(yè)務(wù)中包含事務(wù),這里改為false
publisher-confirm-type: CORRELATED # 交換機(jī)的確認(rèn)
publisher-returns: true # 隊(duì)列的確認(rèn)3、配置消息轉(zhuǎn)換器
/**
* 配置消息轉(zhuǎn)換器
*/
@Configuration
@ConditionalOnClass(RabbitTemplate.class) //有RabbitTemplate依賴才會(huì)生效,否則不生效
public class MqConfig {
@Bean
public MessageConverter messageConverter(){
//使用json序列化發(fā)送消息
return new Jackson2JsonMessageConverter();
}
}4、編寫接收方接收消息

/**
* 接收消息
*/
@Component
@RequiredArgsConstructor
public class StoreListener {
private final IStoreService storeService;
@RabbitListener(bindings = @QueueBinding(
value = @Queue(name = "store.addFavorite.success.queue", durable = "true"), // 隊(duì)列 起名規(guī)則(服務(wù)名+業(yè)務(wù)名+成功+隊(duì)列),durable持久化
exchange = @Exchange(name = "addFavorite.direct"), // 交換機(jī)名稱,交換機(jī)默認(rèn)類型就行direct,所以不用配置direct
key = "addFavorite.success" // 綁定的key
))
public void listenAddFavoriteCountsSuccess(Long storeId){
storeService.updateStoreFavoriteUsersCountAdd1(storeId);
}
}雖然代碼里面也已經(jīng)解釋了,但是下面也再解釋一下:
value:是隊(duì)列信息。起名規(guī)則(服務(wù)名+業(yè)務(wù)名+成功+隊(duì)列),durable表示持久化
exchange:是交換機(jī)名稱。起名規(guī)則是(業(yè)務(wù)名+direct),和發(fā)送方一致
key:綁定的key。起名規(guī)則是(業(yè)務(wù)名+success),表示成功的key,和發(fā)送方一致
起名規(guī)則是個(gè)人而定
5、編寫發(fā)送方發(fā)送消息

@Transactional
@Override
public void add(Long storeId) {
Favorite favorite = Favorite.builder()
.storeId(storeId)
.userId(BaseContext.getCurrentId()).build();
Favorite one = Db.getOne(favorite);
if (one!=null){
throw new FavoriteException(MessageConstant.COLLECTION_BE_REPEAT);
}
// 更新收藏表
favoriteMapper.insert(favorite);
// 更新商品表,收藏?cái)?shù)+1
//storeService.updateStoreFavoriteUsersCountAdd1(storeId);
// 發(fā)送消息 (交換機(jī)+綁定的key和發(fā)送的消息)
try {
rabbitTemplate.convertAndSend("addFavorite.direct","addFavorite.success",storeId);
} catch (Exception e) {
log.error("發(fā)送添加收藏消息失敗,店鋪id:{}",storeService,e);
}
}雖然代碼里面也已經(jīng)解釋了,但是下面也再解釋一下:
“addFavorite.direct”:是交換機(jī)名稱,和接收方一致
“addFavorite.success”:是綁定的key,和接收方一致
storeId:是發(fā)送的信息
6、小程序驗(yàn)證
點(diǎn)擊收藏。


在RabbitMQ的界面中隊(duì)列也有一條消息出現(xiàn),說(shuō)明mq實(shí)現(xiàn)異步通訊成功。

該案例是收藏商品后完成收藏表插入語(yǔ)句后,還要去商品表更新商品表,更新該商品的被收藏?cái)?shù)加一,但是如果同步通訊的話,響應(yīng)會(huì)有延遲,可能會(huì)對(duì)性能造成一定影響,但是通過(guò)異步通訊,不需要實(shí)時(shí)響應(yīng),就會(huì)對(duì)性能有一定的優(yōu)化。
三、寶塔中安裝RabbitMQ
1、下載erlang
RabbitMQ服務(wù)端是由并發(fā)式語(yǔ)言Erlang編寫的,所以安裝RabbitMQ的之前需要安裝Erlang,保證所需要的環(huán)境。
安裝之前注意版本兼容問(wèn)題:Erlang Version Requirements | RabbitMQ
安裝erlang地址:https://www.erlang-solutions.com/downloads/#
(1)查看rabbitmq的版本
先去寶塔查看rabbitmq的版本:

(2)查找erlang兼容版本
然后去找到版本兼容的erlang版本:Erlang Version Requirements | RabbitMQ

(3)安裝RPM包
去下載:https://www.erlang-solutions.com/downloads/#


下載后拿到rpm文件:

注意:這里沒(méi)有下載的版本,下載需要與自己的版本一致,如果發(fā)現(xiàn)啟動(dòng)不了RabbitMQ,請(qǐng)看后面的啟動(dòng)RabbitMQ。
注意!注意!注意!
2、前往寶塔面板
進(jìn)入tmp目錄,將之前的rpm包放進(jìn)去。


3、安裝RabbitMQ
在軟件商店中安裝RabbitMQ

出現(xiàn)問(wèn)題:


看到報(bào)錯(cuò)日志,我又去下載報(bào)錯(cuò)日志里面的版本。
再次去:https://www.erlang-solutions.com/downloads/#
我是centos7,所以下載該版本。那邊有點(diǎn)不人性化,我嘗試了幾次才下載到自己的版本。

將之前的哪個(gè)rmp文件刪掉,再將剛剛下載的rpm文件重命名再次放入tmp目錄中

上面我重命名錯(cuò)了,只記得修改后面,下面是再次修改后的結(jié)果。

卸載rabbitmq,然后再重新安裝一次。
還是出現(xiàn)報(bào)錯(cuò):


出現(xiàn)了這個(gè)報(bào)錯(cuò),很莫名其妙,然后我就去用docker安裝,有解決辦法的可以評(píng)論一下。
在其他教程到這一步已經(jīng)可以了,可以參考下面兩篇博客:
四、docker中安裝rabbitmq
1、安裝docker
2、配置docker鏡像加速
# 創(chuàng)建目錄
mkdir -p /etc/docker
# 復(fù)制內(nèi)容,注意把其中的鏡像加速地址改成你自己的
tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": [
"http://hub-mirror.c.163.com",
"https://mirrors.tuna.tsinghua.edu.cn",
"http://mirrors.sohu.com",
"https://ustc-edu-cn.mirror.aliyuncs.com",
"https://ccr.ccs.tencentyun.com",
"https://docker.m.daocloud.io",
"https://docker.awsl9527.cn"
]
}
EOF
# 重新加載配置
systemctl daemon-reload
# 重啟Docker
systemctl restart docker3、拉取RabbitMQ鏡像
docker pull rabbitmq
4、運(yùn)行RabbitMQ
docker run
-e RABBITMQ_DEFAULT_USER=quick
-e RABBITMQ_DEFAULT_PASS=quick
-v mq-plugins:/plugins
–name mq
–hostname mq
-p 15672:15672
-p 5672:5672
-d
rabbitmq

5、查看鏡像和容器
docker images docker ps

到這里已經(jīng)是成功在docker中裝好mq容器了
但是在我訪問(wèn)http://主機(jī)ip:15672的時(shí)候卻無(wú)法訪問(wèn),即使我開(kāi)放了服務(wù)器的安全組。后來(lái)猜到應(yīng)該是客戶端服務(wù)可能是沒(méi)開(kāi)啟,在之前寶塔軟件里面好像有看過(guò)這個(gè)東西。


6、開(kāi)放客戶端服務(wù)
在mq容器中打開(kāi)終端

列出所有可用的插件:
rabbitmq-plugins list
找到rabbitmq_management:

開(kāi)啟rabbitmq_management:
rabbitmq-plugins enable rabbitmq_management

然后再訪問(wèn)客戶端,成功訪問(wèn):

7、登錄RabbitMQ客戶端

這里顯示有些特性標(biāo)志未開(kāi)啟,我們可以去開(kāi)啟那些標(biāo)志。

參考博客:Docker RabbitMQ安裝
8、創(chuàng)建虛擬主機(jī)
創(chuàng)建一個(gè)單獨(dú)的虛擬主機(jī)來(lái)進(jìn)行隔離,這里可以參考前面在虛擬機(jī)上的操作。
9、關(guān)于圖形化界面可能出現(xiàn)的問(wèn)題
Stats in management UI are disabled on this node
可以參考這篇博客:
五、部署項(xiàng)目驗(yàn)證
參考我之前的:部署
修改yml配置文件,修改下面的消息:
rabbitmq:
host: ${quick.rabbitmq.host}
port: ${quick.rabbitmq.port} # 端口
virtual-host: ${quick.rabbitmq.virtual-host} # 虛擬主機(jī)
username: ${quick.rabbitmq.username} # 用戶名
password: ${quick.rabbitmq.password} # 密碼在已經(jīng)上線的小程序測(cè)試~~


目前只有一個(gè)人收藏,現(xiàn)在去測(cè)試一下。


收藏成功,去看一下數(shù)據(jù)庫(kù),查看是否更新。

去查看mq客戶端:


成功更新,說(shuō)明使用RabbitMQ實(shí)現(xiàn)異步通訊成功。
六、拓展使用
關(guān)于一些拓展使用可以參考以下這些博客:
在配置mq過(guò)程中遇到許許多多的bug和問(wèn)題,改了很久很久,如果里面有哪些不足的歡迎指正和建議!??!
到此這篇關(guān)于SpringBoot中整合RabbitMQ(測(cè)試+部署上線最新完整)的文章就介紹到這了,更多相關(guān)SpringBoot整合RabbitMQ部署內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java?poi-tl根據(jù)模板生成word文件的完整指南
這篇文章主要為大家詳細(xì)介紹了Java?poi-tl根據(jù)模板生成word文件的相關(guān)方法,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2025-12-12
spring-boot通過(guò)@Scheduled配置定時(shí)任務(wù)及定時(shí)任務(wù)@Scheduled注解的方法
這篇文章主要介紹了spring-boot通過(guò)@Scheduled配置定時(shí)任務(wù),文中還給大家介紹了springboot 定時(shí)任務(wù)@Scheduled注解的方法,需要的朋友可以參考下2017-11-11
詳解Java8新特性Stream之list轉(zhuǎn)map及問(wèn)題解決
這篇文章主要介紹了詳解Java8新特性Stream之list轉(zhuǎn)map及問(wèn)題解決,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-09-09
MyBatis學(xué)習(xí)教程(五)-實(shí)現(xiàn)關(guān)聯(lián)表查詢方法詳解
本文給大家介紹mybatis關(guān)聯(lián)查詢,包括一對(duì)一關(guān)聯(lián)查詢,一對(duì)多關(guān)聯(lián)查詢,代碼簡(jiǎn)單易懂,感興趣的朋友一起學(xué)習(xí)吧2016-05-05
微信js-sdk+JAVA實(shí)現(xiàn)“分享到朋友圈”和“發(fā)送給朋友”功能詳解
本文分享了微信js-sdk+JAVA實(shí)現(xiàn)“分享到朋友圈”和“發(fā)送給朋友”功能介紹,大家可以參考一下2018-03-03
JavaWeb項(xiàng)目Servlet無(wú)法訪問(wèn)問(wèn)題解決
這篇文章主要介紹了JavaWeb項(xiàng)目Servlet無(wú)法訪問(wèn)問(wèn)題解決,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-11-11

