前言
在RocketMQ中,NameServer的目的是为了解耦Broker和Producer、Consumer。官方文档对NameServer有一个概括:NameServer是一个几乎无状态节点,可集群部署,节点之间无任何信息同步。而且在启动MQ的时候,第一个启动必须是NameServer。所以这篇主要来记录一下NameServer启动的源码分析。
脚本启动
无论在Windows或者是Linux,都需要通过命令行来启动NameServer,在Windows环境下,进入MQ\bin
执行:
1 | start mqnamesrv.cmd |
打开mqnamesrv.cmd
可以看到:
1 | if not exist "%ROCKETMQ_HOME%\bin\runserver.cmd" echo Please set the ROCKETMQ_HOME variable in your environment! & EXIT /B 1 |
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
查看:
1 | 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 |
其实上面主要是做了一件事,就是执行了一条java运行命令。看最后一条:
1 | "%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类中的具体情况,下一篇继续分析。