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类:
关于NamesrvStartup类中的具体情况,下一篇继续分析。