一、前言
环境: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();
}
}