zl程序教程

您现在的位置是:首页 >  Java

当前栏目

【RocketMQ 5.0】How Namesrv Startup?

2023-02-18 16:28:35 时间

在分享过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那篇继续讲。