專業(yè)做網(wǎng)站建設(shè)建站公司網(wǎng)站怎么做
文章目錄
- 一、mall開源項(xiàng)目
- 1.1 來源
- 1.2 項(xiàng)目轉(zhuǎn)移
- 1.3 項(xiàng)目克隆
- 二、RabbitMQ 消息中間件
- 2.1 rabbit簡介
- 2.2 分布式后端項(xiàng)目的使用流程
- 2.3 分布式后端項(xiàng)目的使用場景
- 三、安裝RabbitMQ(Win10)
- 3.1安裝erLang語言,配置環(huán)境變量
- 3.2 安裝RabbitMQ服務(wù)端
- 3.3 測試安裝效果
- 四、源碼解析
- 4.1 集成與配置
- 4.1.1 導(dǎo)入依賴
- 4.1.2 添加配置
- 4.1.3 創(chuàng)建用戶,密碼,綁定角色(在命令行下)
- 4.1.4 創(chuàng)建用戶,密碼,綁定角色(在web界面管理工具下)
- 4.1.5 拓展
- 4.2 深入淺出
- 4.2.1 六種消息模式介紹
- 4.2.2 簡單工作隊(duì)列模式
- 4.2.3 工作隊(duì)列模式
- 4.2.4 發(fā)布訂閱模式
- 4.2.5 路由模式
- 4.2.5 主題模式
- 五、總結(jié)
一、mall開源項(xiàng)目
1.1 來源
mall學(xué)習(xí)教程,架構(gòu)、業(yè)務(wù)、技術(shù)要點(diǎn)全方位解析。mall項(xiàng)目(50k+star)是一套電商系統(tǒng),使用現(xiàn)階段主流技術(shù)實(shí)現(xiàn)。涵蓋了SpringBoot 2.3.0、MyBatis 3.4.6、Elasticsearch 7.6.2、RabbitMQ 3.7.15、Redis 5.0、MongoDB 4.2.5、Mysql5.7等技術(shù),采用Docker容器化部署。
項(xiàng)目github地址: github.com
1.2 項(xiàng)目轉(zhuǎn)移
可以把github上的項(xiàng)目轉(zhuǎn)移到gitee上,方便克隆到idea。
具體步驟如下:
1.3 項(xiàng)目克隆
由于github部署在國外,雖然idea也支持從github上拉取,但是克隆速度太慢,所以才推薦上述導(dǎo)入gitee后在克隆項(xiàng)目到idea。
具體的克隆步驟過于簡單和常規(guī)化,讀者可自行完成,或百度一下~
二、RabbitMQ 消息中間件
RabbitMQ 消息的傳遞
:是由『 生產(chǎn)者 -> 交換機(jī) -> 隊(duì)列 -> 消費(fèi)者 』這么一個(gè)模式,只不過點(diǎn)對點(diǎn)模式和工作隊(duì)列模式我們可以理解成是一個(gè)匿名的交換機(jī)進(jìn)行投遞隊(duì)列。
2.1 rabbit簡介
RabbitMQ 官網(wǎng):官網(wǎng)
RabbitMQ是一個(gè)消息代理 - 一個(gè)消息系統(tǒng)的媒介。它可以為你的應(yīng)用提供一個(gè)通用的消息發(fā)送和接收平臺,并且保證消息在傳輸過程中的安全。
RabbitMQ是一款使用Erlang語言開發(fā)的,實(shí)現(xiàn)AMQP(高級消息隊(duì)列協(xié)議)的開源消息中間件。首先要知道一些RabbitMQ的特點(diǎn)如下:
- 可靠性。支持持久化,傳輸確認(rèn),發(fā)布確認(rèn)等保證了MQ的可靠性。
- 靈活的分發(fā)消息策略。這應(yīng)該是RabbitMQ的一大特點(diǎn)。在消息進(jìn)入MQ前由Exchange(交換機(jī))進(jìn)行路由消息。分發(fā)消息策略有:簡單模式、工作隊(duì)列模式、發(fā)布訂閱模式、路由模式、通配符模式。
- 支持集群。多臺RabbitMQ服務(wù)器可以組成一個(gè)集群,形成一個(gè)邏輯Broker。
- 多種協(xié)議。RabbitMQ支持多種消息隊(duì)列協(xié)議,比如 STOMP、MQTT 等等。
- 支持多種語言客戶端。RabbitMQ幾乎支持所有常用編程語言,包括 Java、.NET、Ruby 等等。
- 可視化管理界面。RabbitMQ提供了一個(gè)易用的用戶界面,使得用戶可以監(jiān)控和管理消息 Broker。
- 插件機(jī)制。RabbitMQ提供了許多插件,可以通過插件進(jìn)行擴(kuò)展,也可以編寫自己的插件。
rabbit開發(fā)文檔地址: [java客戶端開發(fā)文檔]( Java客戶端指南 · RabbitMQ in Chinese (mr-ping.com) )
2.2 分布式后端項(xiàng)目的使用流程
下圖是結(jié)合項(xiàng)目經(jīng)歷,外加百度查找資料,自行總結(jié)的基本使用流程。
rabbitmq的使用流程圖如下:
2.3 分布式后端項(xiàng)目的使用場景
下圖是結(jié)合項(xiàng)目經(jīng)歷,外加百度查找資料,自行總結(jié)的基本使用場景。
rabbitmq的使用場景圖如下:
三、安裝RabbitMQ(Win10)
由于以前都是在Linux上操作rabbitmq( 一般用Docker拉一個(gè)RabbitMQ的鏡像下來,省去環(huán)境的部署 ),現(xiàn)在解讀源碼,嘗試一下在win10下操作,需要先有環(huán)境, 首先先下載Erlang
,再下載RabbitMQ服務(wù)端
。
ps: RabbitMQ
和Erlang
是緊密相關(guān)的,因此在選擇RabbitMQ版本時(shí),需要確保它與您安裝的特定Erlang版本兼容。
( Erlang/OTP 26.0.2
與之兼容版本是RabbitMQ 3.8.x 或者 更高
)
?寫到后面我憨住了,早知道不選這么高的版本了
經(jīng)過:安裝好兩個(gè)版本后,忘記看項(xiàng)目中 spring-boot-starter-amqp
版本為2.1.3
作為RabbitMQ客戶端庫,結(jié)果版本不兼容,導(dǎo)致一直連不上,網(wǎng)上百度一堆問題,我都仔細(xì)刷選過了,都是正確的。后面只能把問題定位到版本不兼容上了,然后說退而求其次,去升級spring-boot-starter-amqp
版本為2.3.x
就可以完美解決,沒想到的是…
阿里云倉庫太坑了,居然沒有。。。
Could not find artifact org.springframework.boot:spring-boot-starter-amqp:pom:2.3.3 in alimaven
然后百度找了許多教程,說改范圍的還有換鏡像的,結(jié)果都試了一下,結(jié)果這個(gè)找不到就算了,其它的依賴也全報(bào)錯(cuò),應(yīng)該是倉庫的依賴沖突啥的,就不深究了。。。
??還是跟著項(xiàng)目走,將 Erlang
和RabbitMQ服務(wù)端
版本降下來。
spring-boot-starter-amqp的版本為2.1.3 是與 RabbitMQ 3.7.x 版本兼容的版本
這里下載RabbitMQ服務(wù)端:rabbitmq-server-3.7.3.exe
。
對應(yīng)的Erlang
版本在19.3 - 20.x
(記住一定要卸載干凈,版本一定要兼容,不然安裝插件會報(bào)版本不兼容的錯(cuò)誤)
下面截圖就不更新了,沒啥必要,只是版本號不同,操作幾乎大同小異。(最終是連接上了,確實(shí)是版本不兼容的問題,真是各處坑都踩完……)
3.1安裝erLang語言,配置環(huán)境變量
1、先到官網(wǎng)下載,Erlang官網(wǎng):官網(wǎng)(下載win10版)
2、下載完成為otp_win64_26.0.exe
,接著雙擊安裝,一直點(diǎn)next
就行了(可以切換安裝路徑),安裝完之后,配置環(huán)境變量。
3、 環(huán)境變量配置完畢,使用cmd命令,輸入erl -version
驗(yàn)證是否成功。
成功截圖類似下圖:
3.2 安裝RabbitMQ服務(wù)端
1、在RabbitMQ的github上
下載window版
本的服務(wù)端安裝包。
下載地址:Release RabbitMQ 3.8.32 · rabbitmq/rabbitmq-server (github.com) )
2、下載為rabbitmq_server-3.8.32.exe
,接著到雙擊安裝,一直點(diǎn)下一步安裝即可(可以切換安裝路徑),安裝完成后,找到安裝目錄下\rabbitmq\rabbitmq_server-3.8.32\sbin
打開cmd命令,輸入rabbitmq-plugins enable rabbitmq_management
命令安裝管理頁面的插件。
3、 雙擊rabbitmq-server.bat
啟動(dòng)腳本,然后打開服務(wù)管理可以看到RabbitMQs
是否正在運(yùn)行。(降低版本后,沒有注冊到服務(wù)上,需要啟動(dòng)腳本,不要關(guān)閉命令行窗口,使得服務(wù)在其上跑著)
3.3 測試安裝效果
1、 打開瀏覽器輸入http://localhost:15672
賬號密碼默認(rèn)是:guest/guest
,成功效果:
2、安裝成功,登錄后的效果如下圖。
四、源碼解析
看源碼自我總結(jié)出來的看新項(xiàng)目時(shí)的基本步驟,首先先看集成和配置,在從業(yè)務(wù)的角度來分析,結(jié)合集成的框架和組件,來依次剝削系統(tǒng)的架構(gòu)。
**解析內(nèi)容:**下方的解析內(nèi)容大部分在圖中解釋,外面就不做過多的闡述。
4.1 集成與配置
直接拿源碼分析,只分析與rabbitmq有關(guān)的部分,其它部分讀者請,自行看源碼分析。
**項(xiàng)目啟動(dòng):**只需要啟動(dòng)mall-tiny-rabbit
模塊的部分即可。
**啟動(dòng)所需:**啟動(dòng)RabbitMQ的服務(wù)(前面有安裝win10版)
4.1.1 導(dǎo)入依賴
在pom文件
中導(dǎo)入rabbitmq的相關(guān)依賴spring-boot-starter-amqp
(rabbitmq集成進(jìn)springboot)。
4.1.2 添加配置
在application.yml
中添加rabbitmq的相關(guān)配置。
4.1.3 創(chuàng)建用戶,密碼,綁定角色(在命令行下)
rabbitmq的用戶管理包括增加用戶,刪除用戶,查看用戶列表,修改用戶密碼。
1、 查看已有用戶及用戶的角色:
rabbitmqctl.bat list_users
2、 新增一個(gè)用戶:
// rabbitmqctl.bat add_user username password
rabbitmqctl.bat add_user mall mall
3、刪除一個(gè)用戶:
// 注意觀察查詢、添加、刪除都是只換前綴,更新亦然,就不列舉了
rabbitmqctl.bat delete_user mall
4、綁定角色:
rabbitmqctl.bat set_user_tags mall administrator
4.1.4 創(chuàng)建用戶,密碼,綁定角色(在web界面管理工具下)
1、介紹web界面管理工具頁
2、 添加用戶和給予角色
3、由于yml文件中配置有virtual-host: /mall
, 添加Virtual Hosts
(可以理解成一個(gè)數(shù)據(jù)庫,類似于mysql、oracle之類的)
4.1.5 拓展
rabbitmq用戶角色可分為五類:超級管理員, 監(jiān)控者, 策略制定者, 普通管理者以及其他。
(1) 超級管理員(administrator)
可登陸管理控制臺(啟用management plugin的情況下),可查看所有的信息,并且可以對用戶,策略(policy)進(jìn)行操作。
(2) 監(jiān)控者(monitoring)
可登陸管理控制臺(啟用management plugin的情況下),同時(shí)可以查看rabbitmq節(jié)點(diǎn)的相關(guān)信息(進(jìn)程數(shù),內(nèi)存使用情況,磁盤使用情況等)
(3) 策略制定者(policymaker)
可登陸管理控制臺(啟用management plugin的情況下), 同時(shí)可以對policy進(jìn)行管理。
(4) 普通管理者(management)
僅可登陸管理控制臺(啟用management plugin的情況下),無法看到節(jié)點(diǎn)信息,也無法對策略進(jìn)行管理。
(5) 其他的
無法登陸管理控制臺,通常就是普通的生產(chǎn)者和消費(fèi)者。
4.2 深入淺出
4.2.1 六種消息模式介紹
六種消息模式的官網(wǎng):RabbitMQ Tutorials — RabbitMQ
Simple Work Queue
(簡單工作隊(duì)列):也就是常說的點(diǎn)對點(diǎn)模式,一條消息由一個(gè)消費(fèi)者進(jìn)行消費(fèi)。(當(dāng)有多個(gè)消費(fèi)者時(shí),默認(rèn)使用輪訓(xùn)機(jī)制把消息分配給消費(fèi)者)。Work Queues
(工作隊(duì)列):也叫公平隊(duì)列,能者多勞的消息隊(duì)列模型。隊(duì)列必須接收到來自消費(fèi)者的 手動(dòng)ack 才可以繼續(xù)往消費(fèi)者發(fā)送消息。Publish/Subscribe
(發(fā)布訂閱模式):一條消息被多個(gè)消費(fèi)者消費(fèi)。Routing
(路由模式):有選擇的接收消息。Topics
(主題模式):通過一定的規(guī)則來選擇性的接收消息。RPC
模式:發(fā)布者發(fā)布消息,并且通過 RPC 方式等待結(jié)果。(使用場景少,在源碼中沒有,想了解的可以去官網(wǎng)了解)
ps:官網(wǎng)最后有一個(gè) Publisher Confirms
為消息確認(rèn)機(jī)制。指的是生產(chǎn)者如何發(fā)送可靠的消息。
4.2.2 簡單工作隊(duì)列模式
一條消息由一個(gè)消費(fèi)者進(jìn)行消費(fèi) (當(dāng)有多個(gè)消費(fèi)者時(shí),默認(rèn)使用輪訓(xùn)機(jī)制把消息分配給消費(fèi)者)
1、 配置類
配置 RabbitMQ 的 Spring 配置類 SimpleRabbitConfig
,其中創(chuàng)建了一個(gè)消息隊(duì)列對象、一個(gè)發(fā)送消息的對象(SimpleSender
),以及一個(gè)接收消息的對象(SimpleReceiver
)。這些對象都將由 Spring 框架進(jìn)行管理和注入。
2、消息發(fā)送者
3、消息消費(fèi)者
4、簡單工作隊(duì)列模式的控制層接口
5、swagger發(fā)送效果
swagger無法啟動(dòng)的,請參考我上一篇博文: mall:redis項(xiàng)目源碼解析_憶~遂愿的博客-CSDN博客
6、rabbitmq服務(wù)端的界面顯示效果
7、idea控制臺打印的日志信息
4.2.3 工作隊(duì)列模式
公平隊(duì)列,能者多勞的消息隊(duì)列模型。隊(duì)列必須接收到來自消費(fèi)者的 手動(dòng)ack 才可以繼續(xù)往消費(fèi)者發(fā)送消息。(模擬消費(fèi))
1、 定義了一些消息隊(duì)列以及相應(yīng)的消息接收器和發(fā)送器
2、消息發(fā)送者
3、消息消費(fèi)者
4、工作隊(duì)列模式的控制層接口
5、idea控制臺打印的日志信息
4.2.4 發(fā)布訂閱模式
一條消息被多個(gè)消費(fèi)者消費(fèi)。
1、配置類
2、消息發(fā)送者
3、消息消費(fèi)者
4、發(fā)布/訂閱模式的控制層接口
5、rabbitmq服務(wù)端的界面顯示效果
6、idea控制臺打印的日志信息
4.2.5 路由模式
有選擇的接收消息。
1、配置類
通過配置不同的綁定鍵,可以將不同的隊(duì)列綁定到同一個(gè)交換機(jī)上,以實(shí)現(xiàn)消息的路由和分發(fā)。
2、消息發(fā)送者
3、消息消費(fèi)者
4、路由模式的控制層接口
5、idea控制臺打印的日志信息
4.2.5 主題模式
通過一定的規(guī)則來選擇性的接收消息。
1、配置類
2、消息發(fā)送者
3、消息消費(fèi)者
4、路由模式的控制層接口
5、idea控制臺打印的日志信息
五、總結(jié)
本文是有我先從實(shí)際項(xiàng)目中獲取需求,從而對RabbitMQ消息隊(duì)列的學(xué)習(xí),結(jié)合源碼來學(xué)習(xí),從mall
開源項(xiàng)目中學(xué)習(xí)RabbitMQ,感覺收獲頗深,希望這篇文章對你們也會有所幫助。
后續(xù)我也會結(jié)合該框架學(xué)習(xí)一下其他的技術(shù)棧。
盈若安好,便是晴天