RocketMQ源碼分析之NameSrv

RocketMQ源碼分析我們主要從NameSrv、路由、生產者、消費者、消息存儲等方面一點點分析,本章主要講的是NameSrv的源碼分析。

NameSrv的啓動類:org.apache.rocketmq.namesrv.NamesrvStartup。

NamesrvStartup的main()方法中調用main0(args),mian0()中其實最主要是createNamesrvController()和start()方法。

NameSrv啓動,其實整體分爲三個步驟:創建NameSrvController、實例化NameSrvController、銷燬NameSrvController,createNamesrvController()方法就是創建NameSrvController,start()方法包括了實例化NameSrvController和銷燬NameSrvController。至於每一步具體幹什麼了,我們跟着代碼一步步分析。

一、創建NameSrvController

該步驟在NamesrvStartup.createNamesrvController()方法中,主要是創建兩個配置文件類,NamesrvConfig和NettyServerConfig。

NamesrvConfig是幹嘛用的我就不多說了,大家應該都知道;

NettyServerConfig是計算器網絡通信的基礎,這裏就不細說Netty,只說這個的功能,是保證NamaSrv跟Broker以及生產者、消費者通信的工具。可以進入NettyServerConfig類可以看到,Netty默認監聽的是8888端口,但是RocketMQ給Netty改了這個接口,使用的是9876.

然後從配置文件中讀取相應的參數,填充這兩個配置文件,如果沒有配置文件,則讀取默認的配置。

至於這個額外的配置文件在哪用參數配置,在IDEA的Edit Configurations中配置

 Program arguments:配置配置文件,根據源碼可知,若使用的是-c,則後面跟着配置的位置,如果是-p,則後面直接寫參數以及值,格式:參數=參數值;

Environment variables:配置環境變量,如果是項目使用的環境變量,可以在這裏直接配置該項目的環境變量,例如ROCKETMQ_HOME的位置,是key_value類型的。

繼續跟着代碼向下看,配置文件類經過參數填充以後,調用NamesrvController的構造方法創建NamesrvController,然後返回controller,創建NameSrvController的步驟結束。

二、實例化NameSrvController

createNamesrvController()返回了controller,然後就是start(controller)了。

start()方法中主要包括兩部分,咱們先分析實例化NameSrvController的部分,後面再分析銷燬NameSrvController

 NameSrvController的實例化方法initialize()中分爲以下幾步,kv管理器加載本地參數、創建一個netty服務端,創建netty服務的線程池,創建一個定時線程任務掃描失去心跳的broker。

創建netty服務端時因爲broker要跟namesrv發送心跳,namesrv作爲通信的服務端。

創建定時線程任務延遲5秒執行,每隔10秒掃描一次失去心跳的broker,將broker中最後一次發送心跳的時間加上默認的等待時間(默認兩分鐘),如果小於當前時間則從broker移除。

三、銷燬NameSrvController

在start()方法的最後,在JVM中註冊了一個鉤子函數,當jvm退出的時候,釋放資源。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章