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); }