1. 按服务名选择 nacos 节点,即一个服务的实例增删改,只由特定的 nacos 节点负责
com.alibaba.nacos.naming.web.DistroFilter#doFilter
com.alibaba.nacos.naming.core.DistroMapper#responsible(java.lang.String)
2. 当前 nacos 节点对服务实例增删改后,会重新把数据同步给其他节点
// com.alibaba.nacos.naming.consistency.ephemeral.distro.DistroConsistencyServiceImpl#put public void put(String key, Record value) throws NacosException { onPut(key, value); // 把同步数据的任务放入队列 taskDispatcher.addTask(key); }
// com.alibaba.nacos.naming.consistency.ephemeral.distro.DataSyncer#submit
用到了一些技巧,批量同步
3. 当前 nacos 节点定时计算自己所负责的服务实例的 md5 值,同步给其他 server,这是对 2 的一个后备
// com.alibaba.nacos.naming.consistency.ephemeral.distro.DataSyncer.TimedSync#run
这是一个全量数据 md5 值的同步
当目标节点收到全量数据 md5 值后,筛选出 toUpdateKeys 和 toRemoveKeys,然后从源节点同步数据
// DistroConsistencyServiceImpl#onReceiveChecksums try { byte[] result = NamingProxy.getData(toUpdateKeys, server); processData(result); } catch (Exception e) { Loggers.DISTRO.error("get data from " + server + " failed!", e); }