RocketMQ系列-搭建Namesrv原始碼偵錯環境

2022-11-30 21:00:27

RocketMQ系列-搭建Namesrv原始碼偵錯環境

在學習任何一個技術框架的時候,我們通常都是先了解是什麼,有什麼作用、解決什麼問題、設計亮點和設計思想是什麼;當然對於技術學習上來說,這只是紙上談兵,一開始比較基礎的學習,當我們想要深入的時候,我們必不可少的就是希望能夠去偵錯原始碼,能夠在本地執行一下這個技術框架,能夠斷點偵錯一下這個框架最核心的功能或者看一下內部的資料結構。所以我們學習一個技術框架,特別核心的一點就是,要在本地搭建我們的原始碼偵錯環境。

筆者在這裡,就把RocketMQ的整個原始碼偵錯環境搭建的過程給梳理出來,不過因為筆者的開發環境是Windows的,所以以下所有內容都是基於Windows環境實踐得出來的。

PS:筆者在這裡說一下,可能對於不瞭解RocketMQ或者說是零基礎的讀者來說,會有一些很陌生的詞彙,例如Namesrv,Broker之類的,也不用怕,因為這個RocketMQ系列的誕生,正是因為筆者完完全全體驗到了學習RocketMQ的痛苦,不想對RocketMQ感興趣想要深入研究的讀者也體驗一遍,所以才總結自己這次學習RocketMQ的方式,讓讀者能夠完全從使用角度去了解,研究RocketMQ的功能以及深入原始碼,而不是一個模組一個模組的單體化了解。

Namesrv原始碼偵錯環境搭建

匯入專案到IDEA

因為筆者用的IDEA開發工具,所以以下的教學演示都是基於IDEA的。

  • 克隆專案到本地

https://github.com/apache/rocketmq

讀者需要先將RocketMQ的原始碼給下載到本地來。

在這裡,筆者給各位讀者一個建議,可以先將RocketMQ的原始碼從GitHub匯入到碼雲,然後再克隆到本地來,最好建立一個新的分支來進行原始碼學習和寫一定的註釋

  • 匯入專案到IDEA

按照maven的方式open RocketMQ目錄,因為筆者已經open過了,所以不會出現maven的提示,如果讀者的出現了,點選trust project即可,然後就等待下載對應的依賴即可

建立所需目錄

我們使用任何一箇中介軟體,都知道在部署啟動的時候,肯定是會有存放組態檔的目錄,還會有儲存中介軟體本身產生對應紀錄檔和資料的目錄,我們這裡就是需要建立這樣的目錄。

  • 組態檔目錄-conf

在RocketMQ原始碼根目錄下建立存放組態檔的目錄-conf

  • 建立資料目錄-data

在RocketMQ原始碼根目錄下建立存放RocketMQ本身存放資料的目錄-data

  • 建立紀錄檔目錄-logs

在RocketMQ原始碼根目錄下建立存放RocketMQ執行紀錄檔的目錄-logs

環境設定

  • 將Namesrv的紀錄檔設定拷貝到我們上面建立的conf目錄下

讀者可能會疑惑,我怎麼知道Namesrv的紀錄檔設定是怎麼樣的,這些問題RocketMQ都已經給我們想好了,在RocketMQ原始碼目錄下,有一個distribution的目錄,下面有不同模式部署RocketMQ對應的組態檔,目前我們本地跑,暫時只需要使用外面最基礎的組態檔就可

  • 設定環境變數

我們需要設定對應的環境變數,讓RocketMQ啟動的時候,把我們當前的原始碼目錄作為根目錄,這樣它才能找到執行所需的組態檔在哪

ROCKETMQ_HOME=E:\study\source_code_learn\rocketmq

  • 修改${user.home}屬性

讀者可以開啟剛才準備好的紀錄檔檔案看一下,發現裡面會有一堆${user.home}

我們想把RocketMQ執行產生的紀錄檔指定放在我們之前準備好的logs目錄下的話,放任不管肯定是不行,當然讀者也可以選擇直接將${user.home}直接全量替換成我們紀錄檔目錄的絕對路徑,不過在這裡,筆者喜歡用另一種方式,通過增加一句程式碼的方式來實現。

我們開啟Namesrv的啟動類,也就是org.apache.rocketmq.namesrv.NamesrvStartup。在裡面加上一句程式碼

public static NamesrvController main0(String[] args) {

        try {
            // 新增此行程式碼指定user.home
            System.setProperty("user.home", "E:/study/source_code_learn/rocketmq");
            NamesrvController controller = createNamesrvController(args);
            start(controller);
            String tip = "The Name Server boot success. serializeType=" + RemotingCommand.getSerializeTypeConfigInThisServer();
            log.info(tip);
            System.out.printf("%s%n", tip);
            return controller;
        } catch (Throwable e) {
            e.printStackTrace();
            System.exit(-1);
        }

        return null;
    }

啟動Namesrv

到了最關鍵的時候,直接啟動Namesrv

點選啟動按鈕,看到如下輸出,還有如果有對應紀錄檔檔案產生,那就是成功了

總結

通過上面一系列的操作,我們終於把我們的Namesrv給啟動起來了,這樣子我們就能夠在我們本地去偵錯Namesrv啟動的整個過程,可以看一下都進行了什麼操作,內部使用了什麼資料結構,儲存了什麼後設資料。還是那句,想要深入研究任何一個技術框架,在自己本地搭建一個原始碼偵錯環境是必不可少的。

題外話

也許有不少讀者會覺得這文章實在是太過於簡單了,但是筆者是打算總結自己這次在學習RocketMQ當中遇到的所有痛點,然後按照一個使用者,結合深入學習的角度去一步步深入,才會打算將自己的整個學習過程給整理成一個系列,最後輸出成文章,一是希望將自己的所學進行沉澱,二也是希望廣大讀者能夠減少在學習RocketMQ當中的彎路