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

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