mall :rabbit專案原始碼解析

2023-08-30 21:01:34

一、mall開源專案

1.1 來源

mall學習教學,架構、業務、技術要點全方位解析。mall專案(50k+star)是一套電商系統,使用現階段主流技術實現。涵蓋了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等技術,採用Docker容器化部署。

專案github地址: github.com

1.2 專案轉移

可以把github上的專案轉移到gitee上,方便克隆到idea。

具體步驟如下:

1.3 專案克隆

由於github部署在國外,雖然idea也支援從github上拉取,但是克隆速度太慢,所以才推薦上述匯入gitee後在克隆專案到idea。

具體的克隆步驟過於簡單和常規化,讀者可自行完成,或百度一下~

二、RabbitMQ 訊息中介軟體

RabbitMQ 訊息的傳遞:是由『 生產者 -> 交換機 -> 佇列 -> 消費者 』這麼一個模式,只不過對等模式和工作佇列模式我們可以理解成是一個匿名的交換機進行投遞佇列。

2.1 rabbit簡介

RabbitMQ 官網官網

RabbitMQ是一個訊息代理 - 一個訊息系統的媒介。它可以為你的應用提供一個通用的訊息傳送和接收平臺,並且保證訊息在傳輸過程中的安全。

RabbitMQ是一款使用Erlang語言開發的,實現AMQP(高階訊息佇列協定)的開源訊息中介軟體。首先要知道一些RabbitMQ的特點如下:

  • 可靠性。支援持久化,傳輸確認,釋出確認等保證了MQ的可靠性。
  • 靈活的分發訊息策略。這應該是RabbitMQ的一大特點。在訊息進入MQ前由Exchange(交換機)進行路由訊息。分發訊息策略有:簡單模式、工作佇列模式、釋出訂閱模式、路由模式、萬用字元模式。
  • 支援叢集。多臺RabbitMQ伺服器可以組成一個叢集,形成一個邏輯Broker。
  • 多種協定。RabbitMQ支援多種訊息佇列協定,比如 STOMP、MQTT 等等。
  • 支援多種語言使用者端。RabbitMQ幾乎支援所有常用程式語言,包括 Java、.NET、Ruby 等等。
  • 視覺化管理介面。RabbitMQ提供了一個易用的使用者介面,使得使用者可以監控和管理訊息 Broker。
  • 外掛機制。RabbitMQ提供了許多外掛,可以通過外掛進行擴充套件,也可以編寫自己的外掛。

rabbit開發檔案地址: [java使用者端開發檔案]( Java使用者端指南 · RabbitMQ in Chinese (mr-ping.com) )

2.2 分散式後端專案的使用流程

下圖是結合專案經歷,外加百度查詢資料,自行總結的基本使用流程。

rabbitmq的使用流程圖如下:

2.3 分散式後端專案的使用場景

下圖是結合專案經歷,外加百度查詢資料,自行總結的基本使用場景。

rabbitmq的使用場景圖如下:

三、安裝RabbitMQ(Win10)

由於以前都是在Linux上操作rabbitmq( 一般用Docker拉一個RabbitMQ的映象下來,省去環境的部署 ),現在解讀原始碼,嘗試一下在win10下操作,需要先有環境, 首先先下載Erlang ,再下載RabbitMQ伺服器端

psRabbitMQErlang是緊密相關的,因此在選擇RabbitMQ版本時,需要確保它與您安裝的特定Erlang版本相容。

Erlang/OTP 26.0.2與之相容版本是RabbitMQ 3.8.x 或者 更高

❌寫到後面我憨住了,早知道不選這麼高的版本了

經過:安裝好兩個版本後,忘記看專案中 spring-boot-starter-amqp版本為2.1.3作為RabbitMQ使用者端庫,結果版本不相容,導致一直連不上,網上百度一堆問題,我都仔細刷選過了,都是正確的。後面只能把問題定位到版本不相容上了,然後說退而求其次,去升級spring-boot-starter-amqp版本為2.3.x就可以完美解決,沒想到的是...

阿里雲倉庫太坑了,居然沒有。。。

Could not find artifact org.springframework.boot:spring-boot-starter-amqp:pom:2.3.3 in alimaven

然後百度找了許多教學,說改範圍的還有換映象的,結果都試了一下,結果這個找不到就算了,其它的依賴也全報錯,應該是倉庫的依賴衝突啥的,就不深究了。。。

✒️還是跟著專案走,將 ErlangRabbitMQ伺服器端版本降下來。

spring-boot-starter-amqp的版本為2.1.3 是與 RabbitMQ 3.7.x 版本相容的版本

這裡下載RabbitMQ伺服器端:rabbitmq-server-3.7.3.exe

對應的Erlang 版本在19.3 - 20.x記住一定要解除安裝乾淨,版本一定要相容,不然安裝外掛會報版本不相容的錯誤

下面截圖就不更新了,沒啥必要,只是版本號不同,操作幾乎大同小異。(最終是連線上了,確實是版本不相容的問題,真是各處坑都踩完……)

3.1安裝erLang語言,設定環境變數

1、先到官網下載,Erlang官網:官網(下載win10版)

2、下載完成為otp_win64_26.0.exe,接著雙擊安裝,一直點next就行了(可以切換安裝路徑),安裝完之後,設定環境變數。

3、 環境變數設定完畢,使用cmd命令,輸入erl -version驗證是否成功。

成功截圖類似下圖:

3.2 安裝RabbitMQ伺服器端

1、在RabbitMQ的github上下載window版本的伺服器端安裝包。

下載地址:Release RabbitMQ 3.8.32 · rabbitmq/rabbitmq-server (github.com) )

2、下載為rabbitmq_server-3.8.32.exe,接著到雙擊安裝,一直點下一步安裝即可(可以切換安裝路徑),安裝完成後,找到安裝目錄下\rabbitmq\rabbitmq_server-3.8.32\sbin 開啟cmd命令,輸入rabbitmq-plugins enable rabbitmq_management命令安裝管理頁面的外掛。

3、 雙擊rabbitmq-server.bat啟動指令碼,然後開啟服務管理可以看到RabbitMQs是否正在執行。(降低版本後,沒有註冊到服務上,需要啟動指令碼,不要關閉命令列視窗,使得服務在其上跑著)

3.3 測試安裝效果

1、 開啟瀏覽器輸入http://localhost:15672

賬號密碼預設是:guest/guest,成功效果:

2、安裝成功,登入後的效果如下圖。

四、原始碼解析

看原始碼自我總結出來的看新專案時的基本步驟,首先先看整合和設定,在從業務的角度來分析,結合整合的框架和元件,來依次剝削系統的架構。

解析內容:下方的解析內容大部分在圖中解釋,外面就不做過多的闡述。

4.1 整合與設定

直接拿原始碼分析,只分析與rabbitmq有關的部分,其它部分讀者請,自行看原始碼分析。

專案啟動:只需要啟動mall-tiny-rabbit模組的部分即可。

啟動所需:啟動RabbitMQ的服務(前面有安裝win10版)

4.1.1 匯入依賴

pom檔案中匯入rabbitmq的相關依賴spring-boot-starter-amqp(rabbitmq整合進springboot)。

4.1.2 新增設定

application.yml中新增rabbitmq的相關設定。

4.1.3 建立使用者,密碼,繫結角色(在命令列下)

rabbitmq的使用者管理包括增加使用者,刪除使用者,檢視使用者列表,修改使用者密碼。

1、 檢視已有使用者及使用者的角色:

rabbitmqctl.bat list_users

2、 新增一個使用者:

// rabbitmqctl.bat add_user username password
rabbitmqctl.bat add_user mall mall

3、刪除一個使用者:

// 注意觀察查詢、新增、刪除都是隻換字首,更新亦然,就不列舉了
rabbitmqctl.bat delete_user mall

4、繫結角色:

rabbitmqctl.bat set_user_tags mall administrator

4.1.4 建立使用者,密碼,繫結角色(在web介面管理工具下)

1、介紹web介面管理工具頁

2、 新增使用者和給予角色

3、由於yml檔案中設定有virtual-host: /mall, 新增Virtual Hosts(可以理解成一個資料庫,類似於mysql、oracle之類的)

4.1.5 拓展

rabbitmq使用者角色可分為五類:超級管理員, 監控者, 策略制定者, 普通管理者以及其他。

(1) 超級管理員(administrator)

可登陸管理控制檯(啟用management plugin的情況下),可檢視所有的資訊,並且可以對使用者,策略(policy)進行操作。

(2) 監控者(monitoring)

可登陸管理控制檯(啟用management plugin的情況下),同時可以檢視rabbitmq節點的相關資訊(程序數,記憶體使用情況,磁碟使用情況等)

(3) 策略制定者(policymaker)

可登陸管理控制檯(啟用management plugin的情況下), 同時可以對policy進行管理。

(4) 普通管理者(management)

僅可登陸管理控制檯(啟用management plugin的情況下),無法看到節點資訊,也無法對策略進行管理。

(5) 其他的

無法登陸管理控制檯,通常就是普通的生產者和消費者。

4.2 深入淺出

4.2.1 六種訊息模式介紹

六種訊息模式的官網RabbitMQ Tutorials — RabbitMQ

  1. Simple Work Queue(簡單工作佇列):也就是常說的對等模式,一條訊息由一個消費者進行消費。(當有多個消費者時,預設使用輪訓機制把訊息分配給消費者)。
  2. Work Queues (工作佇列):也叫公平佇列,能者多勞的訊息佇列模型。佇列必須接收到來自消費者的 手動ack 才可以繼續往消費者傳送訊息。
  3. Publish/Subscribe (釋出訂閱模式):一條訊息被多個消費者消費。
  4. Routing(路由模式):有選擇的接收訊息。
  5. Topics(主題模式):通過一定的規則來選擇性的接收訊息。
  6. RPC 模式:釋出者釋出訊息,並且通過 RPC 方式等待結果。(使用場景少,在原始碼中沒有,想了解的可以去官網瞭解)

ps:官網最後有一個 Publisher Confirms訊息確認機制。指的是生產者如何傳送可靠的訊息。

4.2.2 簡單工作佇列模式

一條訊息由一個消費者進行消費 (當有多個消費者時,預設使用輪訓機制把訊息分配給消費者)

1、 設定類

設定 RabbitMQ 的 Spring 設定類 SimpleRabbitConfig,其中建立了一個訊息佇列物件、一個傳送訊息的物件(SimpleSender),以及一個接收訊息的物件(SimpleReceiver)。這些物件都將由 Spring 框架進行管理和注入。

2、訊息傳送者

3、訊息消費者

4、簡單工作佇列模式的控制層介面

5、swagger傳送效果

swagger無法啟動的,請參考我上一篇博文: mall:redis專案原始碼解析_憶~遂願的部落格-CSDN部落格

6、rabbitmq伺服器端的介面顯示效果

7、idea控制檯列印的紀錄檔資訊

4.2.3 工作佇列模式

公平佇列,能者多勞的訊息佇列模型。佇列必須接收到來自消費者的 手動ack 才可以繼續往消費者傳送訊息。(模擬消費)

1、 定義了一些訊息佇列以及相應的訊息接收器和傳送器

2、訊息傳送者

3、訊息消費者

4、工作佇列模式的控制層介面

5、idea控制檯列印的紀錄檔資訊

4.2.4 釋出訂閱模式

一條訊息被多個消費者消費。

1、設定類

2、訊息傳送者

3、訊息消費者

4、釋出/訂閱模式的控制層介面

5、rabbitmq伺服器端的介面顯示效果

6、idea控制檯列印的紀錄檔資訊

4.2.5 路由模式

有選擇的接收訊息。

1、設定類

通過設定不同的繫結鍵,可以將不同的佇列繫結到同一個交換機上,以實現訊息的路由和分發。

2、訊息傳送者

3、訊息消費者

4、路由模式的控制層介面

5、idea控制檯列印的紀錄檔資訊

4.2.5 主題模式

通過一定的規則來選擇性的接收訊息。

1、設定類

2、訊息傳送者

3、訊息消費者

4、路由模式的控制層介面

5、idea控制檯列印的紀錄檔資訊

五、總結

本文是有我先從實際專案中獲取需求,從而對RabbitMQ訊息佇列的學習,結合原始碼來學習,從mall開源專案中學習RabbitMQ,感覺收穫頗深,希望這篇文章對你們也會有所幫助。

後續我也會結合該框架學習一下其他的技術棧。

盈若安好,便是晴天