这是本人学习的总结,主要学习资料如下
- 马士兵教育
- rocketMq官方文档
目录
- 1、Overview
- 2、NameServer启动流程
- 2.1、总结
- 2.2、NamesrvController
- 2.2.1、主要职责
- 2.2.2、关键的成员变量
- 2.2.3、核心代码
- 2.2.4、值得注意的点
1、Overview
NameServer
主要就做三件事
NameServer
启动:启动监听,等待Broker,Prod ucer,Consumer连接注册。- 路由注册:Borker启动后向所有
NameServer
发送路由和心跳信息。 - 路由剔除:移除心跳超时的Broker相关路由信息。
源码学习也是针对核心功能看RocketMQ
如何实现这三个功能。
这是RocketMQ
的整体流程图。
图中的NRC
是Netty Remoting Client
的缩写。可以看出RocketMQ
是基于Netty
实现网络通信。
2、NameServer启动流程
2.1、总结
入口是NamesrvStartup
的psvm方法。
前面做完必要的参数处理之后,会创建一个NamesrvController
的实例,由他负责初始化的工作,比如加载key-value配置,定时任务等。
所以源码分析的重点会放在NamesrvController
的构建以及它的initialize()
方法。
2.2、NamesrvController
2.2.1、主要职责
负责加载KV配置,构建NRS通讯实例,构建定时任务。
这意味着它的成员变量会有一些集合,比如HashMap,用来存放各种各样的key-value配置。
同时会有NettyRemotingServer
的实例代表着构建好的通讯实例。
还会有一些线程池用于定时任务。
2.2.2、关键的成员变量
NamesrvController
中的重要成员变量对应着它的职责。
KVConfigManager
对应着加载key-value
配置。
RemotingServer
负责网络请求。
RouteInfoManager
则是负责路由管理。路由管理是指管理broker
注册的路由信息。与路由相关的动作与信息都在这个变量中。它对于读写锁的运用也值得学习。
2.2.3、核心代码
NamesrcController
相关代码需要从这两条线看。
main() -> main0() -> createNamesrcController()
这个主要是实例化NamesrcController
。当然在实例化之前会做一些检查,检查的代码较长,但最核心的就只有一句new NamesrvController(namesrvConfig, nettyServerConfig);
。主要是将一些来自外部的配置信息注入到NamesrcController
的成员变量中,为接下来的初始化做准备。
main() -> main0() -> start() -> controller.initialize()
initialize()
方法是最关键的,因为涉及到线程池的设置,NameServer
的一些关键行为比如心跳检查,不活跃剔除的具体信息就可以在这里找到。看下图我们可以知道,移除不活跃的broker的定时认识是每10s一次,写死的值不可更改。
2.2.4、值得注意的点
- 在
createNamesrvController()
方法中,需要构建一个NettyServerConfig
实例用来配置网络通信,其中包括NameServer
监听的端口号。在源码中端口号被写死成9876,完全无法通过任何配置修改,nettyServerConfig.setListenPort(9876);
。所以实际使用中想要修改NameServer
监听的端口号就只能下载源码来改装。 - 在
createNamesrvController()
方法中,有一段分支会结束当前进程并答应所有配置信息,可以用来debug。在if (commandLine.hasOption('p')){}
中,意味着我们只要在启动参数中配置一个-p
就可以打印所有配置项。