rocketMQ nameSrv(RocketMQ的注册中心)
RocketMQ的注册中心nameSrv在rocketMQ中相当于zookeeper在dubbo中的作用,是用来存储broke和client的注册信息的。
broke和clicent在启动的时候都会去连接nameSrv获取信息,下面介绍一下nameSrv的运行机制
nameSrv启动时入口NamesrvStartup会实例化NamesrvController,然后调用其initialize()方法。
NamesrvController使nameSrv的核心类,他有如下操作:
- 初始化配置信息 KVConfigManager、NettyServerConfig
private String kvConfigPath = System.getProperty("user.home") + File.separator + "namesrv" + File.separator + "kvConfig.json";
private String configStorePath = System.getProperty("user.home") + File.separator + "namesrv" + File.separator + "namesrv.properties";
- 初始化通信层
-
初始化线程池
**
nameSrv分布式实现
**
在分布式主从和单机情况下使用不同的Processor
if (namesrvConfig.isClusterTest()) {
this.remotingServer.registerDefaultProcessor(new ClusterTestRequestProcessor(this, namesrvConfig.getProductEnvName()),
this.remotingExecutor);
} else {
this.remotingServer.registerDefaultProcessor(new DefaultRequestProcessor(this), this.remotingExecutor);
}
ClusterTestRequestProcessor继承DefaultRequestProcessor,仅重写了
getRouteInfoByTopic()方法。
在重写的方法中仅加入了一行代码
topicRouteData = adminExt.examineTopicRouteInfo(requestHeader.getTopic());
就是在本机上获取不到topic的信息会尝试去其他的namesvr上获取。
跟入代码会发现最终是调用了NettyRemotingClient.invokeSync(),
NettyRemotingClient中的namesrvAddrList 存储着所有的namesrv的地址
private final AtomicReference<List<String>> namesrvAddrList = new AtomicReference<List<String>>();
版权声明:本文为wangxiaofeng1124原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。