模块入口代码功能
NamesrvStartup是模块的启动入口,NamesrvController是用来协调各个调用模块功能的代码。
1、解析命令行参数
main0函数主要完成两个功能,第一个功能是解析命令行参数;
-c命令行参数是指定配置文件的位置
-p命令行参数是用来打印所有配置项的值。
2、初始化NameServer的Controller
main0函数的另一个功能是初始化Controller。
根据解析出的配置参数,调用controller.initialize()来初始化,然后调用controller.start()让NameServer开发服务。
还有一个逻辑是注册ShutdonwHookThread,当程序退出的时候回调用controller.shutdonw来做退出前的清理工作。
NameServer的总控逻辑
NameServer的总控逻辑在NamesrvController中,是集群的协调者,它只是简单地接受其他角色报上来的状态,然后根据请求返回响应的状态。
1、线程池初始化
启动了一个默认8个线程的线程池,还有两个定时执行的线程,一个用来扫描失效的Broker,另一个用来打印配置信息。
2、启动通信服务,关联初始化的线程池
启动负责通信的服务remotingServer,监听一些端口,收到Broker、Client等发过来的请求后,根据请求的命令,调用不同的Processor来处理。这些不同的处理逻辑被放到上面初始化的线程池中执行。
核心业务逻辑处理
NameServer的核心业务逻辑,在DefaultRequestProcessor中。网络通信服务模块收到请求后,就调用这个Processor来代理。
根据RequestCode调用不同的函数来处理,如:REGISTER_BROKER是集群中新加入一个Broker;GET_ROUTEINFO_BY_TOPIC是请求获取一个Topic的路由信息;WIPE_WRITE_PERM_OF_BROKER是删除一个Broker的写权限。
集群状态存储
NameServer作为集群的协调者,需要保存和维护集群的各种元数据,是通过RouteInfoManager类来实现的。
每个结构存储着一类集群信息,具体请看我之前发布的文章:《RocketMQ篇3:分布式消息队列的协调者》中的集群状态的存储结构
因为在NameServer的场景中,读取操作多,更改操作少。RouteManager中使用的是可重入的读写锁(ReentrantReadWriteLock)
领取专属 10元无门槛券
私享最新 技术干货