RocketMQ源码分析之NameSrv

RocketMQ源码分析我们主要从NameSrv、路由、生产者、消费者、消息存储等方面一点点分析,本章主要讲的是NameSrv的源码分析。

NameSrv的启动类:org.apache.rocketmq.namesrv.NamesrvStartup。

NamesrvStartup的main()方法中调用main0(args),mian0()中其实最主要是createNamesrvController()和start()方法。

NameSrv启动,其实整体分为三个步骤:创建NameSrvController、实例化NameSrvController、销毁NameSrvController,createNamesrvController()方法就是创建NameSrvController,start()方法包括了实例化NameSrvController和销毁NameSrvController。至于每一步具体干什么了,我们跟着代码一步步分析。

一、创建NameSrvController

该步骤在NamesrvStartup.createNamesrvController()方法中,主要是创建两个配置文件类,NamesrvConfig和NettyServerConfig。

NamesrvConfig是干嘛用的我就不多说了,大家应该都知道;

NettyServerConfig是计算器网络通信的基础,这里就不细说Netty,只说这个的功能,是保证NamaSrv跟Broker以及生产者、消费者通信的工具。可以进入NettyServerConfig类可以看到,Netty默认监听的是8888端口,但是RocketMQ给Netty改了这个接口,使用的是9876.

然后从配置文件中读取相应的参数,填充这两个配置文件,如果没有配置文件,则读取默认的配置。

至于这个额外的配置文件在哪用参数配置,在IDEA的Edit Configurations中配置

 Program arguments:配置配置文件,根据源码可知,若使用的是-c,则后面跟着配置的位置,如果是-p,则后面直接写参数以及值,格式:参数=参数值;

Environment variables:配置环境变量,如果是项目使用的环境变量,可以在这里直接配置该项目的环境变量,例如ROCKETMQ_HOME的位置,是key_value类型的。

继续跟着代码向下看,配置文件类经过参数填充以后,调用NamesrvController的构造方法创建NamesrvController,然后返回controller,创建NameSrvController的步骤结束。

二、实例化NameSrvController

createNamesrvController()返回了controller,然后就是start(controller)了。

start()方法中主要包括两部分,咱们先分析实例化NameSrvController的部分,后面再分析销毁NameSrvController

 NameSrvController的实例化方法initialize()中分为以下几步,kv管理器加载本地参数、创建一个netty服务端,创建netty服务的线程池,创建一个定时线程任务扫描失去心跳的broker。

创建netty服务端时因为broker要跟namesrv发送心跳,namesrv作为通信的服务端。

创建定时线程任务延迟5秒执行,每隔10秒扫描一次失去心跳的broker,将broker中最后一次发送心跳的时间加上默认的等待时间(默认两分钟),如果小于当前时间则从broker移除。

三、销毁NameSrvController

在start()方法的最后,在JVM中注册了一个钩子函数,当jvm退出的时候,释放资源。

发布了69 篇原创文章 · 获赞 35 · 访问量 8万+

猜你喜欢

转载自blog.csdn.net/xiaoye319/article/details/102836626