namesrv源码结构如下图
大家都知道rocketMq的nameSrv是做路由服务的,那他到底会维护那些路由信息呢?我们把这个问题搞清楚了,可能就能在整体上更好的把握他。路由信息都是保存在RouteInfoManager中的,如下
private final HashMap<String/* topic */, List<QueueData>> topicQueueTable;
private final HashMap<String/* brokerName */, BrokerData> brokerAddrTable;
private final HashMap<String/* clusterName */, Set<String/* brokerName */>> clusterAddrTable;
private final HashMap<String/* brokerAddr */, BrokerLiveInfo> brokerLiveTable;
private final HashMap<String/* brokerAddr */, List<String>/* Filter Server */> filterServerTable;
我们一个一个看,这些都是用来存储什么信息的:
1、topicQueueTable,其实根据官方原代码的注释,很多东西我们已经能猜出来了,不过验证一下肯定更准确了,看下QueueData的定义
private String brokerName; // broker的名称
private int readQueueNums; // 读队列数量
private int writeQueueNums; // 写队列数量
private int perm; // 读写权限
private int topicSynFlag; // 同步复制还是异步复制标记
所以,现在我们可以知道topicQueueTable维护的就是形如摸个topic在哪些broker上,以及他们的读队列数量、写队列数量、读写权限、同步复制还是异步复制标记。
2、brokerAddrTable,此hashMap的key存放的是brokerName,主要看下BrokerData
private String cluster; //集群名称
private String brokerName; //broker名
private HashMap<Long/* brokerId */, String/* broker address */> brokerAddrs; //brokerId对应的地址
所以,我们现在可以知道brokerAddrTable维护的就是形如某个brokerName所属的集群名称,以及他的主从broker的地址。
3、clusterAddrTable,此hashMap的key是保存的是集群名称,value存的是他所包含的broker名的set集合
4、brokerLiveTable,此hashMap的key存的是broker的地址,主要看下BrokerLiveInfo
private long lastUpdateTimestamp; //最后一次心跳或更新的时间戳
private DataVersion dataVersion; //()
private Channel channel; //通信通道
private String haServerAddr; //高可用地址,主从复制的端口
所以,我们可以知道brokerLiveTable是维护每个存活的broker的以上存活信息的
5、filterServerTable维护的就是每个broker的文件过滤集合。
下面看看源码结构上各个部分是干嘛的:
KVConfigManager:
作用即加载namesrvController指定的kvConfig配置文件(常为xxx/kvConfig.json)到内存读取或增加,删除kvConfig记录将内存记录的配置,持久化到文件打印所有kvConfig配置。
HashMap<String/* topic */, List<QueueData>> topicQueueTable;
HashMap<String/* brokerName */, BrokerData> brokerAddrTable;
HashMap<String/* clusterName */, Set<String/* brokerName */>> clusterAddrTable;
HashMap<String/* brokerAddr */, BrokerLiveInfo> brokerLiveTable;
HashMap<String/* brokerAddr */, List<String>/* Filter Server */> filterServerTable;
public byte[] getAllClusterInfo() {
ClusterInfo clusterInfoSerializeWrapper = new ClusterInfo();
clusterInfoSerializeWrapper.setBrokerAddrTable(this.brokerAddrTable);
clusterInfoSerializeWrapper.setClusterAddrTable(this.clusterAddrTable);
return clusterInfoSerializeWrapper.encode();
}
public void deleteTopic(final String topic) {
try {
try {
this.lock.writeLock().lockInterruptibly();
this.topicQueueTable.remove(topic);
} finally {
this.lock.writeLock().unlock();
}
} catch (Exception e) {
log.error("deleteTopic Exception", e);
}
}
final NamesrvConfig namesrvConfig = new NamesrvConfig();
final NettyServerConfig nettyServerConfig = new NettyServerConfig();nettyServerConfig.setListenPort(9876);
final NamesrvController controller = new NamesrvController(namesrvConfig, nettyServerConfig);
boolean initResult = controller.initialize();
controller.start();
namesrvStartup.main(){
namesrvStartup.main0(){
NamesrvController .initialize(){
kvConfigManager.load();
RemotingServer.registerDefaultProcess();
跑两个线程;
}
NamesrvController .start();
}
后续继续补充完善