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服務。