RocketMQ整体物理架构如下:
![](https://img.haomeiwen.com/i9188026/4f9048ab737d0aad.png)
NameServer是一个非常简单的Topic路由注册中心,其角色类似Dubbo中的zookeeper,支持Broker的动态注册与发现。主要包括两个功能:Broker管理,NameServer接受Broker集群的注册信息并且保存下来作为路由信息的基本数据。然后提供心跳检测机制,检查Broker是否还存活;路由信息管理,每个NameServer将保存关于Broker集群的整个路由信息和用于客户端查询的队列信息。然后Producer和Conumser通过NameServer就可以知道整个Broker集群的路由信息,从而进行消息的投递和消费。NameServer通常也是集群的方式部署,各实例间相互不进行信息通讯。Broker是向每一台NameServer注册自己的路由信息,所以每一个NameServer实例上面都保存一份完整的路由信息。当某个NameServer因某种原因下线了,Broker仍然可以向其它NameServer同步其路由信息,Producer和Consumer仍然可以动态感知Broker的路由的信息。
RocketMQ源码解析基于4.9.4版本,此版本为4.X系列最新版本
NameServer服务启动解析
NameServer服务的启动的入口类-NamesrvStartup,启动NamerServer的命令行脚本 bin/mqnamesrv 调用的就是这个类文件。
涉及到NameSrvController的创建以及启动
![](https://img.haomeiwen.com/i9188026/af9dd23a5e535abc.png)
createNamesrvController方法创建了两个对象一个是nettyServerConfig ,关于Netty的服务端配置,一个是nameSrvConfig,关于NameServer的配置
![](https://img.haomeiwen.com/i9188026/3302c3e8d0ae86c1.png)
若命令行参数中包含配置文件的路径,那么加载配置文件,初始化nettyServerConfig和nameSrvConfig
![](https://img.haomeiwen.com/i9188026/37a7e82803b9a9a7.png)
命令行参数指定是否需要打印加载的配置信息,打印加载的信息会正常的退出程序
![](https://img.haomeiwen.com/i9188026/718cc4770cf760ca.png)
将命令行其余指定的配置参数加载到nameSrvConfig,这个优先级高于配置文件,可能存在覆盖的情况.
将初始化完成的nameSrvConfig 和 nettyServerConfig作为构造参数,创建NamesrvController对象并返回
![](https://img.haomeiwen.com/i9188026/b00b68daeacbdbd0.png)
至此,createNamesrvController方法执行完毕,这个方法主要是加载命令行配置,构建nameSrvConfig和nettyServerConfig,然后以此作为构建参数创建NamesrvController对象
NamesrvController类主要属性介绍
![](https://img.haomeiwen.com/i9188026/e997f58951d5dbb3.png)
接下来,调用start方法,初始化并且启动NameServer服务
![](https://img.haomeiwen.com/i9188026/9a5bc5eb1d779b7a.png)
NamesrvController的initialize方法主要是加载并初始化NameServer的所需要的资源,包括:
kvConfig配置、NettyServer服务器、请求处理线程池、请求处理器、定时调度服务、安全通信模块
![](https://img.haomeiwen.com/i9188026/35a075265f716cdf.png)
NamesrvController的start方法启动NameServer服务
启动nettyServer服务,开始监听端口,接受来自客户端的请求
启动fileWatchServer线程,启动ssl安全通信文件的监听服务
![](https://img.haomeiwen.com/i9188026/f6f4f4f260dddc5a.png)
至此,NameServer模块的服务已经启动完成了,总体来看,启动主要分为3个步骤:
1.加载配置文件以及命令行配置
2.初始化NameServer需要的各种资源配置
3.启动NameServer,开始接收客户端的请求
网友评论