D:\newWorkSpace\nacos-2.0.0-bugfix\naming\src\main\java\com\alibaba\nacos\naming\consistency\ephemeral\distro\DistroConsistencyServiceImpl.java
/**
*一種稱為Distro的一致性協議算法
*<p>使用distro算法將數據划分為多個塊。每個Nacos服務器節點負責
*一塊數據。每個數據塊都由其負責的服務器生成、刪除和同步。所以每
*Nacos服務器只處理總服務數據的一個子集的寫入。
*同時每個Nacos服務器都接收到其他Nacos服務器的數據同步,所以每個Nacos服務器最終都會有一套完整的數據。
*/
@Override
public void put(String key, Record value) throws NacosException {
onPut(key, value);
// If upgrade to 2.0.X, do not sync for v1.
if (ApplicationUtils.getBean(UpgradeJudgement.class).isUseGrpcFeatures()) {
return;
}
distroProtocol.sync(new DistroKey(key, KeyBuilder.INSTANCE_LIST_KEY_PREFIX), DataOperation.CHANGE,
globalConfig.getTaskDispatchPeriod() / 2);
}
D:\newWorkSpace\nacos-2.0.0-bugfix\core\src\main\java\com\alibaba\nacos\core\distributed\distro\DistroProtocol.java
/**
* Start to sync data to all remote server.
* 開始將數據同步到所有遠程服務器
* @param distroKey distro key of sync data
* @param action the action of data operation
* @param delay delay time for sync
*/
public void sync(DistroKey distroKey, DataOperation action, long delay) {
for (Member each : memberManager.allMembersWithoutSelf()) {
syncToTarget(distroKey, action, each.getAddress(), delay);
}
}
服務注冊
D:\newWorkSpace\nacos-2.0.0-bugfix\naming\src\main\java\com\alibaba\nacos\naming\core\v2\upgrade\doublewrite\execute\DoubleWriteInstanceChangeToV2Task.java
instanceOperator.registerInstance(namespace, serviceName, instance);
D:\newWorkSpace\nacos-2.0.0-bugfix\naming\src\main\java\com\alibaba\nacos\naming\core\InstanceOperatorClientImpl.java
/**
* This method creates {@code IpPortBasedClient} if it don't exist.
*/
@Override
public void registerInstance(String namespaceId, String serviceName, Instance instance) {
boolean ephemeral = instance.isEphemeral();//Ephemeral 短暫的,臨時的
String clientId = IpPortBasedClient.getClientId(instance.toInetAddr(), ephemeral);
createIpPortClientIfAbsent(clientId, ephemeral);
Service service = getService(namespaceId, serviceName, ephemeral);
clientOperationService.registerInstance(service, instance, clientId);
}
D:\newWorkSpace\nacos-2.0.0-bugfix\naming\src\main\java\com\alibaba\nacos\naming\core\v2\service\impl\EphemeralClientOperationServiceImpl.java
@Override
public void registerInstance(Service service, Instance instance, String clientId) {
Service singleton = ServiceManager.getInstance().getSingleton(service);
Client client = clientManager.getClient(clientId);
InstancePublishInfo instanceInfo = getPublishInfo(instance);
client.addServiceInstance(singleton, instanceInfo);
client.setLastUpdatedTime();
NotifyCenter.publishEvent(new ClientOperationEvent.ClientRegisterServiceEvent(singleton, clientId));
NotifyCenter
.publishEvent(new MetadataEvent.InstanceMetadataEvent(singleton, instanceInfo.getMetadataId(), false));
}
D:\newWorkSpace\nacos-2.0.0-bugfix\naming\src\main\java\com\alibaba\nacos\naming\core\ServiceManager.java