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

KingJack發表於2022-11-30

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當中的彎路

相關文章