RocketMQ 源码分析 nameser启动

原文地址:https://blog.****.net/MakeContral/article/details/84898603

 

前言
在RocketMQ中,NameServer的目的是为了解耦Broker和Producer、Consumer。官方文档对NameServer有一个概括:NameServer是一个几乎无状态节点,可集群部署,节点之间无任何信息同步。而且在启动MQ的时候,第一个启动必须是NameServer。所以这篇主要来记录一下NameServer启动的源码分析。

脚本启动
无论在Windows或者是Linux,都需要通过命令行来启动NameServer,在Windows环境下,进入MQ\bin执行:

start mqnamesrv.cmd

打开mqnamesrv.cmd可以看到:

if not exist "%ROCKETMQ_HOME%\bin\runserver.cmd" echo Please set the ROCKETMQ_HOME variable in your environment! & EXIT /B 1

call "%ROCKETMQ_HOME%\bin\runserver.cmd" org.apache.rocketmq.namesrv.NamesrvStartup %*

IF %ERRORLEVEL% EQU 0 (
    ECHO "Namesrv starts OK"
)

 

1.先判断当前环境变量中,ROCKETMQ_HOME是否配置正确,如果找不到runserver.cmd就会输出提示先设定环境变量的设定,然后退出。
2.调用runserver.cmd脚本文件,传入两个参数,org.apache.rocketmq.namesrv.NamesrvStartup和%*。第一个参数是NameServer的启动类,第二个是执行当前脚本的参数,因为在执行start mqnamesrv.cmd没有传入参数,所以 %*就是空的。
3.IF %ERRORLEVEL% EQU 0 判断上一条命令执行的结果,如果等于0,表示NameServer启动成功。 

 

经过上面的分析,mqnamesrv.cmd会调用runserver.cmd,并且传入了NameServer的启动类org.apache.rocketmq.namesrv.NamesrvStartup作为参数。打开runserver.cmd查看:

 

if not exist "%JAVA_HOME%\bin\java.exe" echo Please set the JAVA_HOME variable in your environment, We need java(x64)! & EXIT /B 1
set "JAVA=%JAVA_HOME%\bin\java.exe"

setlocal

set BASE_DIR=%~dp0
set BASE_DIR=%BASE_DIR:~0,-1%
for %%d in (%BASE_DIR%) do set BASE_DIR=%%~dpd

set CLASSPATH=.;%BASE_DIR%conf;%CLASSPATH%

set "JAVA_OPT=%JAVA_OPT% -server -Xms2g -Xmx2g -Xmn1g -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=320m"
set "JAVA_OPT=%JAVA_OPT% -XX:+UseConcMarkSweepGC -XX:+UseCMSCompactAtFullCollection -XX:CMSInitiatingOccupancyFraction=70 -XX:+CMSParallelRemarkEnabled -XX:SoftRefLRUPolicyMSPerMB=0 -XX:+CMSClassUnloadingEnabled -XX:SurvivorRatio=8 -XX:-UseParNewGC"
set "JAVA_OPT=%JAVA_OPT% -verbose:gc -Xloggc:"%USERPROFILE%\rmq_srv_gc.log" -XX:+PrintGCDetails"
set "JAVA_OPT=%JAVA_OPT% -XX:-OmitStackTraceInFastThrow"
set "JAVA_OPT=%JAVA_OPT% -XX:-UseLargePages"
set "JAVA_OPT=%JAVA_OPT% -Djava.ext.dirs=%BASE_DIR%lib"
set "JAVA_OPT=%JAVA_OPT% -cp "%CLASSPATH%""

"%JAVA%" %JAVA_OPT% %*

 其实上面主要是做了一件事,就是执行了一条java运行命令。看最后一条:

"%JAVA%" %JAVA_OPT% %*

1.%JAVA%根据上面的代码可以知道其实就是java.exe。
2.%JAVA_OPT%就是一大串set的结果,根据字符串的拼接,将java执行的参数环境保存到了%JAVA_OPT%中,所以%JAVA_OPT%是执行参数。
3.%*就是传入进来的所有参数,根据前面分析得知,传入的是NameServer的启动类org.apache.rocketmq.namesrv.NamesrvStartup。

所以执行脚本最后就是执行了java -[OPT] org.apache.rocketmq.namesrv.NamesrvStartup。下面就来分析一下NamesrvStartup这个类的具体情况。

 

NamesrvStartup

从github下得RocketMQ的源码,下载完可以看到一下的目录结构,点开可以看到NamesrvStartup类:

RocketMQ 源码分析 nameser启动

关于NamesrvStartup类中的具体情况,下一篇继续分析。