RocketMQ源码学习(一)-NameServer启动
关于NameServer前面已经介绍了很多。本章不做过多的叙述。直接围绕源码开展学习。
启动类-NamesrvStartup
位置:org.apache.rocketmq.namesrv.NamesrvStartup
关键部分代码:
// 创建核心处理器NamesrvController,类似web,用于接收各种挽网络请求 NamesrvController controller = createNamesrvController(args); // 启动NameServer start(controller); 复制代码
createNamesrvController配置NameServer核心参数
位置:org.apache.rocketmq.namesrv.NamesrvStartup#createNamesrvController
开始部分是对运行时参数的检测,部分代码如下:
// ToDo: k2: 运行时参数命令的检测 Options options = ServerUtil.buildCommandlineOptions(new Options()); commandLine = ServerUtil.parseCmdLine("mqnamesrv", args, buildCommandlineOptions(options), new PosixParser()); if (null == commandLine) { System.exit(-1); return null; } 复制代码
接着是核心参数的填充:
NamesrvConfig:包含NameServer自身运行的参数;
NettyServerConfig:包含Netty服务端的参数配置。
部分代码如下:
// ToDo: k1: NameServer的三个核心配置 // NamesrvConfig:包含NameServer自身运行的参数; // NettyServerConfig:包含Netty服务端的参数配置。 final NamesrvConfig namesrvConfig = new NamesrvConfig(); final NettyServerConfig nettyServerConfig = new NettyServerConfig(); nettyServerConfig.setListenPort(9876); // ToDo: k2->解析三个配置对象 if (commandLine.hasOption('c')) { ..... } if (commandLine.hasOption('p')) { ..... } 复制代码
Start启动
start方法中主要是controller的初始化,还有一个比较有意思的关闭MQ服务的钩子。
部分代码如下:
public static NamesrvController start(final NamesrvController controller) throws Exception { ... // controller初始化,主要初始化时几个定时器 boolean initResult = controller.initialize(); ... // 关闭MQ服务的钩子 Runtime.getRuntime().addShutdownHook(new ShutdownHookThread(log, new Callable<Void>() { @Override public Void call() throws Exception { controller.shutdown(); return null; } })); controller.start(); return controller; } 复制代码
initialize初始化
org.apache.rocketmq.namesrv.NamesrvController#initialize
部分代码如下:
// NameController初始化 public boolean initialize() { // 加载KV配置 this.kvConfigManager.load(); // 创建NettyServer网络处理对象 this.remotingServer = new NettyRemotingServer(this.nettyServerConfig, this.brokerHousekeepingService); // Netty服务工作线程池 this.remotingExecutor = Executors.newFixedThreadPool(nettyServerConfig.getServerWorkerThreads(), new ThreadFactoryImpl("RemotingExecutorThread_")); // 注册Proccessor,把remotingExecutor注入到remotingServer中 this.registerProcessor(); //启动定时任务一:NameServer 每隔1Os 扫描一次Broker , 移除处于不激活状态的Broker this.scheduledExecutorService.scheduleAtFixedRate(new Runnable() { @Override public void run() { NamesrvController.this.routeInfoManager.scanNotActiveBroker(); } }, 5, 10, TimeUnit.SECONDS); // 启动定时任务二:names 巳rver 每隔10 分钟打印一次KV 配置 this.scheduledExecutorService.scheduleAtFixedRate(new Runnable() { @Override public void run() { NamesrvController.this.kvConfigManager.printAllPeriodically(); } }, 1, 10, TimeUnit.MINUTES); ... } 复制代码
至此,NameServer就启动完成了。其整体结构如下:
作者:YuJian
链接:https://juejin.cn/post/7021042078893211661