SpringBoot中整合RabbitMQ(測試+部署上線最新完整)的過程
一、RabbitMQ安裝
由于在測試環(huán)境中,我們現(xiàn)在虛擬機上基于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)境上運行改指令
前兩個是登錄的用戶名密碼
network是連接的網(wǎng)絡(luò),如果用默認網(wǎng)絡(luò)的話就不需要寫
最后一個是版本,這個是目前測試的版本
二、啟動RabbitMQ
由于目前是測試階段,這里我使用之前學(xué)習(xí)的時候的版本。
創(chuàng)建新用戶后重新登陸,然后創(chuàng)建一個單獨的 _Virtual Hosts (虛擬主機)_來進行隔離。
三、編寫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} # 虛擬主機 username: ${quick.rabbitmq.username} # 用戶名 password: ${quick.rabbitmq.password} # 密碼 quick: rabbitmq: host: 192.168.75.101 #服務(wù)器ip地址(此處為虛擬機地址) port: 5672 # 端口 virtual-host: /xxx # 虛擬主機 username: xxx # 用戶名 password: xxx # 密碼 listener: simple: acknowledge-mode: auto # 自動ack retry: enabled: true # 開啟消費者失敗重試 initial-interval: 1000ms # 初識的失敗等待時長為1秒 multiplier: 1 # 失敗的等待時長倍數(shù),下次等待時長 = multiplier * last-interval max-attempts: 3 # 最大重試次數(shù) stateless: false # true無狀態(tài);false有狀態(tài)。如果業(yè)務(wù)中包含事務(wù),這里改為false publisher-confirm-type: CORRELATED # 交換機的確認 publisher-returns: true # 隊列的確認
3、配置消息轉(zhuǎn)換器
/** * 配置消息轉(zhuǎn)換器 */ @Configuration @ConditionalOnClass(RabbitTemplate.class) //有RabbitTemplate依賴才會生效,否則不生效 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"), // 隊列 起名規(guī)則(服務(wù)名+業(yè)務(wù)名+成功+隊列),durable持久化 exchange = @Exchange(name = "addFavorite.direct"), // 交換機名稱,交換機默認類型就行direct,所以不用配置direct key = "addFavorite.success" // 綁定的key )) public void listenAddFavoriteCountsSuccess(Long storeId){ storeService.updateStoreFavoriteUsersCountAdd1(storeId); } }
雖然代碼里面也已經(jīng)解釋了,但是下面也再解釋一下:
value:是隊列信息。起名規(guī)則(服務(wù)名+業(yè)務(wù)名+成功+隊列),durable表示持久化
exchange:是交換機名稱。起名規(guī)則是(業(yè)務(wù)名+direct),和發(fā)送方一致
key:綁定的key。起名規(guī)則是(業(yè)務(wù)名+success),表示成功的key,和發(fā)送方一致
起名規(guī)則是個人而定
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); // 更新商品表,收藏數(shù)+1 //storeService.updateStoreFavoriteUsersCountAdd1(storeId); // 發(fā)送消息 (交換機+綁定的key和發(fā)送的消息) try { rabbitTemplate.convertAndSend("addFavorite.direct","addFavorite.success",storeId); } catch (Exception e) { log.error("發(fā)送添加收藏消息失敗,店鋪id:{}",storeService,e); } }
雖然代碼里面也已經(jīng)解釋了,但是下面也再解釋一下:
“addFavorite.direct”:是交換機名稱,和接收方一致
“addFavorite.success”:是綁定的key,和接收方一致
storeId:是發(fā)送的信息
6、小程序驗證
點擊收藏。
在RabbitMQ的界面中隊列也有一條消息出現(xiàn),說明mq實現(xiàn)異步通訊成功。
該案例是收藏商品后完成收藏表插入語句后,還要去商品表更新商品表,更新該商品的被收藏數(shù)加一,但是如果同步通訊的話,響應(yīng)會有延遲,可能會對性能造成一定影響,但是通過異步通訊,不需要實時響應(yīng),就會對性能有一定的優(yōu)化。
三、寶塔中安裝RabbitMQ
1、下載erlang
RabbitMQ服務(wù)端是由并發(fā)式語言Erlang編寫的,所以安裝RabbitMQ的之前需要安裝Erlang,保證所需要的環(huá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文件:
注意:這里沒有下載的版本,下載需要與自己的版本一致,如果發(fā)現(xiàn)啟動不了RabbitMQ,請看后面的啟動RabbitMQ。
注意!注意!注意!
2、前往寶塔面板
進入tmp目錄,將之前的rpm包放進去。
3、安裝RabbitMQ
在軟件商店中安裝RabbitMQ
出現(xiàn)問題:
看到報錯日志,我又去下載報錯日志里面的版本。
再次去:https://www.erlang-solutions.com/downloads/#
我是centos7,所以下載該版本。那邊有點不人性化,我嘗試了幾次才下載到自己的版本。
將之前的哪個rmp文件刪掉,再將剛剛下載的rpm文件重命名再次放入tmp目錄中
上面我重命名錯了,只記得修改后面,下面是再次修改后的結(jié)果。
卸載rabbitmq,然后再重新安裝一次。
還是出現(xiàn)報錯:
出現(xiàn)了這個報錯,很莫名其妙,然后我就去用docker安裝,有解決辦法的可以評論一下。
在其他教程到這一步已經(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、運行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容器了
但是在我訪問http://主機ip:15672的時候卻無法訪問,即使我開放了服務(wù)器的安全組。后來猜到應(yīng)該是客戶端服務(wù)可能是沒開啟,在之前寶塔軟件里面好像有看過這個東西。
6、開放客戶端服務(wù)
在mq容器中打開終端
列出所有可用的插件:
rabbitmq-plugins list
找到rabbitmq_management:
開啟rabbitmq_management:
rabbitmq-plugins enable rabbitmq_management
然后再訪問客戶端,成功訪問:
7、登錄RabbitMQ客戶端
這里顯示有些特性標(biāo)志未開啟,我們可以去開啟那些標(biāo)志。
參考博客:Docker RabbitMQ安裝
8、創(chuàng)建虛擬主機
創(chuàng)建一個單獨的虛擬主機來進行隔離,這里可以參考前面在虛擬機上的操作。
9、關(guān)于圖形化界面可能出現(xiàn)的問題
Stats in management UI are disabled on this node
可以參考這篇博客:
五、部署項目驗證
參考我之前的:部署
修改yml配置文件,修改下面的消息:
rabbitmq: host: ${quick.rabbitmq.host} port: ${quick.rabbitmq.port} # 端口 virtual-host: ${quick.rabbitmq.virtual-host} # 虛擬主機 username: ${quick.rabbitmq.username} # 用戶名 password: ${quick.rabbitmq.password} # 密碼
在已經(jīng)上線的小程序測試~~
目前只有一個人收藏,現(xiàn)在去測試一下。
收藏成功,去看一下數(shù)據(jù)庫,查看是否更新。
去查看mq客戶端:
成功更新,說明使用RabbitMQ實現(xiàn)異步通訊成功。
六、拓展使用
關(guān)于一些拓展使用可以參考以下這些博客:
在配置mq過程中遇到許許多多的bug和問題,改了很久很久,如果里面有哪些不足的歡迎指正和建議?。。?/p>
到此這篇關(guān)于SpringBoot中整合RabbitMQ(測試+部署上線最新完整)的文章就介紹到這了,更多相關(guān)SpringBoot整合RabbitMQ部署內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java INPUTSTREAM如何實現(xiàn)重復(fù)使用
這篇文章主要介紹了Java INPUTSTREAM如何實現(xiàn)重復(fù)使用,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-10-10詳解Eclipse 字體、字號的設(shè)置、最佳字體推薦
這篇文章主要介紹了Eclipse 字體、字號的設(shè)置、最佳字體推薦,需要的朋友可以參考下2020-09-09Spring @Configuration和@Component的區(qū)別
今天小編就為大家分享一篇關(guān)于Spring @Configuration和@Component的區(qū)別,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧2018-12-12java經(jīng)典問題:連個字符串互為回環(huán)變位
連個字符串互為回環(huán)變位經(jīng)常出現(xiàn)在java程序員面試中,這個是考驗程序員的解題思路和方法的最經(jīng)典的一題,小編為大家詳細分析一下,一起來學(xué)習(xí)吧。2017-11-11Springboot jar包 idea 遠程調(diào)試的操作過程
文章介紹了如何在IntelliJ IDEA中遠程調(diào)試Spring Boot項目的Jar包,本文通過圖文并茂的形式給大家介紹的非常詳細,感興趣的朋友跟隨小編一起看看吧2024-11-11Spring Boot利用Lombok減少Java中樣板代碼的方法示例
spring Boot是非常高效的開發(fā)框架,lombok是一套代碼模板解決方案,將極大提升開發(fā)的效率,下面這篇文章主要給大家介紹了關(guān)于Spring Boot利用Lombok減少Java中樣板代碼的相關(guān)資料,需要的朋友可以參考借鑒,下面來一起看看吧。2017-09-09基于XML的MyBatis的環(huán)境搭建過程詳解(IDEA)
這篇文章主要介紹了基于XML的MyBatis的環(huán)境搭建過程詳解(IDEA),本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-11-11