前言
上两篇文章主要分析了leader选举以及发送心跳包的代码,如果还有疑问的小伙伴,可以点击传送门再去温习一下。
接下来进入正题,今天我们主要是分析上篇文章没有说完的数据同步相关的代码。
Nacos数据的同步
以服务实例的数据同步为例,数据同步的主要核心的地方在于ConsistencyService的put()方法,ConsistencyService是一个接口,而针对于raft算法的实现类有RaftConsistencyServiceImpl,我们找到RaftConsistencyServiceImpl的put方法
@Override
public void put(String key, Record value) throws NacosException {
try {
raftCore.signalPublish(key, value);
} catch (Exception e) {
Loggers.RAFT.error("Raft put failed.", e);
throw new NacosException(NacosException.SERVER_ERROR, "Raft put failed, key:" + key + ", value:" + value,
e);
}
}
这段代码主要的核心在于 raftCore.signalPublish(key, value);所以我们需要进入到raftCore的signalPublish()方法中
public void signalPublish(String key, Record value) throws Exception {
//不是leader,转发到leader
if (!isLeader()) {
ObjectNode params = JacksonUtils.createEmptyJsonNode();
params.put("key", key);
params.replace("value", JacksonUtils.transferToJsonNode(value));
Map<String, String> parameters = new HashMap<>(1);
parameters.put("key", key);
final RaftPeer leader = getLeader();
raftProxy.proxyPostLarge(leader.ip, API_PUB, params.toString(), parameters);
return;
}
try {
OPERATE_LOCK.lock();
final long start = System.currentTimeMillis();
final Datum datum = new Datum();
datum.key = key;
datum.value = value;
//如果是新增数据