Rocketmq的Namesrv服务启动时都做了什么
2020-04-09 本文已影响0人
王广帅
rocketmq-namesrv服务的启动类是NamesrvStartup。在启动的时候,首要的加载两个配置文件的信息,这两个配置文件对应的类是NamesrvConfig
和NettyServerConfig
。
NamesrvConfig
它的配置内容是:
private String rocketmqHome = System.getProperty(MixAll.ROCKETMQ_HOME_PROPERTY, System.getenv(MixAll.ROCKETMQ_HOME_ENV));
private String kvConfigPath = System.getProperty("user.home") + File.separator + "namesrv" + File.separator + "kvConfig.json";
private String configStorePath = System.getProperty("user.home") + File.separator + "namesrv" + File.separator + "namesrv.properties";
private String productEnvName = "center";
private boolean clusterTest = false;
private boolean orderMessageEnable = false;
- rocketmqHome
这是rocketmq运行的根目录,它默认是从环境变量里面获取的,它不能为空,如果为空,Namesrv服务就会启动失败,并退出jvm,如下所示:
if (null == namesrvConfig.getRocketmqHome()) {
System.out.printf("Please set the %s variable in your environment to match the location of the RocketMQ installation%n", MixAll.ROCKETMQ_HOME_ENV);
System.exit(-2);
}
在rocketmq-namesrv的启动脚本mqnamesrv
中会设置这个字段的环境变量值
if [ -z "$ROCKETMQ_HOME" ] ; then
## resolve links - $0 may be a link to maven's home
PRG="$0"
# need this for relative symlinks
while [ -h "$PRG" ] ; do
ls=`ls -ld "$PRG"`
link=`expr "$ls" : '.*-> \(.*\)$'`
if expr "$link" : '/.*' > /dev/null; then
PRG="$link"
else
PRG="`dirname "$PRG"`/$link"
fi
done
saveddir=`pwd`
ROCKETMQ_HOME=`dirname "$PRG"`/..
# make it fully qualified
ROCKETMQ_HOME=`cd "$ROCKETMQ_HOME" && pwd`
cd "$saveddir"
fi
export ROCKETMQ_HOME
-
kvConfigPath
存储KV健值对的文件路径,在服务器启动的会从这个路径文件中加载到内存中。最外层是Namespace,说明这些键值对是在不同的命令空间下的。 -
configStorePath
namesrv.properties文件的路径 -
configStorePath
如果是通过配置文件启动Namesrv服务的,这个字段就是用来存储这个配置文件的存储路径的。
如果在启动Namesrv时,指定了配置文件,那么NamesrvConfig
和NettyServerConfig
的配置信息就会从这个配置文件中加载。
在rocketmq的官方发布版本中,并没有指定这个配置文件,使用的都是默认的参数。如果想修改默认的配置参数,可以通过这个配置文件进行修改。然后修改服务的启动脚本,指定配置文件的路径。
另外,NamesrvConfig的参数也可以在命令行中指定,即从main方法的args中读取,它的优先级最高,它会覆盖配置文件中的参数。
NettyServerConfig
这个配置类是封装的是一些服务启动时,Netty相关的参数,比如端口,线程数等。
private int listenPort = 8888;//服务监听的端口,在启动的时候会默认设置为9876
private int serverWorkerThreads = 8;
private int serverCallbackExecutorThreads = 0;
private int serverSelectorThreads = 3;
private int serverOnewaySemaphoreValue = 256;
private int serverAsyncSemaphoreValue = 64;
private int serverChannelMaxIdleTimeSeconds = 120;
private int serverSocketSndBufSize = NettySystemConfig.socketSndbufSize;
private int serverSocketRcvBufSize = NettySystemConfig.socketRcvbufSize;
private boolean serverPooledByteBufAllocatorEnable = true;
除了端口,如果不是为了性能优化,基本上不需要修改,默认即可。
加载日志配置文件
它使用的是logback的日志框架。
LoggerContext lc = (LoggerContext) LoggerFactory.getILoggerFactory();
JoranConfigurator configurator = new JoranConfigurator();
configurator.setContext(lc);
lc.reset();
configurator.doConfigure(namesrvConfig.getRocketmqHome() + "/conf/logback_namesrv.xml");
log = InternalLoggerFactory.getLogger(LoggerName.NAMESRV_LOGGER_NAME);
这个配置文件在RocketmqHome下的config/目录下面。
启动Netty服务
最后一步就是根据配置信息,初始化NamesrvController,然后调用start方法,启动Netty服务。
欢迎关注