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>>();
RocketMQ的NameSrv作为注册中心,类似于Zookeeper在Dubbo中的角色,负责存储Broker和Client的注册信息。在启动时,Broker和Client会连接NameSrv获取数据。NameSrv通过NamesrvController进行初始化,包括配置信息、通信层和线程池。在分布式环境下,NameSrv通过Processor实现主从和单机的不同处理策略,当本地获取信息失败时,会尝试从其他NameSrv获取。
524

被折叠的 条评论
为什么被折叠?



