在分享过RocketMQ Namesrv 5.0和4.9.x的差异后,本期分享Namesrv5.0是如何启动的。
一、代码架构和新增逻辑
在5.0.0中Namesrv和4.9.X的代码有一些变化, 主要包含
1. 添加Controller模块嵌入启动逻辑。
2. 添加ZoneRouteRPCHook。支持云特性:多zone部署和管理。
3.不同请求处理分类放在对应的Processor中。 a. ClientRequestProcessor:处理客户端请求, 目前包含获取路由信息
b. ClientRequestProcessor:处理测试请求
c. DefaultRequestProcessor:处理其余Namesrv的请求,
比如KV配置管理、Broker注册、Broker心跳、更新/查询Namesrv配置
等等。
二、 启动过程
在RocketMQ5.0.0中,Namesrv启动入口仍然是:
org.apache.rocketmq.namesrv.NamesrvStartup#main,
Namesrv启动时涉及到的启动参数如下图:
Namesrv启动需要的配置解释如下:
配置变量 | 含义 |
---|---|
properties | 临时存储全部的配置k-v,包含-c指定的启动文件和-p启动的变量 |
namesrvConfig | 从properties中解析出来的全部namesrv配置 |
nettyServerConfig | 从properties中解析出来的全部Controller和Namesrv RPC服务端启动配置。特别注意Controller的配置是clone出来的,和Namesrv使用的不是同一个对象。 |
nettyClientConfig | 从properties中解析出来的全部Controller和Namesrv RPC客户端启动配置 |
controllerConfig | 从properties中解析出来的全部Controller需要的启动配置 |
在main(String[] args)方法中,包含main0(args)和controllerManagerMain()两个方法, main0逻辑和4.9.X基本差不多,主要新增了controllerManagerMain()。
controllerManagerMain()方法主要是判断当前Namesrv是否配置允许内嵌启动一个Controller实例。
Namesrv配置中有一个特殊的配置项:enableControllerInNamesrv,默认false。若设置enableControllerInNamesrv=true,则Namesrv进程会启动一个Namesrv服务和Controller服务。
我们可以看到createAndStartControllerManager()方法调用了createControllerManager()和start()两个方法, 这2个方法都是直接调用Controller模块中的方法, 具体逻辑我们放到Controller那篇继续讲。