RocketMQ-Name server源碼深度解析

一、前言

環境:window 64bit , mq版本爲4.5.1 , jdk 1.8

二、namesrv配置相關

1.命令行參數

可以看到namesrv可以通過配置文件配置相應的參數和地址

# mqnamesrv.cmd -h

usage: mqnamesrv [-c <arg>] [-h] [-n <arg>] [-p]
 -c,--configFile <arg>    配置文件路徑
 -h,--help                打印幫助
 -n,--namesrvAddr <arg>   Name server 地址, eg: 192.168.0.1:9876;  192.168.0.2:9876
 -p,--printConfigItem     打印所有配置項到控制檯

查看namesrv有哪些配置項可以供我們配置

# mqnamesrv.cmd -p


RocketmqNamesrvConsole - kvConfigPath=C:\Users\Administrator\namesrv\kvConfig.json

NameServer 配置文件路徑
RocketmqNamesrvConsole - configStorePath=C:\Users\Administrator\namesrv\namesrv.properties

RocketmqNamesrvConsole - productEnvName=center

是否開啓集羣測試
RocketmqNamesrvConsole - clusterTest=false 

是否支持順序消息
RocketmqNamesrvConsole - orderMessageEnable=false

監聽端口
RocketmqNamesrvConsole - listenPort=9876

Netty 業務線程池線程個數
RocketmqNamesrvConsole - serverWorkerThreads=8


RocketmqNamesrvConsole - serverCallbackExecutorThreads=0


RocketmqNamesrvConsole - serverSelectorThreads=3

send oneway 消息請求併發度
RocketmqNamesrvConsole - serverOnewaySemaphoreValue=256

異步消息發送最大併發度
RocketmqNamesrvConsole - serverAsyncSemaphoreValue=64

網絡連接最大空閒時間,單位秒,如果連接空閒時間超過該參數設置的值,連接將被關閉
RocketmqNamesrvConsole - serverChannelMaxIdleTimeSeconds=120

網絡 socket 發送緩存區大小,單位 B,即默認爲 64KB
RocketmqNamesrvConsole - serverSocketSndBufSize=65535

網絡 socket 接收緩存區大小,單位 B,即默認爲 64KB
RocketmqNamesrvConsole - serverSocketRcvBufSize=65535

ByteBuffer 是否開啓緩存,建議開啓
RocketmqNamesrvConsole - serverPooledByteBufAllocatorEnable=true

是否啓用 Epoll IO 模型
RocketmqNamesrvConsole - useEpollNativeSelector=false

2.配置namesrv.properties

創建namesrv.properties文件並輸入以下內容,這裏爲了演示只配置了端口爲9877,其他爲默認值

listenPort = 9877

通過配置文件的方式啓動namesrv

start mqnamesrv.cmd -c f:\\RocketMQ\rocketmq-all-4.5.1\distribution\conf\namesrv.properties

輸出如下內容表示啓動成功:
load config properties file OK, f:\\RocketMQ\rocketmq-all-4.5.1\distribution\conf\namesrv.properties
The Name Server boot success. serializeType=JSON

檢查配置是否生效

查看端口占用情況
# netstat -aon|findstr "9877"

 TCP    0.0.0.0:9877           	0.0.0.0:0              LISTENING       8632
 TCP    [::]:9877             		 [::]:0            LISTENING       8632

根據pid查進程名,可以看到已經是生效了的

# tasklist|findstr "8632"

java.exe                      8632 Console                   13     98,800 K

3.namesrv如何讀取配置文件

       我們來看org.apache.rocketmq.namesrv.NamesrvStartup.java這個類的一段代碼, 大致邏輯就是讀取配置文件內容,通過反射方式將配置文件中的值設置到配置對象對應的變量

// namesrv和nettyServer的配置對象
final NamesrvConfig namesrvConfig = new NamesrvConfig();
final NettyServerConfig nettyServerConfig = new NettyServerConfig();

// 默認監聽端口爲9876
nettyServerConfig.setListenPort(9876);

// 如果命令行參數中有c , 也就是剛纔啓動namesrv時有指定配置文件路徑
if (commandLine.hasOption('c')) {
	// 拿到文件路徑
	String file = commandLine.getOptionValue('c');
   	if (file != null) {
		InputStream in = new BufferedInputStream(new FileInputStream(file));
           properties = new Properties();
           // 將配置文件的值存到properties對象裏
           properties.load(in);
           
           // 通過反射方式調用namesrvConfig的set方法賦值
           MixAll.properties2Object(properties, namesrvConfig);
           MixAll.properties2Object(properties, nettyServerConfig);

           namesrvConfig.setConfigStorePath(file);
           System.out.printf("load config properties file OK, %s%n", file);
           in.close();
	}
}

未完待續

參考文檔

https://www.jianshu.com/p/fb8c1c965254

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