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ò)的話就不需要寫(xiě)
最后一個(gè)是版本,這個(gè)是目前測(cè)試的版本
二、啟動(dòng)RabbitMQ
由于目前是測(cè)試階段,這里我使用之前學(xué)習(xí)的時(shí)候的版本。
創(chuàng)建新用戶后重新登陸,然后創(chuàng)建一個(gè)單獨(dú)的 _Virtual Hosts (虛擬主機(jī))_來(lái)進(jìn)行隔離。
三、編寫(xiě)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、編寫(xiě)接收方接收消息
/** * 接收消息 */ @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ī)名稱(chēng),交換機(jī)默認(rèn)類(lèi)型就行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ī)名稱(chēng)。起名規(guī)則是(業(yè)務(wù)名+direct),和發(fā)送方一致
key:綁定的key。起名規(guī)則是(業(yè)務(wù)名+success),表示成功的key,和發(fā)送方一致
起名規(guī)則是個(gè)人而定
5、編寫(xiě)發(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ī)名稱(chēng),和接收方一致
“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編寫(xiě)的,所以安裝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 docker
3、拉取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)題,改了很久很久,如果里面有哪些不足的歡迎指正和建議?。。?/p>
到此這篇關(guān)于SpringBoot中整合RabbitMQ(測(cè)試+部署上線最新完整)的文章就介紹到這了,更多相關(guān)SpringBoot整合RabbitMQ部署內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java INPUTSTREAM如何實(shí)現(xiàn)重復(fù)使用
這篇文章主要介紹了Java INPUTSTREAM如何實(shí)現(xiàn)重復(fù)使用,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-10-10java與scala數(shù)組及集合的基本操作對(duì)比
這篇文章主要介紹了java與scala數(shù)組及集合的基本操作對(duì)比,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-10-10詳解Eclipse 字體、字號(hào)的設(shè)置、最佳字體推薦
這篇文章主要介紹了Eclipse 字體、字號(hào)的設(shè)置、最佳字體推薦,需要的朋友可以參考下2020-09-09Spring @Configuration和@Component的區(qū)別
今天小編就為大家分享一篇關(guān)于Spring @Configuration和@Component的區(qū)別,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧2018-12-12java經(jīng)典問(wèn)題:連個(gè)字符串互為回環(huán)變位
連個(gè)字符串互為回環(huán)變位經(jīng)常出現(xiàn)在java程序員面試中,這個(gè)是考驗(yàn)程序員的解題思路和方法的最經(jīng)典的一題,小編為大家詳細(xì)分析一下,一起來(lái)學(xué)習(xí)吧。2017-11-11Springboot jar包 idea 遠(yuǎn)程調(diào)試的操作過(guò)程
文章介紹了如何在IntelliJ IDEA中遠(yuǎn)程調(diào)試Spring Boot項(xiàng)目的Jar包,本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),感興趣的朋友跟隨小編一起看看吧2024-11-11Spring Boot利用Lombok減少Java中樣板代碼的方法示例
spring Boot是非常高效的開(kāi)發(fā)框架,lombok是一套代碼模板解決方案,將極大提升開(kāi)發(fā)的效率,下面這篇文章主要給大家介紹了關(guān)于Spring Boot利用Lombok減少Java中樣板代碼的相關(guān)資料,需要的朋友可以參考借鑒,下面來(lái)一起看看吧。2017-09-09基于XML的MyBatis的環(huán)境搭建過(guò)程詳解(IDEA)
這篇文章主要介紹了基于XML的MyBatis的環(huán)境搭建過(guò)程詳解(IDEA),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-11-11