Nacos源码分析之Raft协议(三)----数据的同步

本文深入分析了Nacos中基于Raft协议的数据同步过程,从ConsistencyService的put()方法入手,详细阐述了数据同步的步骤,包括:判断是否为leader、数据写入磁盘、集群过半提交以及节点间的交互处理。重点讲解了signalPublish()和onPublish()方法在数据同步中的关键作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

上两篇文章主要分析了leader选举以及发送心跳包的代码,如果还有疑问的小伙伴,可以点击传送门再去温习一下。

leader选举源码分析
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;
            //如果是新增数据
       
### Nacos 源码详解:架构设计与实现 #### 1. Nacos 的整体架构 Nacos 是一款由阿里巴巴开源的服务发现和配置管理平台,广泛应用于微服务架构中。它的功能主要包括服务注册、服务发现以及动态配置管理等功能[^3]。为了满足高可用性和高性能的需求,Nacos 使用了事件驱动架构作为其内部的核心机制之一。 #### 2. 事件驱动架构的作用 在 Nacos 中,事件驱动架构被用来处理各种异步操作,例如服务注册、注销和服务状态更新等场景。通过引入事件监听器和发布者订阅者的模式,可以有效解耦系统的各个模块,提升系统的可扩展性和灵活性[^1]。这种架构使得当某个特定事件发生时(如新的服务实例注册),系统能够快速响应并通知相关的组件执行相应的逻辑。 #### 3. Nacos 的 CP 架构解析 Nacos 支持两种主要的一致性模型——CP 和 AP。其中,在 CP 架构下,Nacos 更加注重数据一致性和准确性,即使牺牲部分性能或者可用性也在所不惜。具体来说,Nacos 在 CP 场景下的实现依赖于 Raft 协议来保证分布式环境中的强一致性。Raft 协议会选举出 leader 节点负责协调所有的写入请求,并确保副本之间同步最新的状态信息。 #### 4. 服务注册流程剖析 以下是基于版本 `1.4.1` 对 nacos 服务注册过程的一个简化描述: ```java public void registerService(String serviceName, String clusterName, Instance instance) { // Step 1: 验证输入参数合法性 validateInstance(instance); // Step 2: 获取对应的服务对象 Service service = getService(serviceName, clusterName); // Step 3: 将实例加入到该服务对应的集合中 addInstanceToService(service, instance); // Step 4: 发布事件通知其他模块此新实例已成功注册 publishEvent(new InstanceRegisteredEvent(serviceName, instance)); } ``` 上述代码片段展示了如何完成一次典型的服务注册动作。值得注意的是最后一步调用了方法 `publishEvent()` 来触发一个自定义类型的事件 (`InstanceRegisteredEvent`) ,从而允许任何对该类型感兴趣的观察者接收到消息并采取行动[^2]。 #### 5. 总结 通过对 Nacos 源码的研究可以看出,无论是从宏观层面还是微观细节上来看,这款工具都体现了极高的工程质量和设计理念。特别是采用了事件驱动的方式来进行跨模块间的通信协作,不仅提高了程序运行效率还增强了整个框架的鲁棒性。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值