Nacos 服务发现与配置中心原理:AP 架构与 Distro 协议

Nacos 服务发现与配置中心原理:AP 架构与 Distro 协议

摘要

Nacos 作为阿里巴巴开源的云原生服务发现与配置中心,同时支持 AP 和 CP 两种一致性架构。本文深入剖析 Nacos 2.2.0 的 AP 架构设计及 Distro 协议原理,通过源码分析和实战示例,揭示其如何通过"最终一致性"和"自举机制"实现高可用的服务注册中心,在性能与一致性之间找到最佳平衡点。


一、服务注册中心的挑战与 Nacos 架构

1.1 CAP 理论与注册中心选型

在分布式系统中,Consistency(一致性)、Availability(可用性)、Partition Tolerance(分区容错性)三者只能同时满足两个。

复制代码
graph TB
    subgraph "CAP 三选二"
        A[AP: 可用性 + 分区容错<br/>最终一致性]
        B[CP: 一致性 + 分区容错<br/>强一致性]
        C[CA: 一致性 + 可用性<br/>无分区容错(不现实)]
    end
    
    subgraph "注册中心选型"
        A1[Nacos AP 模式]
        A2[Eureka]
        A3[Consul (默认)]
        
        B1[Nacos CP 模式]
        B2[ZooKeeper]
        B3[etcd]
    end
    
    A --> A1
    A --> A2
    A --> A3
    
    B --> B1
    B --> B2
    B --> B3

1.2 Nacos 整体架构

复制代码
graph TB
    subgraph "Nacos 集群"
        N1[Nacos Server 1<br/>AP + CP]
        N2[Nacos Server 2<br/>AP + CP]
        N3[Nacos Server 3<br/>AP + CP]
    end
    
    subgraph "Nacos 存储层"
        APStore[(AP 内存存储<br/>Distro 协议)]
        CPStore[(CP 持久化存储<br/>Raft 协议)]
    end
    
    subgraph "客户端"
        C1[服务提供者 Provider]
        C2[服务消费者 Consumer]
    end
    
    C1 -->|注册服务| N1
    C2 -->|订阅服务| N2
    C1 -->|发送心跳| N3
    N1 <-->|Distro 同步| N2
    N2 <-->|Distro 同步| N3
    N3 <-->|Distro 同步| N1
    
    N1 --> APStore
    N1 --> CPStore
    N2 --> APStore
    N2 --> CPStore

1.3 AP vs CP 架构对比

特性 AP 架构 (Distro) CP 架构 (Raft)
一致性 最终一致 强一致
可用性 高(部分节点故障不影响) 中(Leader 故障需选举)
性能 高(内存存储,异步同步) 中(磁盘写入,同步复制)
适用场景 服务注册与发现(非核心配置) 配置管理、元数据
数据存储 内存 磁盘 + 内存

二、Distro 协议核心原理

2.1 Distro 设计理念

Distro 是 Nacos 自研的最终一致性协议,专为 AP 场景设计:

  1. 自举机制:每个节点平等,无 Leader 角色

  2. 增量同步:仅同步变更数据,减少网络开销

  3. 故障自愈:节点故障后自动从其他节点恢复数据

  4. 心跳续约:客户端定期续约,服务端定期清理过期实例

    sequenceDiagram
    participant P as Provider
    participant N1 as Nacos Node 1
    participant N2 as Nacos Node 2
    participant N3 as Nacos Node 3

    复制代码
     P->>N1: 注册服务 (instance)
     N1->>N1: 写入本地内存
     N1->>N2: 同步注册信息 (异步)
     N1->>N3: 同步注册信息 (异步)
     
     Note over N1,N3: 客户端心跳续约
     P->>N2: 心跳 (beat)
     N2->>N2: 更新实例最后心跳时间
     
     Note over N1,N3: 定时健康检查
     N1->>N1: 扫描过期实例(20秒)
     N1->>N2: 同步删除操作
     N2->>N3: 同步删除操作
     
     Note over N1,N3: 故障恢复场景
     N3->>N1: 请求数据全量(N3 重启)
     N1-->>N3: 返回所有实例数据

2.2 Distro 数据同步流程

复制代码
graph TB
    A[客户端请求] --> B{写入类型?}
    B -->|注册| C[写入本地内存]
    B -->|注销| D[从本地删除]
    B -->|心跳| E[更新心跳时间]
    
    C --> F[构建 Distro 协议包<br/>timestamp + data]
    D --> F
    E --> F
    
    F --> G[异步广播到其他节点]
    G --> H{接收节点校验}
    H -->|timestamp 更新| I[应用更新]
    H -->|timestamp 旧| J[丢弃旧数据]

三、源码分析:AP 架构实现

3.1 服务注册入口

源码位置nacos-src/naming/src/main/java/com/alibaba/nacos/naming/

java 复制代码
#// naming/src/main/java/com/alibaba/nacos/naming/core/InstanceController.java

@RestController
@RequestMapping("/v1/ns")
public class InstanceController {
    
    @CanDistro
    @PostMapping("/instance")
    public String register(HttpServletRequest request) throws Exception {
        // 1. 解析请求参数
        String serviceName = WebUtils.required(request, "serviceName");
        String ip = WebUtils.required(request, "ip");
        int port = Integer.parseInt(WebUtils.required(request, "port"));
        
        // 2. 构建 Instance 对象
        Instance instance = new Instance();
        instance.setIp(ip);
        instance.setPort(port);
        instance.setWeight(Double.parseDouble(WebUtils.optional(request, "weight", "1.0")));
        instance.setHealthy(true);
        instance.setEphemeral(true); // 临时实例
        
        // 3. 注册服务
        getInstanceOperator().registerInstance(serviceName, "DEFAULT_GROUP", instance);
        
        return "ok";
    }
}

// naming/src/main/java/com/alibaba/nacos/naming/core/InstanceOperatorServiceImpl.java

public class InstanceOperatorServiceImpl implements InstanceOperator {
    
    @Override
    public void registerInstance(String serviceName, String groupName, Instance instance) {
        // 1. 构建完整服务名
        String fullServiceName = groupName + Constants.SERVICE_INFO_SPLITER + serviceName;
        
        // 2. 写入 AP 存储(Distro 协议)
        DistroConsistencyServiceImpl distroConsistencyService = 
            (DistroConsistencyServiceImpl) consistencyService;
        
        // 3. 注册实例(写入内存)
        distroConsistencyService.put(fullServiceName, instance);
        
        // 4. 广播到其他节点
        distroProtocol.sync(new DistroKey(fullServiceName, instance.getIp() + ":" + instance.getPort()), 
                           DataOperation.CHANGE);
    }
}// naming/src/main/java/com/alibaba/nacos/naming/core/InstanceController.java`
`#// naming/src/main/java/com/alibaba/nacos/naming/core/InstanceController.java

@RestController
@RequestMapping("/v1/ns")
public class InstanceController {
    
    @CanDistro
    @PostMapping("/instance")
    public String register(HttpServletRequest request) throws Exception {
        // 1. 解析请求参数
        String serviceName = WebUtils.required(request, "serviceName");
        String ip = WebUtils.required(request, "ip");
        int port = Integer.parseInt(WebUtils.required(request, "port"));
        
        // 2. 构建 Instance 对象
        Instance instance = new Instance();
        instance.setIp(ip);
        instance.setPort(port);
        instance.setWeight(Double.parseDouble(WebUtils.optional(request, "weight", "1.0")));
        instance.setHealthy(true);
        instance.setEphemeral(true); // 临时实例
        
        // 3. 注册服务
        getInstanceOperator().registerInstance(serviceName, "DEFAULT_GROUP", instance);
        
        return "ok";
    }
}

// naming/src/main/java/com/alibaba/nacos/naming/core/InstanceOperatorServiceImpl.java

public class InstanceOperatorServiceImpl implements InstanceOperator {
    
    @Override
    public void registerInstance(String serviceName, String groupName, Instance instance) {
        // 1. 构建完整服务名
        String fullServiceName = groupName + Constants.SERVICE_INFO_SPLITER + serviceName;
        
        // 2. 写入 AP 存储(Distro 协议)
        DistroConsistencyServiceImpl distroConsistencyService = 
            (DistroConsistencyServiceImpl) consistencyService;
        
        // 3. 注册实例(写入内存)
        distroConsistencyService.put(fullServiceName, instance);
        
        // 4. 广播到其他节点
        distroProtocol.sync(new DistroKey(fullServiceName, instance.getIp() + ":" + instance.getPort()), 
                           DataOperation.CHANGE);
    }
}`
`#// naming/src/main/java/com/alibaba/nacos/naming/core/InstanceController.java

@RestController
@RequestMapping("/v1/ns")
public class InstanceController {
    
    @CanDistro
    @PostMapping("/instance")
    public String register(HttpServletRequest request) throws Exception {
        // 1. 解析请求参数
        String serviceName = WebUtils.required(request, "serviceName");
        String ip = WebUtils.required(request, "ip");
        int port = Integer.parseInt(WebUtils.required(request, "port"));
        
        // 2. 构建 Instance 对象
        Instance instance = new Instance();
        instance.setIp(ip);
        instance.setPort(port);
        instance.setWeight(Double.parseDouble(WebUtils.optional(request, "weight", "1.0")));
        instance.setHealthy(true);
        instance.setEphemeral(true); // 临时实例
        
        // 3. 注册服务
        getInstanceOperator().registerInstance(serviceName, "DEFAULT_GROUP", instance);
        
        return "ok";
    }
}

// naming/src/main/java/com/alibaba/nacos/naming/core/InstanceOperatorServiceImpl.java

public class InstanceOperatorServiceImpl implements InstanceOperator {
    
    @Override
    public void registerInstance(String serviceName, String groupName, Instance instance) {
        // 1. 构建完整服务名
        String fullServiceName = groupName + Constants.SERVICE_INFO_SPLITER + serviceName;
        
        // 2. 写入 AP 存储(Distro 协议)
        DistroConsistencyServiceImpl distroConsistencyService = 
            (DistroConsistencyServiceImpl) consistencyService;
        
        // 3. 注册实例(写入内存)
        distroConsistencyService.put(fullServiceName, instance);
        
        // 4. 广播到其他节点
        distroProtocol.sync(new DistroKey(fullServiceName, instance.getIp() + ":" + instance.getPort()), 
                           DataOperation.CHANGE);
    }
}@RestController`
`#// naming/src/main/java/com/alibaba/nacos/naming/core/InstanceController.java

@RestController
@RequestMapping("/v1/ns")
public class InstanceController {
    
    @CanDistro
    @PostMapping("/instance")
    public String register(HttpServletRequest request) throws Exception {
        // 1. 解析请求参数
        String serviceName = WebUtils.required(request, "serviceName");
        String ip = WebUtils.required(request, "ip");
        int port = Integer.parseInt(WebUtils.required(request, "port"));
        
        // 2. 构建 Instance 对象
        Instance instance = new Instance();
        instance.setIp(ip);
        instance.setPort(port);
        instance.setWeight(Double.parseDouble(WebUtils.optional(request, "weight", "1.0")));
        instance.setHealthy(true);
        instance.setEphemeral(true); // 临时实例
        
        // 3. 注册服务
        getInstanceOperator().registerInstance(serviceName, "DEFAULT_GROUP", instance);
        
        return "ok";
    }
}

// naming/src/main/java/com/alibaba/nacos/naming/core/InstanceOperatorServiceImpl.java

public class InstanceOperatorServiceImpl implements InstanceOperator {
    
    @Override
    public void registerInstance(String serviceName, String groupName, Instance instance) {
        // 1. 构建完整服务名
        String fullServiceName = groupName + Constants.SERVICE_INFO_SPLITER + serviceName;
        
        // 2. 写入 AP 存储(Distro 协议)
        DistroConsistencyServiceImpl distroConsistencyService = 
            (DistroConsistencyServiceImpl) consistencyService;
        
        // 3. 注册实例(写入内存)
        distroConsistencyService.put(fullServiceName, instance);
        
        // 4. 广播到其他节点
        distroProtocol.sync(new DistroKey(fullServiceName, instance.getIp() + ":" + instance.getPort()), 
                           DataOperation.CHANGE);
    }
}@RequestMapping("/v1/ns")`
`#// naming/src/main/java/com/alibaba/nacos/naming/core/InstanceController.java

@RestController
@RequestMapping("/v1/ns")
public class InstanceController {
    
    @CanDistro
    @PostMapping("/instance")
    public String register(HttpServletRequest request) throws Exception {
        // 1. 解析请求参数
        String serviceName = WebUtils.required(request, "serviceName");
        String ip = WebUtils.required(request, "ip");
        int port = Integer.parseInt(WebUtils.required(request, "port"));
        
        // 2. 构建 Instance 对象
        Instance instance = new Instance();
        instance.setIp(ip);
        instance.setPort(port);
        instance.setWeight(Double.parseDouble(WebUtils.optional(request, "weight", "1.0")));
        instance.setHealthy(true);
        instance.setEphemeral(true); // 临时实例
        
        // 3. 注册服务
        getInstanceOperator().registerInstance(serviceName, "DEFAULT_GROUP", instance);
        
        return "ok";
    }
}

// naming/src/main/java/com/alibaba/nacos/naming/core/InstanceOperatorServiceImpl.java

public class InstanceOperatorServiceImpl implements InstanceOperator {
    
    @Override
    public void registerInstance(String serviceName, String groupName, Instance instance) {
        // 1. 构建完整服务名
        String fullServiceName = groupName + Constants.SERVICE_INFO_SPLITER + serviceName;
        
        // 2. 写入 AP 存储(Distro 协议)
        DistroConsistencyServiceImpl distroConsistencyService = 
            (DistroConsistencyServiceImpl) consistencyService;
        
        // 3. 注册实例(写入内存)
        distroConsistencyService.put(fullServiceName, instance);
        
        // 4. 广播到其他节点
        distroProtocol.sync(new DistroKey(fullServiceName, instance.getIp() + ":" + instance.getPort()), 
                           DataOperation.CHANGE);
    }
}public class InstanceController {`
`#// naming/src/main/java/com/alibaba/nacos/naming/core/InstanceController.java

@RestController
@RequestMapping("/v1/ns")
public class InstanceController {
    
    @CanDistro
    @PostMapping("/instance")
    public String register(HttpServletRequest request) throws Exception {
        // 1. 解析请求参数
        String serviceName = WebUtils.required(request, "serviceName");
        String ip = WebUtils.required(request, "ip");
        int port = Integer.parseInt(WebUtils.required(request, "port"));
        
        // 2. 构建 Instance 对象
        Instance instance = new Instance();
        instance.setIp(ip);
        instance.setPort(port);
        instance.setWeight(Double.parseDouble(WebUtils.optional(request, "weight", "1.0")));
        instance.setHealthy(true);
        instance.setEphemeral(true); // 临时实例
        
        // 3. 注册服务
        getInstanceOperator().registerInstance(serviceName, "DEFAULT_GROUP", instance);
        
        return "ok";
    }
}

// naming/src/main/java/com/alibaba/nacos/naming/core/InstanceOperatorServiceImpl.java

public class InstanceOperatorServiceImpl implements InstanceOperator {
    
    @Override
    public void registerInstance(String serviceName, String groupName, Instance instance) {
        // 1. 构建完整服务名
        String fullServiceName = groupName + Constants.SERVICE_INFO_SPLITER + serviceName;
        
        // 2. 写入 AP 存储(Distro 协议)
        DistroConsistencyServiceImpl distroConsistencyService = 
            (DistroConsistencyServiceImpl) consistencyService;
        
        // 3. 注册实例(写入内存)
        distroConsistencyService.put(fullServiceName, instance);
        
        // 4. 广播到其他节点
        distroProtocol.sync(new DistroKey(fullServiceName, instance.getIp() + ":" + instance.getPort()), 
                           DataOperation.CHANGE);
    }
}    `
`#// naming/src/main/java/com/alibaba/nacos/naming/core/InstanceController.java

@RestController
@RequestMapping("/v1/ns")
public class InstanceController {
    
    @CanDistro
    @PostMapping("/instance")
    public String register(HttpServletRequest request) throws Exception {
        // 1. 解析请求参数
        String serviceName = WebUtils.required(request, "serviceName");
        String ip = WebUtils.required(request, "ip");
        int port = Integer.parseInt(WebUtils.required(request, "port"));
        
        // 2. 构建 Instance 对象
        Instance instance = new Instance();
        instance.setIp(ip);
        instance.setPort(port);
        instance.setWeight(Double.parseDouble(WebUtils.optional(request, "weight", "1.0")));
        instance.setHealthy(true);
        instance.setEphemeral(true); // 临时实例
        
        // 3. 注册服务
        getInstanceOperator().registerInstance(serviceName, "DEFAULT_GROUP", instance);
        
        return "ok";
    }
}

// naming/src/main/java/com/alibaba/nacos/naming/core/InstanceOperatorServiceImpl.java

public class InstanceOperatorServiceImpl implements InstanceOperator {
    
    @Override
    public void registerInstance(String serviceName, String groupName, Instance instance) {
        // 1. 构建完整服务名
        String fullServiceName = groupName + Constants.SERVICE_INFO_SPLITER + serviceName;
        
        // 2. 写入 AP 存储(Distro 协议)
        DistroConsistencyServiceImpl distroConsistencyService = 
            (DistroConsistencyServiceImpl) consistencyService;
        
        // 3. 注册实例(写入内存)
        distroConsistencyService.put(fullServiceName, instance);
        
        // 4. 广播到其他节点
        distroProtocol.sync(new DistroKey(fullServiceName, instance.getIp() + ":" + instance.getPort()), 
                           DataOperation.CHANGE);
    }
}    @CanDistro`
`#// naming/src/main/java/com/alibaba/nacos/naming/core/InstanceController.java

@RestController
@RequestMapping("/v1/ns")
public class InstanceController {
    
    @CanDistro
    @PostMapping("/instance")
    public String register(HttpServletRequest request) throws Exception {
        // 1. 解析请求参数
        String serviceName = WebUtils.required(request, "serviceName");
        String ip = WebUtils.required(request, "ip");
        int port = Integer.parseInt(WebUtils.required(request, "port"));
        
        // 2. 构建 Instance 对象
        Instance instance = new Instance();
        instance.setIp(ip);
        instance.setPort(port);
        instance.setWeight(Double.parseDouble(WebUtils.optional(request, "weight", "1.0")));
        instance.setHealthy(true);
        instance.setEphemeral(true); // 临时实例
        
        // 3. 注册服务
        getInstanceOperator().registerInstance(serviceName, "DEFAULT_GROUP", instance);
        
        return "ok";
    }
}

// naming/src/main/java/com/alibaba/nacos/naming/core/InstanceOperatorServiceImpl.java

public class InstanceOperatorServiceImpl implements InstanceOperator {
    
    @Override
    public void registerInstance(String serviceName, String groupName, Instance instance) {
        // 1. 构建完整服务名
        String fullServiceName = groupName + Constants.SERVICE_INFO_SPLITER + serviceName;
        
        // 2. 写入 AP 存储(Distro 协议)
        DistroConsistencyServiceImpl distroConsistencyService = 
            (DistroConsistencyServiceImpl) consistencyService;
        
        // 3. 注册实例(写入内存)
        distroConsistencyService.put(fullServiceName, instance);
        
        // 4. 广播到其他节点
        distroProtocol.sync(new DistroKey(fullServiceName, instance.getIp() + ":" + instance.getPort()), 
                           DataOperation.CHANGE);
    }
}    @PostMapping("/instance")`
`#// naming/src/main/java/com/alibaba/nacos/naming/core/InstanceController.java

@RestController
@RequestMapping("/v1/ns")
public class InstanceController {
    
    @CanDistro
    @PostMapping("/instance")
    public String register(HttpServletRequest request) throws Exception {
        // 1. 解析请求参数
        String serviceName = WebUtils.required(request, "serviceName");
        String ip = WebUtils.required(request, "ip");
        int port = Integer.parseInt(WebUtils.required(request, "port"));
        
        // 2. 构建 Instance 对象
        Instance instance = new Instance();
        instance.setIp(ip);
        instance.setPort(port);
        instance.setWeight(Double.parseDouble(WebUtils.optional(request, "weight", "1.0")));
        instance.setHealthy(true);
        instance.setEphemeral(true); // 临时实例
        
        // 3. 注册服务
        getInstanceOperator().registerInstance(serviceName, "DEFAULT_GROUP", instance);
        
        return "ok";
    }
}

// naming/src/main/java/com/alibaba/nacos/naming/core/InstanceOperatorServiceImpl.java

public class InstanceOperatorServiceImpl implements InstanceOperator {
    
    @Override
    public void registerInstance(String serviceName, String groupName, Instance instance) {
        // 1. 构建完整服务名
        String fullServiceName = groupName + Constants.SERVICE_INFO_SPLITER + serviceName;
        
        // 2. 写入 AP 存储(Distro 协议)
        DistroConsistencyServiceImpl distroConsistencyService = 
            (DistroConsistencyServiceImpl) consistencyService;
        
        // 3. 注册实例(写入内存)
        distroConsistencyService.put(fullServiceName, instance);
        
        // 4. 广播到其他节点
        distroProtocol.sync(new DistroKey(fullServiceName, instance.getIp() + ":" + instance.getPort()), 
                           DataOperation.CHANGE);
    }
}    public String register(HttpServletRequest request) throws Exception {`
`#// naming/src/main/java/com/alibaba/nacos/naming/core/InstanceController.java

@RestController
@RequestMapping("/v1/ns")
public class InstanceController {
    
    @CanDistro
    @PostMapping("/instance")
    public String register(HttpServletRequest request) throws Exception {
        // 1. 解析请求参数
        String serviceName = WebUtils.required(request, "serviceName");
        String ip = WebUtils.required(request, "ip");
        int port = Integer.parseInt(WebUtils.required(request, "port"));
        
        // 2. 构建 Instance 对象
        Instance instance = new Instance();
        instance.setIp(ip);
        instance.setPort(port);
        instance.setWeight(Double.parseDouble(WebUtils.optional(request, "weight", "1.0")));
        instance.setHealthy(true);
        instance.setEphemeral(true); // 临时实例
        
        // 3. 注册服务
        getInstanceOperator().registerInstance(serviceName, "DEFAULT_GROUP", instance);
        
        return "ok";
    }
}

// naming/src/main/java/com/alibaba/nacos/naming/core/InstanceOperatorServiceImpl.java

public class InstanceOperatorServiceImpl implements InstanceOperator {
    
    @Override
    public void registerInstance(String serviceName, String groupName, Instance instance) {
        // 1. 构建完整服务名
        String fullServiceName = groupName + Constants.SERVICE_INFO_SPLITER + serviceName;
        
        // 2. 写入 AP 存储(Distro 协议)
        DistroConsistencyServiceImpl distroConsistencyService = 
            (DistroConsistencyServiceImpl) consistencyService;
        
        // 3. 注册实例(写入内存)
        distroConsistencyService.put(fullServiceName, instance);
        
        // 4. 广播到其他节点
        distroProtocol.sync(new DistroKey(fullServiceName, instance.getIp() + ":" + instance.getPort()), 
                           DataOperation.CHANGE);
    }
}        // 1. 解析请求参数`
`#// naming/src/main/java/com/alibaba/nacos/naming/core/InstanceController.java

@RestController
@RequestMapping("/v1/ns")
public class InstanceController {
    
    @CanDistro
    @PostMapping("/instance")
    public String register(HttpServletRequest request) throws Exception {
        // 1. 解析请求参数
        String serviceName = WebUtils.required(request, "serviceName");
        String ip = WebUtils.required(request, "ip");
        int port = Integer.parseInt(WebUtils.required(request, "port"));
        
        // 2. 构建 Instance 对象
        Instance instance = new Instance();
        instance.setIp(ip);
        instance.setPort(port);
        instance.setWeight(Double.parseDouble(WebUtils.optional(request, "weight", "1.0")));
        instance.setHealthy(true);
        instance.setEphemeral(true); // 临时实例
        
        // 3. 注册服务
        getInstanceOperator().registerInstance(serviceName, "DEFAULT_GROUP", instance);
        
        return "ok";
    }
}

// naming/src/main/java/com/alibaba/nacos/naming/core/InstanceOperatorServiceImpl.java

public class InstanceOperatorServiceImpl implements InstanceOperator {
    
    @Override
    public void registerInstance(String serviceName, String groupName, Instance instance) {
        // 1. 构建完整服务名
        String fullServiceName = groupName + Constants.SERVICE_INFO_SPLITER + serviceName;
        
        // 2. 写入 AP 存储(Distro 协议)
        DistroConsistencyServiceImpl distroConsistencyService = 
            (DistroConsistencyServiceImpl) consistencyService;
        
        // 3. 注册实例(写入内存)
        distroConsistencyService.put(fullServiceName, instance);
        
        // 4. 广播到其他节点
        distroProtocol.sync(new DistroKey(fullServiceName, instance.getIp() + ":" + instance.getPort()), 
                           DataOperation.CHANGE);
    }
}        String serviceName = WebUtils.required(request, "serviceName");`
`#// naming/src/main/java/com/alibaba/nacos/naming/core/InstanceController.java

@RestController
@RequestMapping("/v1/ns")
public class InstanceController {
    
    @CanDistro
    @PostMapping("/instance")
    public String register(HttpServletRequest request) throws Exception {
        // 1. 解析请求参数
        String serviceName = WebUtils.required(request, "serviceName");
        String ip = WebUtils.required(request, "ip");
        int port = Integer.parseInt(WebUtils.required(request, "port"));
        
        // 2. 构建 Instance 对象
        Instance instance = new Instance();
        instance.setIp(ip);
        instance.setPort(port);
        instance.setWeight(Double.parseDouble(WebUtils.optional(request, "weight", "1.0")));
        instance.setHealthy(true);
        instance.setEphemeral(true); // 临时实例
        
        // 3. 注册服务
        getInstanceOperator().registerInstance(serviceName, "DEFAULT_GROUP", instance);
        
        return "ok";
    }
}

// naming/src/main/java/com/alibaba/nacos/naming/core/InstanceOperatorServiceImpl.java

public class InstanceOperatorServiceImpl implements InstanceOperator {
    
    @Override
    public void registerInstance(String serviceName, String groupName, Instance instance) {
        // 1. 构建完整服务名
        String fullServiceName = groupName + Constants.SERVICE_INFO_SPLITER + serviceName;
        
        // 2. 写入 AP 存储(Distro 协议)
        DistroConsistencyServiceImpl distroConsistencyService = 
            (DistroConsistencyServiceImpl) consistencyService;
        
        // 3. 注册实例(写入内存)
        distroConsistencyService.put(fullServiceName, instance);
        
        // 4. 广播到其他节点
        distroProtocol.sync(new DistroKey(fullServiceName, instance.getIp() + ":" + instance.getPort()), 
                           DataOperation.CHANGE);
    }
}        String ip = WebUtils.required(request, "ip");`
`#// naming/src/main/java/com/alibaba/nacos/naming/core/InstanceController.java

@RestController
@RequestMapping("/v1/ns")
public class InstanceController {
    
    @CanDistro
    @PostMapping("/instance")
    public String register(HttpServletRequest request) throws Exception {
        // 1. 解析请求参数
        String serviceName = WebUtils.required(request, "serviceName");
        String ip = WebUtils.required(request, "ip");
        int port = Integer.parseInt(WebUtils.required(request, "port"));
        
        // 2. 构建 Instance 对象
        Instance instance = new Instance();
        instance.setIp(ip);
        instance.setPort(port);
        instance.setWeight(Double.parseDouble(WebUtils.optional(request, "weight", "1.0")));
        instance.setHealthy(true);
        instance.setEphemeral(true); // 临时实例
        
        // 3. 注册服务
        getInstanceOperator().registerInstance(serviceName, "DEFAULT_GROUP", instance);
        
        return "ok";
    }
}

// naming/src/main/java/com/alibaba/nacos/naming/core/InstanceOperatorServiceImpl.java

public class InstanceOperatorServiceImpl implements InstanceOperator {
    
    @Override
    public void registerInstance(String serviceName, String groupName, Instance instance) {
        // 1. 构建完整服务名
        String fullServiceName = groupName + Constants.SERVICE_INFO_SPLITER + serviceName;
        
        // 2. 写入 AP 存储(Distro 协议)
        DistroConsistencyServiceImpl distroConsistencyService = 
            (DistroConsistencyServiceImpl) consistencyService;
        
        // 3. 注册实例(写入内存)
        distroConsistencyService.put(fullServiceName, instance);
        
        // 4. 广播到其他节点
        distroProtocol.sync(new DistroKey(fullServiceName, instance.getIp() + ":" + instance.getPort()), 
                           DataOperation.CHANGE);
    }
}        int port = Integer.parseInt(WebUtils.required(request, "port"));`
`#// naming/src/main/java/com/alibaba/nacos/naming/core/InstanceController.java

@RestController
@RequestMapping("/v1/ns")
public class InstanceController {
    
    @CanDistro
    @PostMapping("/instance")
    public String register(HttpServletRequest request) throws Exception {
        // 1. 解析请求参数
        String serviceName = WebUtils.required(request, "serviceName");
        String ip = WebUtils.required(request, "ip");
        int port = Integer.parseInt(WebUtils.required(request, "port"));
        
        // 2. 构建 Instance 对象
        Instance instance = new Instance();
        instance.setIp(ip);
        instance.setPort(port);
        instance.setWeight(Double.parseDouble(WebUtils.optional(request, "weight", "1.0")));
        instance.setHealthy(true);
        instance.setEphemeral(true); // 临时实例
        
        // 3. 注册服务
        getInstanceOperator().registerInstance(serviceName, "DEFAULT_GROUP", instance);
        
        return "ok";
    }
}

// naming/src/main/java/com/alibaba/nacos/naming/core/InstanceOperatorServiceImpl.java

public class InstanceOperatorServiceImpl implements InstanceOperator {
    
    @Override
    public void registerInstance(String serviceName, String groupName, Instance instance) {
        // 1. 构建完整服务名
        String fullServiceName = groupName + Constants.SERVICE_INFO_SPLITER + serviceName;
        
        // 2. 写入 AP 存储(Distro 协议)
        DistroConsistencyServiceImpl distroConsistencyService = 
            (DistroConsistencyServiceImpl) consistencyService;
        
        // 3. 注册实例(写入内存)
        distroConsistencyService.put(fullServiceName, instance);
        
        // 4. 广播到其他节点
        distroProtocol.sync(new DistroKey(fullServiceName, instance.getIp() + ":" + instance.getPort()), 
                           DataOperation.CHANGE);
    }
}        `
`#// naming/src/main/java/com/alibaba/nacos/naming/core/InstanceController.java

@RestController
@RequestMapping("/v1/ns")
public class InstanceController {
    
    @CanDistro
    @PostMapping("/instance")
    public String register(HttpServletRequest request) throws Exception {
        // 1. 解析请求参数
        String serviceName = WebUtils.required(request, "serviceName");
        String ip = WebUtils.required(request, "ip");
        int port = Integer.parseInt(WebUtils.required(request, "port"));
        
        // 2. 构建 Instance 对象
        Instance instance = new Instance();
        instance.setIp(ip);
        instance.setPort(port);
        instance.setWeight(Double.parseDouble(WebUtils.optional(request, "weight", "1.0")));
        instance.setHealthy(true);
        instance.setEphemeral(true); // 临时实例
        
        // 3. 注册服务
        getInstanceOperator().registerInstance(serviceName, "DEFAULT_GROUP", instance);
        
        return "ok";
    }
}

// naming/src/main/java/com/alibaba/nacos/naming/core/InstanceOperatorServiceImpl.java

public class InstanceOperatorServiceImpl implements InstanceOperator {
    
    @Override
    public void registerInstance(String serviceName, String groupName, Instance instance) {
        // 1. 构建完整服务名
        String fullServiceName = groupName + Constants.SERVICE_INFO_SPLITER + serviceName;
        
        // 2. 写入 AP 存储(Distro 协议)
        DistroConsistencyServiceImpl distroConsistencyService = 
            (DistroConsistencyServiceImpl) consistencyService;
        
        // 3. 注册实例(写入内存)
        distroConsistencyService.put(fullServiceName, instance);
        
        // 4. 广播到其他节点
        distroProtocol.sync(new DistroKey(fullServiceName, instance.getIp() + ":" + instance.getPort()), 
                           DataOperation.CHANGE);
    }
}        // 2. 构建 Instance 对象`
`#// naming/src/main/java/com/alibaba/nacos/naming/core/InstanceController.java

@RestController
@RequestMapping("/v1/ns")
public class InstanceController {
    
    @CanDistro
    @PostMapping("/instance")
    public String register(HttpServletRequest request) throws Exception {
        // 1. 解析请求参数
        String serviceName = WebUtils.required(request, "serviceName");
        String ip = WebUtils.required(request, "ip");
        int port = Integer.parseInt(WebUtils.required(request, "port"));
        
        // 2. 构建 Instance 对象
        Instance instance = new Instance();
        instance.setIp(ip);
        instance.setPort(port);
        instance.setWeight(Double.parseDouble(WebUtils.optional(request, "weight", "1.0")));
        instance.setHealthy(true);
        instance.setEphemeral(true); // 临时实例
        
        // 3. 注册服务
        getInstanceOperator().registerInstance(serviceName, "DEFAULT_GROUP", instance);
        
        return "ok";
    }
}

// naming/src/main/java/com/alibaba/nacos/naming/core/InstanceOperatorServiceImpl.java

public class InstanceOperatorServiceImpl implements InstanceOperator {
    
    @Override
    public void registerInstance(String serviceName, String groupName, Instance instance) {
        // 1. 构建完整服务名
        String fullServiceName = groupName + Constants.SERVICE_INFO_SPLITER + serviceName;
        
        // 2. 写入 AP 存储(Distro 协议)
        DistroConsistencyServiceImpl distroConsistencyService = 
            (DistroConsistencyServiceImpl) consistencyService;
        
        // 3. 注册实例(写入内存)
        distroConsistencyService.put(fullServiceName, instance);
        
        // 4. 广播到其他节点
        distroProtocol.sync(new DistroKey(fullServiceName, instance.getIp() + ":" + instance.getPort()), 
                           DataOperation.CHANGE);
    }
}        Instance instance = new Instance();`
`#// naming/src/main/java/com/alibaba/nacos/naming/core/InstanceController.java

@RestController
@RequestMapping("/v1/ns")
public class InstanceController {
    
    @CanDistro
    @PostMapping("/instance")
    public String register(HttpServletRequest request) throws Exception {
        // 1. 解析请求参数
        String serviceName = WebUtils.required(request, "serviceName");
        String ip = WebUtils.required(request, "ip");
        int port = Integer.parseInt(WebUtils.required(request, "port"));
        
        // 2. 构建 Instance 对象
        Instance instance = new Instance();
        instance.setIp(ip);
        instance.setPort(port);
        instance.setWeight(Double.parseDouble(WebUtils.optional(request, "weight", "1.0")));
        instance.setHealthy(true);
        instance.setEphemeral(true); // 临时实例
        
        // 3. 注册服务
        getInstanceOperator().registerInstance(serviceName, "DEFAULT_GROUP", instance);
        
        return "ok";
    }
}

// naming/src/main/java/com/alibaba/nacos/naming/core/InstanceOperatorServiceImpl.java

public class InstanceOperatorServiceImpl implements InstanceOperator {
    
    @Override
    public void registerInstance(String serviceName, String groupName, Instance instance) {
        // 1. 构建完整服务名
        String fullServiceName = groupName + Constants.SERVICE_INFO_SPLITER + serviceName;
        
        // 2. 写入 AP 存储(Distro 协议)
        DistroConsistencyServiceImpl distroConsistencyService = 
            (DistroConsistencyServiceImpl) consistencyService;
        
        // 3. 注册实例(写入内存)
        distroConsistencyService.put(fullServiceName, instance);
        
        // 4. 广播到其他节点
        distroProtocol.sync(new DistroKey(fullServiceName, instance.getIp() + ":" + instance.getPort()), 
                           DataOperation.CHANGE);
    }
}        instance.setIp(ip);`
`#// naming/src/main/java/com/alibaba/nacos/naming/core/InstanceController.java

@RestController
@RequestMapping("/v1/ns")
public class InstanceController {
    
    @CanDistro
    @PostMapping("/instance")
    public String register(HttpServletRequest request) throws Exception {
        // 1. 解析请求参数
        String serviceName = WebUtils.required(request, "serviceName");
        String ip = WebUtils.required(request, "ip");
        int port = Integer.parseInt(WebUtils.required(request, "port"));
        
        // 2. 构建 Instance 对象
        Instance instance = new Instance();
        instance.setIp(ip);
        instance.setPort(port);
        instance.setWeight(Double.parseDouble(WebUtils.optional(request, "weight", "1.0")));
        instance.setHealthy(true);
        instance.setEphemeral(true); // 临时实例
        
        // 3. 注册服务
        getInstanceOperator().registerInstance(serviceName, "DEFAULT_GROUP", instance);
        
        return "ok";
    }
}

// naming/src/main/java/com/alibaba/nacos/naming/core/InstanceOperatorServiceImpl.java

public class InstanceOperatorServiceImpl implements InstanceOperator {
    
    @Override
    public void registerInstance(String serviceName, String groupName, Instance instance) {
        // 1. 构建完整服务名
        String fullServiceName = groupName + Constants.SERVICE_INFO_SPLITER + serviceName;
        
        // 2. 写入 AP 存储(Distro 协议)
        DistroConsistencyServiceImpl distroConsistencyService = 
            (DistroConsistencyServiceImpl) consistencyService;
        
        // 3. 注册实例(写入内存)
        distroConsistencyService.put(fullServiceName, instance);
        
        // 4. 广播到其他节点
        distroProtocol.sync(new DistroKey(fullServiceName, instance.getIp() + ":" + instance.getPort()), 
                           DataOperation.CHANGE);
    }
}        instance.setPort(port);`
`#// naming/src/main/java/com/alibaba/nacos/naming/core/InstanceController.java

@RestController
@RequestMapping("/v1/ns")
public class InstanceController {
    
    @CanDistro
    @PostMapping("/instance")
    public String register(HttpServletRequest request) throws Exception {
        // 1. 解析请求参数
        String serviceName = WebUtils.required(request, "serviceName");
        String ip = WebUtils.required(request, "ip");
        int port = Integer.parseInt(WebUtils.required(request, "port"));
        
        // 2. 构建 Instance 对象
        Instance instance = new Instance();
        instance.setIp(ip);
        instance.setPort(port);
        instance.setWeight(Double.parseDouble(WebUtils.optional(request, "weight", "1.0")));
        instance.setHealthy(true);
        instance.setEphemeral(true); // 临时实例
        
        // 3. 注册服务
        getInstanceOperator().registerInstance(serviceName, "DEFAULT_GROUP", instance);
        
        return "ok";
    }
}

// naming/src/main/java/com/alibaba/nacos/naming/core/InstanceOperatorServiceImpl.java

public class InstanceOperatorServiceImpl implements InstanceOperator {
    
    @Override
    public void registerInstance(String serviceName, String groupName, Instance instance) {
        // 1. 构建完整服务名
        String fullServiceName = groupName + Constants.SERVICE_INFO_SPLITER + serviceName;
        
        // 2. 写入 AP 存储(Distro 协议)
        DistroConsistencyServiceImpl distroConsistencyService = 
            (DistroConsistencyServiceImpl) consistencyService;
        
        // 3. 注册实例(写入内存)
        distroConsistencyService.put(fullServiceName, instance);
        
        // 4. 广播到其他节点
        distroProtocol.sync(new DistroKey(fullServiceName, instance.getIp() + ":" + instance.getPort()), 
                           DataOperation.CHANGE);
    }
}        instance.setWeight(Double.parseDouble(WebUtils.optional(request, "weight", "1.0")));`
`#// naming/src/main/java/com/alibaba/nacos/naming/core/InstanceController.java

@RestController
@RequestMapping("/v1/ns")
public class InstanceController {
    
    @CanDistro
    @PostMapping("/instance")
    public String register(HttpServletRequest request) throws Exception {
        // 1. 解析请求参数
        String serviceName = WebUtils.required(request, "serviceName");
        String ip = WebUtils.required(request, "ip");
        int port = Integer.parseInt(WebUtils.required(request, "port"));
        
        // 2. 构建 Instance 对象
        Instance instance = new Instance();
        instance.setIp(ip);
        instance.setPort(port);
        instance.setWeight(Double.parseDouble(WebUtils.optional(request, "weight", "1.0")));
        instance.setHealthy(true);
        instance.setEphemeral(true); // 临时实例
        
        // 3. 注册服务
        getInstanceOperator().registerInstance(serviceName, "DEFAULT_GROUP", instance);
        
        return "ok";
    }
}

// naming/src/main/java/com/alibaba/nacos/naming/core/InstanceOperatorServiceImpl.java

public class InstanceOperatorServiceImpl implements InstanceOperator {
    
    @Override
    public void registerInstance(String serviceName, String groupName, Instance instance) {
        // 1. 构建完整服务名
        String fullServiceName = groupName + Constants.SERVICE_INFO_SPLITER + serviceName;
        
        // 2. 写入 AP 存储(Distro 协议)
        DistroConsistencyServiceImpl distroConsistencyService = 
            (DistroConsistencyServiceImpl) consistencyService;
        
        // 3. 注册实例(写入内存)
        distroConsistencyService.put(fullServiceName, instance);
        
        // 4. 广播到其他节点
        distroProtocol.sync(new DistroKey(fullServiceName, instance.getIp() + ":" + instance.getPort()), 
                           DataOperation.CHANGE);
    }
}        instance.setHealthy(true);`
`#// naming/src/main/java/com/alibaba/nacos/naming/core/InstanceController.java

@RestController
@RequestMapping("/v1/ns")
public class InstanceController {
    
    @CanDistro
    @PostMapping("/instance")
    public String register(HttpServletRequest request) throws Exception {
        // 1. 解析请求参数
        String serviceName = WebUtils.required(request, "serviceName");
        String ip = WebUtils.required(request, "ip");
        int port = Integer.parseInt(WebUtils.required(request, "port"));
        
        // 2. 构建 Instance 对象
        Instance instance = new Instance();
        instance.setIp(ip);
        instance.setPort(port);
        instance.setWeight(Double.parseDouble(WebUtils.optional(request, "weight", "1.0")));
        instance.setHealthy(true);
        instance.setEphemeral(true); // 临时实例
        
        // 3. 注册服务
        getInstanceOperator().registerInstance(serviceName, "DEFAULT_GROUP", instance);
        
        return "ok";
    }
}

// naming/src/main/java/com/alibaba/nacos/naming/core/InstanceOperatorServiceImpl.java

public class InstanceOperatorServiceImpl implements InstanceOperator {
    
    @Override
    public void registerInstance(String serviceName, String groupName, Instance instance) {
        // 1. 构建完整服务名
        String fullServiceName = groupName + Constants.SERVICE_INFO_SPLITER + serviceName;
        
        // 2. 写入 AP 存储(Distro 协议)
        DistroConsistencyServiceImpl distroConsistencyService = 
            (DistroConsistencyServiceImpl) consistencyService;
        
        // 3. 注册实例(写入内存)
        distroConsistencyService.put(fullServiceName, instance);
        
        // 4. 广播到其他节点
        distroProtocol.sync(new DistroKey(fullServiceName, instance.getIp() + ":" + instance.getPort()), 
                           DataOperation.CHANGE);
    }
}        instance.setEphemeral(true); // 临时实例`
`#// naming/src/main/java/com/alibaba/nacos/naming/core/InstanceController.java

@RestController
@RequestMapping("/v1/ns")
public class InstanceController {
    
    @CanDistro
    @PostMapping("/instance")
    public String register(HttpServletRequest request) throws Exception {
        // 1. 解析请求参数
        String serviceName = WebUtils.required(request, "serviceName");
        String ip = WebUtils.required(request, "ip");
        int port = Integer.parseInt(WebUtils.required(request, "port"));
        
        // 2. 构建 Instance 对象
        Instance instance = new Instance();
        instance.setIp(ip);
        instance.setPort(port);
        instance.setWeight(Double.parseDouble(WebUtils.optional(request, "weight", "1.0")));
        instance.setHealthy(true);
        instance.setEphemeral(true); // 临时实例
        
        // 3. 注册服务
        getInstanceOperator().registerInstance(serviceName, "DEFAULT_GROUP", instance);
        
        return "ok";
    }
}

// naming/src/main/java/com/alibaba/nacos/naming/core/InstanceOperatorServiceImpl.java

public class InstanceOperatorServiceImpl implements InstanceOperator {
    
    @Override
    public void registerInstance(String serviceName, String groupName, Instance instance) {
        // 1. 构建完整服务名
        String fullServiceName = groupName + Constants.SERVICE_INFO_SPLITER + serviceName;
        
        // 2. 写入 AP 存储(Distro 协议)
        DistroConsistencyServiceImpl distroConsistencyService = 
            (DistroConsistencyServiceImpl) consistencyService;
        
        // 3. 注册实例(写入内存)
        distroConsistencyService.put(fullServiceName, instance);
        
        // 4. 广播到其他节点
        distroProtocol.sync(new DistroKey(fullServiceName, instance.getIp() + ":" + instance.getPort()), 
                           DataOperation.CHANGE);
    }
}        `
`#// naming/src/main/java/com/alibaba/nacos/naming/core/InstanceController.java

@RestController
@RequestMapping("/v1/ns")
public class InstanceController {
    
    @CanDistro
    @PostMapping("/instance")
    public String register(HttpServletRequest request) throws Exception {
        // 1. 解析请求参数
        String serviceName = WebUtils.required(request, "serviceName");
        String ip = WebUtils.required(request, "ip");
        int port = Integer.parseInt(WebUtils.required(request, "port"));
        
        // 2. 构建 Instance 对象
        Instance instance = new Instance();
        instance.setIp(ip);
        instance.setPort(port);
        instance.setWeight(Double.parseDouble(WebUtils.optional(request, "weight", "1.0")));
        instance.setHealthy(true);
        instance.setEphemeral(true); // 临时实例
        
        // 3. 注册服务
        getInstanceOperator().registerInstance(serviceName, "DEFAULT_GROUP", instance);
        
        return "ok";
    }
}

// naming/src/main/java/com/alibaba/nacos/naming/core/InstanceOperatorServiceImpl.java

public class InstanceOperatorServiceImpl implements InstanceOperator {
    
    @Override
    public void registerInstance(String serviceName, String groupName, Instance instance) {
        // 1. 构建完整服务名
        String fullServiceName = groupName + Constants.SERVICE_INFO_SPLITER + serviceName;
        
        // 2. 写入 AP 存储(Distro 协议)
        DistroConsistencyServiceImpl distroConsistencyService = 
            (DistroConsistencyServiceImpl) consistencyService;
        
        // 3. 注册实例(写入内存)
        distroConsistencyService.put(fullServiceName, instance);
        
        // 4. 广播到其他节点
        distroProtocol.sync(new DistroKey(fullServiceName, instance.getIp() + ":" + instance.getPort()), 
                           DataOperation.CHANGE);
    }
}        // 3. 注册服务`
`#// naming/src/main/java/com/alibaba/nacos/naming/core/InstanceController.java

@RestController
@RequestMapping("/v1/ns")
public class InstanceController {
    
    @CanDistro
    @PostMapping("/instance")
    public String register(HttpServletRequest request) throws Exception {
        // 1. 解析请求参数
        String serviceName = WebUtils.required(request, "serviceName");
        String ip = WebUtils.required(request, "ip");
        int port = Integer.parseInt(WebUtils.required(request, "port"));
        
        // 2. 构建 Instance 对象
        Instance instance = new Instance();
        instance.setIp(ip);
        instance.setPort(port);
        instance.setWeight(Double.parseDouble(WebUtils.optional(request, "weight", "1.0")));
        instance.setHealthy(true);
        instance.setEphemeral(true); // 临时实例
        
        // 3. 注册服务
        getInstanceOperator().registerInstance(serviceName, "DEFAULT_GROUP", instance);
        
        return "ok";
    }
}

// naming/src/main/java/com/alibaba/nacos/naming/core/InstanceOperatorServiceImpl.java

public class InstanceOperatorServiceImpl implements InstanceOperator {
    
    @Override
    public void registerInstance(String serviceName, String groupName, Instance instance) {
        // 1. 构建完整服务名
        String fullServiceName = groupName + Constants.SERVICE_INFO_SPLITER + serviceName;
        
        // 2. 写入 AP 存储(Distro 协议)
        DistroConsistencyServiceImpl distroConsistencyService = 
            (DistroConsistencyServiceImpl) consistencyService;
        
        // 3. 注册实例(写入内存)
        distroConsistencyService.put(fullServiceName, instance);
        
        // 4. 广播到其他节点
        distroProtocol.sync(new DistroKey(fullServiceName, instance.getIp() + ":" + instance.getPort()), 
                           DataOperation.CHANGE);
    }
}        getInstanceOperator().registerInstance(serviceName, "DEFAULT_GROUP", instance);`
`#// naming/src/main/java/com/alibaba/nacos/naming/core/InstanceController.java

@RestController
@RequestMapping("/v1/ns")
public class InstanceController {
    
    @CanDistro
    @PostMapping("/instance")
    public String register(HttpServletRequest request) throws Exception {
        // 1. 解析请求参数
        String serviceName = WebUtils.required(request, "serviceName");
        String ip = WebUtils.required(request, "ip");
        int port = Integer.parseInt(WebUtils.required(request, "port"));
        
        // 2. 构建 Instance 对象
        Instance instance = new Instance();
        instance.setIp(ip);
        instance.setPort(port);
        instance.setWeight(Double.parseDouble(WebUtils.optional(request, "weight", "1.0")));
        instance.setHealthy(true);
        instance.setEphemeral(true); // 临时实例
        
        // 3. 注册服务
        getInstanceOperator().registerInstance(serviceName, "DEFAULT_GROUP", instance);
        
        return "ok";
    }
}

// naming/src/main/java/com/alibaba/nacos/naming/core/InstanceOperatorServiceImpl.java

public class InstanceOperatorServiceImpl implements InstanceOperator {
    
    @Override
    public void registerInstance(String serviceName, String groupName, Instance instance) {
        // 1. 构建完整服务名
        String fullServiceName = groupName + Constants.SERVICE_INFO_SPLITER + serviceName;
        
        // 2. 写入 AP 存储(Distro 协议)
        DistroConsistencyServiceImpl distroConsistencyService = 
            (DistroConsistencyServiceImpl) consistencyService;
        
        // 3. 注册实例(写入内存)
        distroConsistencyService.put(fullServiceName, instance);
        
        // 4. 广播到其他节点
        distroProtocol.sync(new DistroKey(fullServiceName, instance.getIp() + ":" + instance.getPort()), 
                           DataOperation.CHANGE);
    }
}        `
`#// naming/src/main/java/com/alibaba/nacos/naming/core/InstanceController.java

@RestController
@RequestMapping("/v1/ns")
public class InstanceController {
    
    @CanDistro
    @PostMapping("/instance")
    public String register(HttpServletRequest request) throws Exception {
        // 1. 解析请求参数
        String serviceName = WebUtils.required(request, "serviceName");
        String ip = WebUtils.required(request, "ip");
        int port = Integer.parseInt(WebUtils.required(request, "port"));
        
        // 2. 构建 Instance 对象
        Instance instance = new Instance();
        instance.setIp(ip);
        instance.setPort(port);
        instance.setWeight(Double.parseDouble(WebUtils.optional(request, "weight", "1.0")));
        instance.setHealthy(true);
        instance.setEphemeral(true); // 临时实例
        
        // 3. 注册服务
        getInstanceOperator().registerInstance(serviceName, "DEFAULT_GROUP", instance);
        
        return "ok";
    }
}

// naming/src/main/java/com/alibaba/nacos/naming/core/InstanceOperatorServiceImpl.java

public class InstanceOperatorServiceImpl implements InstanceOperator {
    
    @Override
    public void registerInstance(String serviceName, String groupName, Instance instance) {
        // 1. 构建完整服务名
        String fullServiceName = groupName + Constants.SERVICE_INFO_SPLITER + serviceName;
        
        // 2. 写入 AP 存储(Distro 协议)
        DistroConsistencyServiceImpl distroConsistencyService = 
            (DistroConsistencyServiceImpl) consistencyService;
        
        // 3. 注册实例(写入内存)
        distroConsistencyService.put(fullServiceName, instance);
        
        // 4. 广播到其他节点
        distroProtocol.sync(new DistroKey(fullServiceName, instance.getIp() + ":" + instance.getPort()), 
                           DataOperation.CHANGE);
    }
}        return "ok";`
`#// naming/src/main/java/com/alibaba/nacos/naming/core/InstanceController.java

@RestController
@RequestMapping("/v1/ns")
public class InstanceController {
    
    @CanDistro
    @PostMapping("/instance")
    public String register(HttpServletRequest request) throws Exception {
        // 1. 解析请求参数
        String serviceName = WebUtils.required(request, "serviceName");
        String ip = WebUtils.required(request, "ip");
        int port = Integer.parseInt(WebUtils.required(request, "port"));
        
        // 2. 构建 Instance 对象
        Instance instance = new Instance();
        instance.setIp(ip);
        instance.setPort(port);
        instance.setWeight(Double.parseDouble(WebUtils.optional(request, "weight", "1.0")));
        instance.setHealthy(true);
        instance.setEphemeral(true); // 临时实例
        
        // 3. 注册服务
        getInstanceOperator().registerInstance(serviceName, "DEFAULT_GROUP", instance);
        
        return "ok";
    }
}

// naming/src/main/java/com/alibaba/nacos/naming/core/InstanceOperatorServiceImpl.java

public class InstanceOperatorServiceImpl implements InstanceOperator {
    
    @Override
    public void registerInstance(String serviceName, String groupName, Instance instance) {
        // 1. 构建完整服务名
        String fullServiceName = groupName + Constants.SERVICE_INFO_SPLITER + serviceName;
        
        // 2. 写入 AP 存储(Distro 协议)
        DistroConsistencyServiceImpl distroConsistencyService = 
            (DistroConsistencyServiceImpl) consistencyService;
        
        // 3. 注册实例(写入内存)
        distroConsistencyService.put(fullServiceName, instance);
        
        // 4. 广播到其他节点
        distroProtocol.sync(new DistroKey(fullServiceName, instance.getIp() + ":" + instance.getPort()), 
                           DataOperation.CHANGE);
    }
}    }`
`#// naming/src/main/java/com/alibaba/nacos/naming/core/InstanceController.java

@RestController
@RequestMapping("/v1/ns")
public class InstanceController {
    
    @CanDistro
    @PostMapping("/instance")
    public String register(HttpServletRequest request) throws Exception {
        // 1. 解析请求参数
        String serviceName = WebUtils.required(request, "serviceName");
        String ip = WebUtils.required(request, "ip");
        int port = Integer.parseInt(WebUtils.required(request, "port"));
        
        // 2. 构建 Instance 对象
        Instance instance = new Instance();
        instance.setIp(ip);
        instance.setPort(port);
        instance.setWeight(Double.parseDouble(WebUtils.optional(request, "weight", "1.0")));
        instance.setHealthy(true);
        instance.setEphemeral(true); // 临时实例
        
        // 3. 注册服务
        getInstanceOperator().registerInstance(serviceName, "DEFAULT_GROUP", instance);
        
        return "ok";
    }
}

// naming/src/main/java/com/alibaba/nacos/naming/core/InstanceOperatorServiceImpl.java

public class InstanceOperatorServiceImpl implements InstanceOperator {
    
    @Override
    public void registerInstance(String serviceName, String groupName, Instance instance) {
        // 1. 构建完整服务名
        String fullServiceName = groupName + Constants.SERVICE_INFO_SPLITER + serviceName;
        
        // 2. 写入 AP 存储(Distro 协议)
        DistroConsistencyServiceImpl distroConsistencyService = 
            (DistroConsistencyServiceImpl) consistencyService;
        
        // 3. 注册实例(写入内存)
        distroConsistencyService.put(fullServiceName, instance);
        
        // 4. 广播到其他节点
        distroProtocol.sync(new DistroKey(fullServiceName, instance.getIp() + ":" + instance.getPort()), 
                           DataOperation.CHANGE);
    }
}}`
`#// naming/src/main/java/com/alibaba/nacos/naming/core/InstanceController.java

@RestController
@RequestMapping("/v1/ns")
public class InstanceController {
    
    @CanDistro
    @PostMapping("/instance")
    public String register(HttpServletRequest request) throws Exception {
        // 1. 解析请求参数
        String serviceName = WebUtils.required(request, "serviceName");
        String ip = WebUtils.required(request, "ip");
        int port = Integer.parseInt(WebUtils.required(request, "port"));
        
        // 2. 构建 Instance 对象
        Instance instance = new Instance();
        instance.setIp(ip);
        instance.setPort(port);
        instance.setWeight(Double.parseDouble(WebUtils.optional(request, "weight", "1.0")));
        instance.setHealthy(true);
        instance.setEphemeral(true); // 临时实例
        
        // 3. 注册服务
        getInstanceOperator().registerInstance(serviceName, "DEFAULT_GROUP", instance);
        
        return "ok";
    }
}

// naming/src/main/java/com/alibaba/nacos/naming/core/InstanceOperatorServiceImpl.java

public class InstanceOperatorServiceImpl implements InstanceOperator {
    
    @Override
    public void registerInstance(String serviceName, String groupName, Instance instance) {
        // 1. 构建完整服务名
        String fullServiceName = groupName + Constants.SERVICE_INFO_SPLITER + serviceName;
        
        // 2. 写入 AP 存储(Distro 协议)
        DistroConsistencyServiceImpl distroConsistencyService = 
            (DistroConsistencyServiceImpl) consistencyService;
        
        // 3. 注册实例(写入内存)
        distroConsistencyService.put(fullServiceName, instance);
        
        // 4. 广播到其他节点
        distroProtocol.sync(new DistroKey(fullServiceName, instance.getIp() + ":" + instance.getPort()), 
                           DataOperation.CHANGE);
    }
}`
`#// naming/src/main/java/com/alibaba/nacos/naming/core/InstanceController.java

@RestController
@RequestMapping("/v1/ns")
public class InstanceController {
    
    @CanDistro
    @PostMapping("/instance")
    public String register(HttpServletRequest request) throws Exception {
        // 1. 解析请求参数
        String serviceName = WebUtils.required(request, "serviceName");
        String ip = WebUtils.required(request, "ip");
        int port = Integer.parseInt(WebUtils.required(request, "port"));
        
        // 2. 构建 Instance 对象
        Instance instance = new Instance();
        instance.setIp(ip);
        instance.setPort(port);
        instance.setWeight(Double.parseDouble(WebUtils.optional(request, "weight", "1.0")));
        instance.setHealthy(true);
        instance.setEphemeral(true); // 临时实例
        
        // 3. 注册服务
        getInstanceOperator().registerInstance(serviceName, "DEFAULT_GROUP", instance);
        
        return "ok";
    }
}

// naming/src/main/java/com/alibaba/nacos/naming/core/InstanceOperatorServiceImpl.java

public class InstanceOperatorServiceImpl implements InstanceOperator {
    
    @Override
    public void registerInstance(String serviceName, String groupName, Instance instance) {
        // 1. 构建完整服务名
        String fullServiceName = groupName + Constants.SERVICE_INFO_SPLITER + serviceName;
        
        // 2. 写入 AP 存储(Distro 协议)
        DistroConsistencyServiceImpl distroConsistencyService = 
            (DistroConsistencyServiceImpl) consistencyService;
        
        // 3. 注册实例(写入内存)
        distroConsistencyService.put(fullServiceName, instance);
        
        // 4. 广播到其他节点
        distroProtocol.sync(new DistroKey(fullServiceName, instance.getIp() + ":" + instance.getPort()), 
                           DataOperation.CHANGE);
    }
}// naming/src/main/java/com/alibaba/nacos/naming/core/InstanceOperatorServiceImpl.java`
`#// naming/src/main/java/com/alibaba/nacos/naming/core/InstanceController.java

@RestController
@RequestMapping("/v1/ns")
public class InstanceController {
    
    @CanDistro
    @PostMapping("/instance")
    public String register(HttpServletRequest request) throws Exception {
        // 1. 解析请求参数
        String serviceName = WebUtils.required(request, "serviceName");
        String ip = WebUtils.required(request, "ip");
        int port = Integer.parseInt(WebUtils.required(request, "port"));
        
        // 2. 构建 Instance 对象
        Instance instance = new Instance();
        instance.setIp(ip);
        instance.setPort(port);
        instance.setWeight(Double.parseDouble(WebUtils.optional(request, "weight", "1.0")));
        instance.setHealthy(true);
        instance.setEphemeral(true); // 临时实例
        
        // 3. 注册服务
        getInstanceOperator().registerInstance(serviceName, "DEFAULT_GROUP", instance);
        
        return "ok";
    }
}

// naming/src/main/java/com/alibaba/nacos/naming/core/InstanceOperatorServiceImpl.java

public class InstanceOperatorServiceImpl implements InstanceOperator {
    
    @Override
    public void registerInstance(String serviceName, String groupName, Instance instance) {
        // 1. 构建完整服务名
        String fullServiceName = groupName + Constants.SERVICE_INFO_SPLITER + serviceName;
        
        // 2. 写入 AP 存储(Distro 协议)
        DistroConsistencyServiceImpl distroConsistencyService = 
            (DistroConsistencyServiceImpl) consistencyService;
        
        // 3. 注册实例(写入内存)
        distroConsistencyService.put(fullServiceName, instance);
        
        // 4. 广播到其他节点
        distroProtocol.sync(new DistroKey(fullServiceName, instance.getIp() + ":" + instance.getPort()), 
                           DataOperation.CHANGE);
    }
}`
`#// naming/src/main/java/com/alibaba/nacos/naming/core/InstanceController.java

@RestController
@RequestMapping("/v1/ns")
public class InstanceController {
    
    @CanDistro
    @PostMapping("/instance")
    public String register(HttpServletRequest request) throws Exception {
        // 1. 解析请求参数
        String serviceName = WebUtils.required(request, "serviceName");
        String ip = WebUtils.required(request, "ip");
        int port = Integer.parseInt(WebUtils.required(request, "port"));
        
        // 2. 构建 Instance 对象
        Instance instance = new Instance();
        instance.setIp(ip);
        instance.setPort(port);
        instance.setWeight(Double.parseDouble(WebUtils.optional(request, "weight", "1.0")));
        instance.setHealthy(true);
        instance.setEphemeral(true); // 临时实例
        
        // 3. 注册服务
        getInstanceOperator().registerInstance(serviceName, "DEFAULT_GROUP", instance);
        
        return "ok";
    }
}

// naming/src/main/java/com/alibaba/nacos/naming/core/InstanceOperatorServiceImpl.java

public class InstanceOperatorServiceImpl implements InstanceOperator {
    
    @Override
    public void registerInstance(String serviceName, String groupName, Instance instance) {
        // 1. 构建完整服务名
        String fullServiceName = groupName + Constants.SERVICE_INFO_SPLITER + serviceName;
        
        // 2. 写入 AP 存储(Distro 协议)
        DistroConsistencyServiceImpl distroConsistencyService = 
            (DistroConsistencyServiceImpl) consistencyService;
        
        // 3. 注册实例(写入内存)
        distroConsistencyService.put(fullServiceName, instance);
        
        // 4. 广播到其他节点
        distroProtocol.sync(new DistroKey(fullServiceName, instance.getIp() + ":" + instance.getPort()), 
                           DataOperation.CHANGE);
    }
}public class InstanceOperatorServiceImpl implements InstanceOperator {`
`#// naming/src/main/java/com/alibaba/nacos/naming/core/InstanceController.java

@RestController
@RequestMapping("/v1/ns")
public class InstanceController {
    
    @CanDistro
    @PostMapping("/instance")
    public String register(HttpServletRequest request) throws Exception {
        // 1. 解析请求参数
        String serviceName = WebUtils.required(request, "serviceName");
        String ip = WebUtils.required(request, "ip");
        int port = Integer.parseInt(WebUtils.required(request, "port"));
        
        // 2. 构建 Instance 对象
        Instance instance = new Instance();
        instance.setIp(ip);
        instance.setPort(port);
        instance.setWeight(Double.parseDouble(WebUtils.optional(request, "weight", "1.0")));
        instance.setHealthy(true);
        instance.setEphemeral(true); // 临时实例
        
        // 3. 注册服务
        getInstanceOperator().registerInstance(serviceName, "DEFAULT_GROUP", instance);
        
        return "ok";
    }
}

// naming/src/main/java/com/alibaba/nacos/naming/core/InstanceOperatorServiceImpl.java

public class InstanceOperatorServiceImpl implements InstanceOperator {
    
    @Override
    public void registerInstance(String serviceName, String groupName, Instance instance) {
        // 1. 构建完整服务名
        String fullServiceName = groupName + Constants.SERVICE_INFO_SPLITER + serviceName;
        
        // 2. 写入 AP 存储(Distro 协议)
        DistroConsistencyServiceImpl distroConsistencyService = 
            (DistroConsistencyServiceImpl) consistencyService;
        
        // 3. 注册实例(写入内存)
        distroConsistencyService.put(fullServiceName, instance);
        
        // 4. 广播到其他节点
        distroProtocol.sync(new DistroKey(fullServiceName, instance.getIp() + ":" + instance.getPort()), 
                           DataOperation.CHANGE);
    }
}    `
`#// naming/src/main/java/com/alibaba/nacos/naming/core/InstanceController.java

@RestController
@RequestMapping("/v1/ns")
public class InstanceController {
    
    @CanDistro
    @PostMapping("/instance")
    public String register(HttpServletRequest request) throws Exception {
        // 1. 解析请求参数
        String serviceName = WebUtils.required(request, "serviceName");
        String ip = WebUtils.required(request, "ip");
        int port = Integer.parseInt(WebUtils.required(request, "port"));
        
        // 2. 构建 Instance 对象
        Instance instance = new Instance();
        instance.setIp(ip);
        instance.setPort(port);
        instance.setWeight(Double.parseDouble(WebUtils.optional(request, "weight", "1.0")));
        instance.setHealthy(true);
        instance.setEphemeral(true); // 临时实例
        
        // 3. 注册服务
        getInstanceOperator().registerInstance(serviceName, "DEFAULT_GROUP", instance);
        
        return "ok";
    }
}

// naming/src/main/java/com/alibaba/nacos/naming/core/InstanceOperatorServiceImpl.java

public class InstanceOperatorServiceImpl implements InstanceOperator {
    
    @Override
    public void registerInstance(String serviceName, String groupName, Instance instance) {
        // 1. 构建完整服务名
        String fullServiceName = groupName + Constants.SERVICE_INFO_SPLITER + serviceName;
        
        // 2. 写入 AP 存储(Distro 协议)
        DistroConsistencyServiceImpl distroConsistencyService = 
            (DistroConsistencyServiceImpl) consistencyService;
        
        // 3. 注册实例(写入内存)
        distroConsistencyService.put(fullServiceName, instance);
        
        // 4. 广播到其他节点
        distroProtocol.sync(new DistroKey(fullServiceName, instance.getIp() + ":" + instance.getPort()), 
                           DataOperation.CHANGE);
    }
}    @Override`
`#// naming/src/main/java/com/alibaba/nacos/naming/core/InstanceController.java

@RestController
@RequestMapping("/v1/ns")
public class InstanceController {
    
    @CanDistro
    @PostMapping("/instance")
    public String register(HttpServletRequest request) throws Exception {
        // 1. 解析请求参数
        String serviceName = WebUtils.required(request, "serviceName");
        String ip = WebUtils.required(request, "ip");
        int port = Integer.parseInt(WebUtils.required(request, "port"));
        
        // 2. 构建 Instance 对象
        Instance instance = new Instance();
        instance.setIp(ip);
        instance.setPort(port);
        instance.setWeight(Double.parseDouble(WebUtils.optional(request, "weight", "1.0")));
        instance.setHealthy(true);
        instance.setEphemeral(true); // 临时实例
        
        // 3. 注册服务
        getInstanceOperator().registerInstance(serviceName, "DEFAULT_GROUP", instance);
        
        return "ok";
    }
}

// naming/src/main/java/com/alibaba/nacos/naming/core/InstanceOperatorServiceImpl.java

public class InstanceOperatorServiceImpl implements InstanceOperator {
    
    @Override
    public void registerInstance(String serviceName, String groupName, Instance instance) {
        // 1. 构建完整服务名
        String fullServiceName = groupName + Constants.SERVICE_INFO_SPLITER + serviceName;
        
        // 2. 写入 AP 存储(Distro 协议)
        DistroConsistencyServiceImpl distroConsistencyService = 
            (DistroConsistencyServiceImpl) consistencyService;
        
        // 3. 注册实例(写入内存)
        distroConsistencyService.put(fullServiceName, instance);
        
        // 4. 广播到其他节点
        distroProtocol.sync(new DistroKey(fullServiceName, instance.getIp() + ":" + instance.getPort()), 
                           DataOperation.CHANGE);
    }
}    public void registerInstance(String serviceName, String groupName, Instance instance) {`
`#// naming/src/main/java/com/alibaba/nacos/naming/core/InstanceController.java

@RestController
@RequestMapping("/v1/ns")
public class InstanceController {
    
    @CanDistro
    @PostMapping("/instance")
    public String register(HttpServletRequest request) throws Exception {
        // 1. 解析请求参数
        String serviceName = WebUtils.required(request, "serviceName");
        String ip = WebUtils.required(request, "ip");
        int port = Integer.parseInt(WebUtils.required(request, "port"));
        
        // 2. 构建 Instance 对象
        Instance instance = new Instance();
        instance.setIp(ip);
        instance.setPort(port);
        instance.setWeight(Double.parseDouble(WebUtils.optional(request, "weight", "1.0")));
        instance.setHealthy(true);
        instance.setEphemeral(true); // 临时实例
        
        // 3. 注册服务
        getInstanceOperator().registerInstance(serviceName, "DEFAULT_GROUP", instance);
        
        return "ok";
    }
}

// naming/src/main/java/com/alibaba/nacos/naming/core/InstanceOperatorServiceImpl.java

public class InstanceOperatorServiceImpl implements InstanceOperator {
    
    @Override
    public void registerInstance(String serviceName, String groupName, Instance instance) {
        // 1. 构建完整服务名
        String fullServiceName = groupName + Constants.SERVICE_INFO_SPLITER + serviceName;
        
        // 2. 写入 AP 存储(Distro 协议)
        DistroConsistencyServiceImpl distroConsistencyService = 
            (DistroConsistencyServiceImpl) consistencyService;
        
        // 3. 注册实例(写入内存)
        distroConsistencyService.put(fullServiceName, instance);
        
        // 4. 广播到其他节点
        distroProtocol.sync(new DistroKey(fullServiceName, instance.getIp() + ":" + instance.getPort()), 
                           DataOperation.CHANGE);
    }
}        // 1. 构建完整服务名`
`#// naming/src/main/java/com/alibaba/nacos/naming/core/InstanceController.java

@RestController
@RequestMapping("/v1/ns")
public class InstanceController {
    
    @CanDistro
    @PostMapping("/instance")
    public String register(HttpServletRequest request) throws Exception {
        // 1. 解析请求参数
        String serviceName = WebUtils.required(request, "serviceName");
        String ip = WebUtils.required(request, "ip");
        int port = Integer.parseInt(WebUtils.required(request, "port"));
        
        // 2. 构建 Instance 对象
        Instance instance = new Instance();
        instance.setIp(ip);
        instance.setPort(port);
        instance.setWeight(Double.parseDouble(WebUtils.optional(request, "weight", "1.0")));
        instance.setHealthy(true);
        instance.setEphemeral(true); // 临时实例
        
        // 3. 注册服务
        getInstanceOperator().registerInstance(serviceName, "DEFAULT_GROUP", instance);
        
        return "ok";
    }
}

// naming/src/main/java/com/alibaba/nacos/naming/core/InstanceOperatorServiceImpl.java

public class InstanceOperatorServiceImpl implements InstanceOperator {
    
    @Override
    public void registerInstance(String serviceName, String groupName, Instance instance) {
        // 1. 构建完整服务名
        String fullServiceName = groupName + Constants.SERVICE_INFO_SPLITER + serviceName;
        
        // 2. 写入 AP 存储(Distro 协议)
        DistroConsistencyServiceImpl distroConsistencyService = 
            (DistroConsistencyServiceImpl) consistencyService;
        
        // 3. 注册实例(写入内存)
        distroConsistencyService.put(fullServiceName, instance);
        
        // 4. 广播到其他节点
        distroProtocol.sync(new DistroKey(fullServiceName, instance.getIp() + ":" + instance.getPort()), 
                           DataOperation.CHANGE);
    }
}        String fullServiceName = groupName + Constants.SERVICE_INFO_SPLITER + serviceName;`
`#// naming/src/main/java/com/alibaba/nacos/naming/core/InstanceController.java

@RestController
@RequestMapping("/v1/ns")
public class InstanceController {
    
    @CanDistro
    @PostMapping("/instance")
    public String register(HttpServletRequest request) throws Exception {
        // 1. 解析请求参数
        String serviceName = WebUtils.required(request, "serviceName");
        String ip = WebUtils.required(request, "ip");
        int port = Integer.parseInt(WebUtils.required(request, "port"));
        
        // 2. 构建 Instance 对象
        Instance instance = new Instance();
        instance.setIp(ip);
        instance.setPort(port);
        instance.setWeight(Double.parseDouble(WebUtils.optional(request, "weight", "1.0")));
        instance.setHealthy(true);
        instance.setEphemeral(true); // 临时实例
        
        // 3. 注册服务
        getInstanceOperator().registerInstance(serviceName, "DEFAULT_GROUP", instance);
        
        return "ok";
    }
}

// naming/src/main/java/com/alibaba/nacos/naming/core/InstanceOperatorServiceImpl.java

public class InstanceOperatorServiceImpl implements InstanceOperator {
    
    @Override
    public void registerInstance(String serviceName, String groupName, Instance instance) {
        // 1. 构建完整服务名
        String fullServiceName = groupName + Constants.SERVICE_INFO_SPLITER + serviceName;
        
        // 2. 写入 AP 存储(Distro 协议)
        DistroConsistencyServiceImpl distroConsistencyService = 
            (DistroConsistencyServiceImpl) consistencyService;
        
        // 3. 注册实例(写入内存)
        distroConsistencyService.put(fullServiceName, instance);
        
        // 4. 广播到其他节点
        distroProtocol.sync(new DistroKey(fullServiceName, instance.getIp() + ":" + instance.getPort()), 
                           DataOperation.CHANGE);
    }
}        `
`#// naming/src/main/java/com/alibaba/nacos/naming/core/InstanceController.java

@RestController
@RequestMapping("/v1/ns")
public class InstanceController {
    
    @CanDistro
    @PostMapping("/instance")
    public String register(HttpServletRequest request) throws Exception {
        // 1. 解析请求参数
        String serviceName = WebUtils.required(request, "serviceName");
        String ip = WebUtils.required(request, "ip");
        int port = Integer.parseInt(WebUtils.required(request, "port"));
        
        // 2. 构建 Instance 对象
        Instance instance = new Instance();
        instance.setIp(ip);
        instance.setPort(port);
        instance.setWeight(Double.parseDouble(WebUtils.optional(request, "weight", "1.0")));
        instance.setHealthy(true);
        instance.setEphemeral(true); // 临时实例
        
        // 3. 注册服务
        getInstanceOperator().registerInstance(serviceName, "DEFAULT_GROUP", instance);
        
        return "ok";
    }
}

// naming/src/main/java/com/alibaba/nacos/naming/core/InstanceOperatorServiceImpl.java

public class InstanceOperatorServiceImpl implements InstanceOperator {
    
    @Override
    public void registerInstance(String serviceName, String groupName, Instance instance) {
        // 1. 构建完整服务名
        String fullServiceName = groupName + Constants.SERVICE_INFO_SPLITER + serviceName;
        
        // 2. 写入 AP 存储(Distro 协议)
        DistroConsistencyServiceImpl distroConsistencyService = 
            (DistroConsistencyServiceImpl) consistencyService;
        
        // 3. 注册实例(写入内存)
        distroConsistencyService.put(fullServiceName, instance);
        
        // 4. 广播到其他节点
        distroProtocol.sync(new DistroKey(fullServiceName, instance.getIp() + ":" + instance.getPort()), 
                           DataOperation.CHANGE);
    }
}        // 2. 写入 AP 存储(Distro 协议)`
`#// naming/src/main/java/com/alibaba/nacos/naming/core/InstanceController.java

@RestController
@RequestMapping("/v1/ns")
public class InstanceController {
    
    @CanDistro
    @PostMapping("/instance")
    public String register(HttpServletRequest request) throws Exception {
        // 1. 解析请求参数
        String serviceName = WebUtils.required(request, "serviceName");
        String ip = WebUtils.required(request, "ip");
        int port = Integer.parseInt(WebUtils.required(request, "port"));
        
        // 2. 构建 Instance 对象
        Instance instance = new Instance();
        instance.setIp(ip);
        instance.setPort(port);
        instance.setWeight(Double.parseDouble(WebUtils.optional(request, "weight", "1.0")));
        instance.setHealthy(true);
        instance.setEphemeral(true); // 临时实例
        
        // 3. 注册服务
        getInstanceOperator().registerInstance(serviceName, "DEFAULT_GROUP", instance);
        
        return "ok";
    }
}

// naming/src/main/java/com/alibaba/nacos/naming/core/InstanceOperatorServiceImpl.java

public class InstanceOperatorServiceImpl implements InstanceOperator {
    
    @Override
    public void registerInstance(String serviceName, String groupName, Instance instance) {
        // 1. 构建完整服务名
        String fullServiceName = groupName + Constants.SERVICE_INFO_SPLITER + serviceName;
        
        // 2. 写入 AP 存储(Distro 协议)
        DistroConsistencyServiceImpl distroConsistencyService = 
            (DistroConsistencyServiceImpl) consistencyService;
        
        // 3. 注册实例(写入内存)
        distroConsistencyService.put(fullServiceName, instance);
        
        // 4. 广播到其他节点
        distroProtocol.sync(new DistroKey(fullServiceName, instance.getIp() + ":" + instance.getPort()), 
                           DataOperation.CHANGE);
    }
}        DistroConsistencyServiceImpl distroConsistencyService = `
`#// naming/src/main/java/com/alibaba/nacos/naming/core/InstanceController.java

@RestController
@RequestMapping("/v1/ns")
public class InstanceController {
    
    @CanDistro
    @PostMapping("/instance")
    public String register(HttpServletRequest request) throws Exception {
        // 1. 解析请求参数
        String serviceName = WebUtils.required(request, "serviceName");
        String ip = WebUtils.required(request, "ip");
        int port = Integer.parseInt(WebUtils.required(request, "port"));
        
        // 2. 构建 Instance 对象
        Instance instance = new Instance();
        instance.setIp(ip);
        instance.setPort(port);
        instance.setWeight(Double.parseDouble(WebUtils.optional(request, "weight", "1.0")));
        instance.setHealthy(true);
        instance.setEphemeral(true); // 临时实例
        
        // 3. 注册服务
        getInstanceOperator().registerInstance(serviceName, "DEFAULT_GROUP", instance);
        
        return "ok";
    }
}

// naming/src/main/java/com/alibaba/nacos/naming/core/InstanceOperatorServiceImpl.java

public class InstanceOperatorServiceImpl implements InstanceOperator {
    
    @Override
    public void registerInstance(String serviceName, String groupName, Instance instance) {
        // 1. 构建完整服务名
        String fullServiceName = groupName + Constants.SERVICE_INFO_SPLITER + serviceName;
        
        // 2. 写入 AP 存储(Distro 协议)
        DistroConsistencyServiceImpl distroConsistencyService = 
            (DistroConsistencyServiceImpl) consistencyService;
        
        // 3. 注册实例(写入内存)
        distroConsistencyService.put(fullServiceName, instance);
        
        // 4. 广播到其他节点
        distroProtocol.sync(new DistroKey(fullServiceName, instance.getIp() + ":" + instance.getPort()), 
                           DataOperation.CHANGE);
    }
}            (DistroConsistencyServiceImpl) consistencyService;`
`#// naming/src/main/java/com/alibaba/nacos/naming/core/InstanceController.java

@RestController
@RequestMapping("/v1/ns")
public class InstanceController {
    
    @CanDistro
    @PostMapping("/instance")
    public String register(HttpServletRequest request) throws Exception {
        // 1. 解析请求参数
        String serviceName = WebUtils.required(request, "serviceName");
        String ip = WebUtils.required(request, "ip");
        int port = Integer.parseInt(WebUtils.required(request, "port"));
        
        // 2. 构建 Instance 对象
        Instance instance = new Instance();
        instance.setIp(ip);
        instance.setPort(port);
        instance.setWeight(Double.parseDouble(WebUtils.optional(request, "weight", "1.0")));
        instance.setHealthy(true);
        instance.setEphemeral(true); // 临时实例
        
        // 3. 注册服务
        getInstanceOperator().registerInstance(serviceName, "DEFAULT_GROUP", instance);
        
        return "ok";
    }
}

// naming/src/main/java/com/alibaba/nacos/naming/core/InstanceOperatorServiceImpl.java

public class InstanceOperatorServiceImpl implements InstanceOperator {
    
    @Override
    public void registerInstance(String serviceName, String groupName, Instance instance) {
        // 1. 构建完整服务名
        String fullServiceName = groupName + Constants.SERVICE_INFO_SPLITER + serviceName;
        
        // 2. 写入 AP 存储(Distro 协议)
        DistroConsistencyServiceImpl distroConsistencyService = 
            (DistroConsistencyServiceImpl) consistencyService;
        
        // 3. 注册实例(写入内存)
        distroConsistencyService.put(fullServiceName, instance);
        
        // 4. 广播到其他节点
        distroProtocol.sync(new DistroKey(fullServiceName, instance.getIp() + ":" + instance.getPort()), 
                           DataOperation.CHANGE);
    }
}        `
`#// naming/src/main/java/com/alibaba/nacos/naming/core/InstanceController.java

@RestController
@RequestMapping("/v1/ns")
public class InstanceController {
    
    @CanDistro
    @PostMapping("/instance")
    public String register(HttpServletRequest request) throws Exception {
        // 1. 解析请求参数
        String serviceName = WebUtils.required(request, "serviceName");
        String ip = WebUtils.required(request, "ip");
        int port = Integer.parseInt(WebUtils.required(request, "port"));
        
        // 2. 构建 Instance 对象
        Instance instance = new Instance();
        instance.setIp(ip);
        instance.setPort(port);
        instance.setWeight(Double.parseDouble(WebUtils.optional(request, "weight", "1.0")));
        instance.setHealthy(true);
        instance.setEphemeral(true); // 临时实例
        
        // 3. 注册服务
        getInstanceOperator().registerInstance(serviceName, "DEFAULT_GROUP", instance);
        
        return "ok";
    }
}

// naming/src/main/java/com/alibaba/nacos/naming/core/InstanceOperatorServiceImpl.java

public class InstanceOperatorServiceImpl implements InstanceOperator {
    
    @Override
    public void registerInstance(String serviceName, String groupName, Instance instance) {
        // 1. 构建完整服务名
        String fullServiceName = groupName + Constants.SERVICE_INFO_SPLITER + serviceName;
        
        // 2. 写入 AP 存储(Distro 协议)
        DistroConsistencyServiceImpl distroConsistencyService = 
            (DistroConsistencyServiceImpl) consistencyService;
        
        // 3. 注册实例(写入内存)
        distroConsistencyService.put(fullServiceName, instance);
        
        // 4. 广播到其他节点
        distroProtocol.sync(new DistroKey(fullServiceName, instance.getIp() + ":" + instance.getPort()), 
                           DataOperation.CHANGE);
    }
}        // 3. 注册实例(写入内存)`
`#// naming/src/main/java/com/alibaba/nacos/naming/core/InstanceController.java

@RestController
@RequestMapping("/v1/ns")
public class InstanceController {
    
    @CanDistro
    @PostMapping("/instance")
    public String register(HttpServletRequest request) throws Exception {
        // 1. 解析请求参数
        String serviceName = WebUtils.required(request, "serviceName");
        String ip = WebUtils.required(request, "ip");
        int port = Integer.parseInt(WebUtils.required(request, "port"));
        
        // 2. 构建 Instance 对象
        Instance instance = new Instance();
        instance.setIp(ip);
        instance.setPort(port);
        instance.setWeight(Double.parseDouble(WebUtils.optional(request, "weight", "1.0")));
        instance.setHealthy(true);
        instance.setEphemeral(true); // 临时实例
        
        // 3. 注册服务
        getInstanceOperator().registerInstance(serviceName, "DEFAULT_GROUP", instance);
        
        return "ok";
    }
}

// naming/src/main/java/com/alibaba/nacos/naming/core/InstanceOperatorServiceImpl.java

public class InstanceOperatorServiceImpl implements InstanceOperator {
    
    @Override
    public void registerInstance(String serviceName, String groupName, Instance instance) {
        // 1. 构建完整服务名
        String fullServiceName = groupName + Constants.SERVICE_INFO_SPLITER + serviceName;
        
        // 2. 写入 AP 存储(Distro 协议)
        DistroConsistencyServiceImpl distroConsistencyService = 
            (DistroConsistencyServiceImpl) consistencyService;
        
        // 3. 注册实例(写入内存)
        distroConsistencyService.put(fullServiceName, instance);
        
        // 4. 广播到其他节点
        distroProtocol.sync(new DistroKey(fullServiceName, instance.getIp() + ":" + instance.getPort()), 
                           DataOperation.CHANGE);
    }
}        distroConsistencyService.put(fullServiceName, instance);`
`#// naming/src/main/java/com/alibaba/nacos/naming/core/InstanceController.java

@RestController
@RequestMapping("/v1/ns")
public class InstanceController {
    
    @CanDistro
    @PostMapping("/instance")
    public String register(HttpServletRequest request) throws Exception {
        // 1. 解析请求参数
        String serviceName = WebUtils.required(request, "serviceName");
        String ip = WebUtils.required(request, "ip");
        int port = Integer.parseInt(WebUtils.required(request, "port"));
        
        // 2. 构建 Instance 对象
        Instance instance = new Instance();
        instance.setIp(ip);
        instance.setPort(port);
        instance.setWeight(Double.parseDouble(WebUtils.optional(request, "weight", "1.0")));
        instance.setHealthy(true);
        instance.setEphemeral(true); // 临时实例
        
        // 3. 注册服务
        getInstanceOperator().registerInstance(serviceName, "DEFAULT_GROUP", instance);
        
        return "ok";
    }
}

// naming/src/main/java/com/alibaba/nacos/naming/core/InstanceOperatorServiceImpl.java

public class InstanceOperatorServiceImpl implements InstanceOperator {
    
    @Override
    public void registerInstance(String serviceName, String groupName, Instance instance) {
        // 1. 构建完整服务名
        String fullServiceName = groupName + Constants.SERVICE_INFO_SPLITER + serviceName;
        
        // 2. 写入 AP 存储(Distro 协议)
        DistroConsistencyServiceImpl distroConsistencyService = 
            (DistroConsistencyServiceImpl) consistencyService;
        
        // 3. 注册实例(写入内存)
        distroConsistencyService.put(fullServiceName, instance);
        
        // 4. 广播到其他节点
        distroProtocol.sync(new DistroKey(fullServiceName, instance.getIp() + ":" + instance.getPort()), 
                           DataOperation.CHANGE);
    }
}        `
`#// naming/src/main/java/com/alibaba/nacos/naming/core/InstanceController.java

@RestController
@RequestMapping("/v1/ns")
public class InstanceController {
    
    @CanDistro
    @PostMapping("/instance")
    public String register(HttpServletRequest request) throws Exception {
        // 1. 解析请求参数
        String serviceName = WebUtils.required(request, "serviceName");
        String ip = WebUtils.required(request, "ip");
        int port = Integer.parseInt(WebUtils.required(request, "port"));
        
        // 2. 构建 Instance 对象
        Instance instance = new Instance();
        instance.setIp(ip);
        instance.setPort(port);
        instance.setWeight(Double.parseDouble(WebUtils.optional(request, "weight", "1.0")));
        instance.setHealthy(true);
        instance.setEphemeral(true); // 临时实例
        
        // 3. 注册服务
        getInstanceOperator().registerInstance(serviceName, "DEFAULT_GROUP", instance);
        
        return "ok";
    }
}

// naming/src/main/java/com/alibaba/nacos/naming/core/InstanceOperatorServiceImpl.java

public class InstanceOperatorServiceImpl implements InstanceOperator {
    
    @Override
    public void registerInstance(String serviceName, String groupName, Instance instance) {
        // 1. 构建完整服务名
        String fullServiceName = groupName + Constants.SERVICE_INFO_SPLITER + serviceName;
        
        // 2. 写入 AP 存储(Distro 协议)
        DistroConsistencyServiceImpl distroConsistencyService = 
            (DistroConsistencyServiceImpl) consistencyService;
        
        // 3. 注册实例(写入内存)
        distroConsistencyService.put(fullServiceName, instance);
        
        // 4. 广播到其他节点
        distroProtocol.sync(new DistroKey(fullServiceName, instance.getIp() + ":" + instance.getPort()), 
                           DataOperation.CHANGE);
    }
}        // 4. 广播到其他节点`
`#// naming/src/main/java/com/alibaba/nacos/naming/core/InstanceController.java

@RestController
@RequestMapping("/v1/ns")
public class InstanceController {
    
    @CanDistro
    @PostMapping("/instance")
    public String register(HttpServletRequest request) throws Exception {
        // 1. 解析请求参数
        String serviceName = WebUtils.required(request, "serviceName");
        String ip = WebUtils.required(request, "ip");
        int port = Integer.parseInt(WebUtils.required(request, "port"));
        
        // 2. 构建 Instance 对象
        Instance instance = new Instance();
        instance.setIp(ip);
        instance.setPort(port);
        instance.setWeight(Double.parseDouble(WebUtils.optional(request, "weight", "1.0")));
        instance.setHealthy(true);
        instance.setEphemeral(true); // 临时实例
        
        // 3. 注册服务
        getInstanceOperator().registerInstance(serviceName, "DEFAULT_GROUP", instance);
        
        return "ok";
    }
}

// naming/src/main/java/com/alibaba/nacos/naming/core/InstanceOperatorServiceImpl.java

public class InstanceOperatorServiceImpl implements InstanceOperator {
    
    @Override
    public void registerInstance(String serviceName, String groupName, Instance instance) {
        // 1. 构建完整服务名
        String fullServiceName = groupName + Constants.SERVICE_INFO_SPLITER + serviceName;
        
        // 2. 写入 AP 存储(Distro 协议)
        DistroConsistencyServiceImpl distroConsistencyService = 
            (DistroConsistencyServiceImpl) consistencyService;
        
        // 3. 注册实例(写入内存)
        distroConsistencyService.put(fullServiceName, instance);
        
        // 4. 广播到其他节点
        distroProtocol.sync(new DistroKey(fullServiceName, instance.getIp() + ":" + instance.getPort()), 
                           DataOperation.CHANGE);
    }
}        distroProtocol.sync(new DistroKey(fullServiceName, instance.getIp() + ":" + instance.getPort()), `
`#// naming/src/main/java/com/alibaba/nacos/naming/core/InstanceController.java

@RestController
@RequestMapping("/v1/ns")
public class InstanceController {
    
    @CanDistro
    @PostMapping("/instance")
    public String register(HttpServletRequest request) throws Exception {
        // 1. 解析请求参数
        String serviceName = WebUtils.required(request, "serviceName");
        String ip = WebUtils.required(request, "ip");
        int port = Integer.parseInt(WebUtils.required(request, "port"));
        
        // 2. 构建 Instance 对象
        Instance instance = new Instance();
        instance.setIp(ip);
        instance.setPort(port);
        instance.setWeight(Double.parseDouble(WebUtils.optional(request, "weight", "1.0")));
        instance.setHealthy(true);
        instance.setEphemeral(true); // 临时实例
        
        // 3. 注册服务
        getInstanceOperator().registerInstance(serviceName, "DEFAULT_GROUP", instance);
        
        return "ok";
    }
}

// naming/src/main/java/com/alibaba/nacos/naming/core/InstanceOperatorServiceImpl.java

public class InstanceOperatorServiceImpl implements InstanceOperator {
    
    @Override
    public void registerInstance(String serviceName, String groupName, Instance instance) {
        // 1. 构建完整服务名
        String fullServiceName = groupName + Constants.SERVICE_INFO_SPLITER + serviceName;
        
        // 2. 写入 AP 存储(Distro 协议)
        DistroConsistencyServiceImpl distroConsistencyService = 
            (DistroConsistencyServiceImpl) consistencyService;
        
        // 3. 注册实例(写入内存)
        distroConsistencyService.put(fullServiceName, instance);
        
        // 4. 广播到其他节点
        distroProtocol.sync(new DistroKey(fullServiceName, instance.getIp() + ":" + instance.getPort()), 
                           DataOperation.CHANGE);
    }
}                           DataOperation.CHANGE);`
`#// naming/src/main/java/com/alibaba/nacos/naming/core/InstanceController.java

@RestController
@RequestMapping("/v1/ns")
public class InstanceController {
    
    @CanDistro
    @PostMapping("/instance")
    public String register(HttpServletRequest request) throws Exception {
        // 1. 解析请求参数
        String serviceName = WebUtils.required(request, "serviceName");
        String ip = WebUtils.required(request, "ip");
        int port = Integer.parseInt(WebUtils.required(request, "port"));
        
        // 2. 构建 Instance 对象
        Instance instance = new Instance();
        instance.setIp(ip);
        instance.setPort(port);
        instance.setWeight(Double.parseDouble(WebUtils.optional(request, "weight", "1.0")));
        instance.setHealthy(true);
        instance.setEphemeral(true); // 临时实例
        
        // 3. 注册服务
        getInstanceOperator().registerInstance(serviceName, "DEFAULT_GROUP", instance);
        
        return "ok";
    }
}

// naming/src/main/java/com/alibaba/nacos/naming/core/InstanceOperatorServiceImpl.java

public class InstanceOperatorServiceImpl implements InstanceOperator {
    
    @Override
    public void registerInstance(String serviceName, String groupName, Instance instance) {
        // 1. 构建完整服务名
        String fullServiceName = groupName + Constants.SERVICE_INFO_SPLITER + serviceName;
        
        // 2. 写入 AP 存储(Distro 协议)
        DistroConsistencyServiceImpl distroConsistencyService = 
            (DistroConsistencyServiceImpl) consistencyService;
        
        // 3. 注册实例(写入内存)
        distroConsistencyService.put(fullServiceName, instance);
        
        // 4. 广播到其他节点
        distroProtocol.sync(new DistroKey(fullServiceName, instance.getIp() + ":" + instance.getPort()), 
                           DataOperation.CHANGE);
    }
}    }`
`#// naming/src/main/java/com/alibaba/nacos/naming/core/InstanceController.java

@RestController
@RequestMapping("/v1/ns")
public class InstanceController {
    
    @CanDistro
    @PostMapping("/instance")
    public String register(HttpServletRequest request) throws Exception {
        // 1. 解析请求参数
        String serviceName = WebUtils.required(request, "serviceName");
        String ip = WebUtils.required(request, "ip");
        int port = Integer.parseInt(WebUtils.required(request, "port"));
        
        // 2. 构建 Instance 对象
        Instance instance = new Instance();
        instance.setIp(ip);
        instance.setPort(port);
        instance.setWeight(Double.parseDouble(WebUtils.optional(request, "weight", "1.0")));
        instance.setHealthy(true);
        instance.setEphemeral(true); // 临时实例
        
        // 3. 注册服务
        getInstanceOperator().registerInstance(serviceName, "DEFAULT_GROUP", instance);
        
        return "ok";
    }
}

// naming/src/main/java/com/alibaba/nacos/naming/core/InstanceOperatorServiceImpl.java

public class InstanceOperatorServiceImpl implements InstanceOperator {
    
    @Override
    public void registerInstance(String serviceName, String groupName, Instance instance) {
        // 1. 构建完整服务名
        String fullServiceName = groupName + Constants.SERVICE_INFO_SPLITER + serviceName;
        
        // 2. 写入 AP 存储(Distro 协议)
        DistroConsistencyServiceImpl distroConsistencyService = 
            (DistroConsistencyServiceImpl) consistencyService;
        
        // 3. 注册实例(写入内存)
        distroConsistencyService.put(fullServiceName, instance);
        
        // 4. 广播到其他节点
        distroProtocol.sync(new DistroKey(fullServiceName, instance.getIp() + ":" + instance.getPort()), 
                           DataOperation.CHANGE);
    }
}}

3.2 Distro 数据存储

源码位置naming/src/main/java/com/alibaba/nacos/naming/consistency/distro/

java 复制代码
#// naming/src/main/java/com/alibaba/nacos/naming/consistency/distro/DistroConsistencyServiceImpl.java

public class DistroConsistencyServiceImpl implements ConsistencyService {
    
    // 本地数据存储(内存)
    private final ConcurrentHashMap<String, Datum> dataStore = new ConcurrentHashMap<>(1024);
    
    // 监听器集合
    private final ConcurrentHashMap<String, RecordListener> listeners = new ConcurrentHashMap<>(1024);
    
    @Override
    public void put(String key, Record value) throws NacosException {
        // 1. 构建 Datum(带时间戳的数据)
        Datum datum = new Datum();
        datum.key = key;
        datum.value = value;
        datum.timestamp = System.currentTimeMillis(); // 关键:时间戳用于版本控制
        
        // 2. 写入本地内存
        dataStore.put(key, datum);
        
        // 3. 通知监听器(触发推送到客户端)
        notifyListener(key, DataOperation.CHANGE);
        
        // 4. 广播到其他节点
        distroProtocol.sync(new DistroKey(key, value), DataOperation.CHANGE);
    }
    
    @Override
    public Datum get(String key) {
        // 从本地内存读取
        return dataStore.get(key);
    }
    
    @Override
    public void remove(String key) {
        // 1. 从本地内存删除
        dataStore.remove(key);
        
        // 2. 广播删除操作到其他节点
        distroProtocol.sync(new DistroKey(key, null), DataOperation.DELETE);
        
        // 3. 通知监听器
        notifyListener(key, DataOperation.DELETE);
    }
}// naming/src/main/java/com/alibaba/nacos/naming/consistency/distro/DistroConsistencyServiceImpl.java`
`#// naming/src/main/java/com/alibaba/nacos/naming/consistency/distro/DistroConsistencyServiceImpl.java

public class DistroConsistencyServiceImpl implements ConsistencyService {
    
    // 本地数据存储(内存)
    private final ConcurrentHashMap<String, Datum> dataStore = new ConcurrentHashMap<>(1024);
    
    // 监听器集合
    private final ConcurrentHashMap<String, RecordListener> listeners = new ConcurrentHashMap<>(1024);
    
    @Override
    public void put(String key, Record value) throws NacosException {
        // 1. 构建 Datum(带时间戳的数据)
        Datum datum = new Datum();
        datum.key = key;
        datum.value = value;
        datum.timestamp = System.currentTimeMillis(); // 关键:时间戳用于版本控制
        
        // 2. 写入本地内存
        dataStore.put(key, datum);
        
        // 3. 通知监听器(触发推送到客户端)
        notifyListener(key, DataOperation.CHANGE);
        
        // 4. 广播到其他节点
        distroProtocol.sync(new DistroKey(key, value), DataOperation.CHANGE);
    }
    
    @Override
    public Datum get(String key) {
        // 从本地内存读取
        return dataStore.get(key);
    }
    
    @Override
    public void remove(String key) {
        // 1. 从本地内存删除
        dataStore.remove(key);
        
        // 2. 广播删除操作到其他节点
        distroProtocol.sync(new DistroKey(key, null), DataOperation.DELETE);
        
        // 3. 通知监听器
        notifyListener(key, DataOperation.DELETE);
    }
}`
`#// naming/src/main/java/com/alibaba/nacos/naming/consistency/distro/DistroConsistencyServiceImpl.java

public class DistroConsistencyServiceImpl implements ConsistencyService {
    
    // 本地数据存储(内存)
    private final ConcurrentHashMap<String, Datum> dataStore = new ConcurrentHashMap<>(1024);
    
    // 监听器集合
    private final ConcurrentHashMap<String, RecordListener> listeners = new ConcurrentHashMap<>(1024);
    
    @Override
    public void put(String key, Record value) throws NacosException {
        // 1. 构建 Datum(带时间戳的数据)
        Datum datum = new Datum();
        datum.key = key;
        datum.value = value;
        datum.timestamp = System.currentTimeMillis(); // 关键:时间戳用于版本控制
        
        // 2. 写入本地内存
        dataStore.put(key, datum);
        
        // 3. 通知监听器(触发推送到客户端)
        notifyListener(key, DataOperation.CHANGE);
        
        // 4. 广播到其他节点
        distroProtocol.sync(new DistroKey(key, value), DataOperation.CHANGE);
    }
    
    @Override
    public Datum get(String key) {
        // 从本地内存读取
        return dataStore.get(key);
    }
    
    @Override
    public void remove(String key) {
        // 1. 从本地内存删除
        dataStore.remove(key);
        
        // 2. 广播删除操作到其他节点
        distroProtocol.sync(new DistroKey(key, null), DataOperation.DELETE);
        
        // 3. 通知监听器
        notifyListener(key, DataOperation.DELETE);
    }
}public class DistroConsistencyServiceImpl implements ConsistencyService {`
`#// naming/src/main/java/com/alibaba/nacos/naming/consistency/distro/DistroConsistencyServiceImpl.java

public class DistroConsistencyServiceImpl implements ConsistencyService {
    
    // 本地数据存储(内存)
    private final ConcurrentHashMap<String, Datum> dataStore = new ConcurrentHashMap<>(1024);
    
    // 监听器集合
    private final ConcurrentHashMap<String, RecordListener> listeners = new ConcurrentHashMap<>(1024);
    
    @Override
    public void put(String key, Record value) throws NacosException {
        // 1. 构建 Datum(带时间戳的数据)
        Datum datum = new Datum();
        datum.key = key;
        datum.value = value;
        datum.timestamp = System.currentTimeMillis(); // 关键:时间戳用于版本控制
        
        // 2. 写入本地内存
        dataStore.put(key, datum);
        
        // 3. 通知监听器(触发推送到客户端)
        notifyListener(key, DataOperation.CHANGE);
        
        // 4. 广播到其他节点
        distroProtocol.sync(new DistroKey(key, value), DataOperation.CHANGE);
    }
    
    @Override
    public Datum get(String key) {
        // 从本地内存读取
        return dataStore.get(key);
    }
    
    @Override
    public void remove(String key) {
        // 1. 从本地内存删除
        dataStore.remove(key);
        
        // 2. 广播删除操作到其他节点
        distroProtocol.sync(new DistroKey(key, null), DataOperation.DELETE);
        
        // 3. 通知监听器
        notifyListener(key, DataOperation.DELETE);
    }
}    `
`#// naming/src/main/java/com/alibaba/nacos/naming/consistency/distro/DistroConsistencyServiceImpl.java

public class DistroConsistencyServiceImpl implements ConsistencyService {
    
    // 本地数据存储(内存)
    private final ConcurrentHashMap<String, Datum> dataStore = new ConcurrentHashMap<>(1024);
    
    // 监听器集合
    private final ConcurrentHashMap<String, RecordListener> listeners = new ConcurrentHashMap<>(1024);
    
    @Override
    public void put(String key, Record value) throws NacosException {
        // 1. 构建 Datum(带时间戳的数据)
        Datum datum = new Datum();
        datum.key = key;
        datum.value = value;
        datum.timestamp = System.currentTimeMillis(); // 关键:时间戳用于版本控制
        
        // 2. 写入本地内存
        dataStore.put(key, datum);
        
        // 3. 通知监听器(触发推送到客户端)
        notifyListener(key, DataOperation.CHANGE);
        
        // 4. 广播到其他节点
        distroProtocol.sync(new DistroKey(key, value), DataOperation.CHANGE);
    }
    
    @Override
    public Datum get(String key) {
        // 从本地内存读取
        return dataStore.get(key);
    }
    
    @Override
    public void remove(String key) {
        // 1. 从本地内存删除
        dataStore.remove(key);
        
        // 2. 广播删除操作到其他节点
        distroProtocol.sync(new DistroKey(key, null), DataOperation.DELETE);
        
        // 3. 通知监听器
        notifyListener(key, DataOperation.DELETE);
    }
}    // 本地数据存储(内存)`
`#// naming/src/main/java/com/alibaba/nacos/naming/consistency/distro/DistroConsistencyServiceImpl.java

public class DistroConsistencyServiceImpl implements ConsistencyService {
    
    // 本地数据存储(内存)
    private final ConcurrentHashMap<String, Datum> dataStore = new ConcurrentHashMap<>(1024);
    
    // 监听器集合
    private final ConcurrentHashMap<String, RecordListener> listeners = new ConcurrentHashMap<>(1024);
    
    @Override
    public void put(String key, Record value) throws NacosException {
        // 1. 构建 Datum(带时间戳的数据)
        Datum datum = new Datum();
        datum.key = key;
        datum.value = value;
        datum.timestamp = System.currentTimeMillis(); // 关键:时间戳用于版本控制
        
        // 2. 写入本地内存
        dataStore.put(key, datum);
        
        // 3. 通知监听器(触发推送到客户端)
        notifyListener(key, DataOperation.CHANGE);
        
        // 4. 广播到其他节点
        distroProtocol.sync(new DistroKey(key, value), DataOperation.CHANGE);
    }
    
    @Override
    public Datum get(String key) {
        // 从本地内存读取
        return dataStore.get(key);
    }
    
    @Override
    public void remove(String key) {
        // 1. 从本地内存删除
        dataStore.remove(key);
        
        // 2. 广播删除操作到其他节点
        distroProtocol.sync(new DistroKey(key, null), DataOperation.DELETE);
        
        // 3. 通知监听器
        notifyListener(key, DataOperation.DELETE);
    }
}    private final ConcurrentHashMap<String, Datum> dataStore = new ConcurrentHashMap<>(1024);`
`#// naming/src/main/java/com/alibaba/nacos/naming/consistency/distro/DistroConsistencyServiceImpl.java

public class DistroConsistencyServiceImpl implements ConsistencyService {
    
    // 本地数据存储(内存)
    private final ConcurrentHashMap<String, Datum> dataStore = new ConcurrentHashMap<>(1024);
    
    // 监听器集合
    private final ConcurrentHashMap<String, RecordListener> listeners = new ConcurrentHashMap<>(1024);
    
    @Override
    public void put(String key, Record value) throws NacosException {
        // 1. 构建 Datum(带时间戳的数据)
        Datum datum = new Datum();
        datum.key = key;
        datum.value = value;
        datum.timestamp = System.currentTimeMillis(); // 关键:时间戳用于版本控制
        
        // 2. 写入本地内存
        dataStore.put(key, datum);
        
        // 3. 通知监听器(触发推送到客户端)
        notifyListener(key, DataOperation.CHANGE);
        
        // 4. 广播到其他节点
        distroProtocol.sync(new DistroKey(key, value), DataOperation.CHANGE);
    }
    
    @Override
    public Datum get(String key) {
        // 从本地内存读取
        return dataStore.get(key);
    }
    
    @Override
    public void remove(String key) {
        // 1. 从本地内存删除
        dataStore.remove(key);
        
        // 2. 广播删除操作到其他节点
        distroProtocol.sync(new DistroKey(key, null), DataOperation.DELETE);
        
        // 3. 通知监听器
        notifyListener(key, DataOperation.DELETE);
    }
}    `
`#// naming/src/main/java/com/alibaba/nacos/naming/consistency/distro/DistroConsistencyServiceImpl.java

public class DistroConsistencyServiceImpl implements ConsistencyService {
    
    // 本地数据存储(内存)
    private final ConcurrentHashMap<String, Datum> dataStore = new ConcurrentHashMap<>(1024);
    
    // 监听器集合
    private final ConcurrentHashMap<String, RecordListener> listeners = new ConcurrentHashMap<>(1024);
    
    @Override
    public void put(String key, Record value) throws NacosException {
        // 1. 构建 Datum(带时间戳的数据)
        Datum datum = new Datum();
        datum.key = key;
        datum.value = value;
        datum.timestamp = System.currentTimeMillis(); // 关键:时间戳用于版本控制
        
        // 2. 写入本地内存
        dataStore.put(key, datum);
        
        // 3. 通知监听器(触发推送到客户端)
        notifyListener(key, DataOperation.CHANGE);
        
        // 4. 广播到其他节点
        distroProtocol.sync(new DistroKey(key, value), DataOperation.CHANGE);
    }
    
    @Override
    public Datum get(String key) {
        // 从本地内存读取
        return dataStore.get(key);
    }
    
    @Override
    public void remove(String key) {
        // 1. 从本地内存删除
        dataStore.remove(key);
        
        // 2. 广播删除操作到其他节点
        distroProtocol.sync(new DistroKey(key, null), DataOperation.DELETE);
        
        // 3. 通知监听器
        notifyListener(key, DataOperation.DELETE);
    }
}    // 监听器集合`
`#// naming/src/main/java/com/alibaba/nacos/naming/consistency/distro/DistroConsistencyServiceImpl.java

public class DistroConsistencyServiceImpl implements ConsistencyService {
    
    // 本地数据存储(内存)
    private final ConcurrentHashMap<String, Datum> dataStore = new ConcurrentHashMap<>(1024);
    
    // 监听器集合
    private final ConcurrentHashMap<String, RecordListener> listeners = new ConcurrentHashMap<>(1024);
    
    @Override
    public void put(String key, Record value) throws NacosException {
        // 1. 构建 Datum(带时间戳的数据)
        Datum datum = new Datum();
        datum.key = key;
        datum.value = value;
        datum.timestamp = System.currentTimeMillis(); // 关键:时间戳用于版本控制
        
        // 2. 写入本地内存
        dataStore.put(key, datum);
        
        // 3. 通知监听器(触发推送到客户端)
        notifyListener(key, DataOperation.CHANGE);
        
        // 4. 广播到其他节点
        distroProtocol.sync(new DistroKey(key, value), DataOperation.CHANGE);
    }
    
    @Override
    public Datum get(String key) {
        // 从本地内存读取
        return dataStore.get(key);
    }
    
    @Override
    public void remove(String key) {
        // 1. 从本地内存删除
        dataStore.remove(key);
        
        // 2. 广播删除操作到其他节点
        distroProtocol.sync(new DistroKey(key, null), DataOperation.DELETE);
        
        // 3. 通知监听器
        notifyListener(key, DataOperation.DELETE);
    }
}    private final ConcurrentHashMap<String, RecordListener> listeners = new ConcurrentHashMap<>(1024);`
`#// naming/src/main/java/com/alibaba/nacos/naming/consistency/distro/DistroConsistencyServiceImpl.java

public class DistroConsistencyServiceImpl implements ConsistencyService {
    
    // 本地数据存储(内存)
    private final ConcurrentHashMap<String, Datum> dataStore = new ConcurrentHashMap<>(1024);
    
    // 监听器集合
    private final ConcurrentHashMap<String, RecordListener> listeners = new ConcurrentHashMap<>(1024);
    
    @Override
    public void put(String key, Record value) throws NacosException {
        // 1. 构建 Datum(带时间戳的数据)
        Datum datum = new Datum();
        datum.key = key;
        datum.value = value;
        datum.timestamp = System.currentTimeMillis(); // 关键:时间戳用于版本控制
        
        // 2. 写入本地内存
        dataStore.put(key, datum);
        
        // 3. 通知监听器(触发推送到客户端)
        notifyListener(key, DataOperation.CHANGE);
        
        // 4. 广播到其他节点
        distroProtocol.sync(new DistroKey(key, value), DataOperation.CHANGE);
    }
    
    @Override
    public Datum get(String key) {
        // 从本地内存读取
        return dataStore.get(key);
    }
    
    @Override
    public void remove(String key) {
        // 1. 从本地内存删除
        dataStore.remove(key);
        
        // 2. 广播删除操作到其他节点
        distroProtocol.sync(new DistroKey(key, null), DataOperation.DELETE);
        
        // 3. 通知监听器
        notifyListener(key, DataOperation.DELETE);
    }
}    `
`#// naming/src/main/java/com/alibaba/nacos/naming/consistency/distro/DistroConsistencyServiceImpl.java

public class DistroConsistencyServiceImpl implements ConsistencyService {
    
    // 本地数据存储(内存)
    private final ConcurrentHashMap<String, Datum> dataStore = new ConcurrentHashMap<>(1024);
    
    // 监听器集合
    private final ConcurrentHashMap<String, RecordListener> listeners = new ConcurrentHashMap<>(1024);
    
    @Override
    public void put(String key, Record value) throws NacosException {
        // 1. 构建 Datum(带时间戳的数据)
        Datum datum = new Datum();
        datum.key = key;
        datum.value = value;
        datum.timestamp = System.currentTimeMillis(); // 关键:时间戳用于版本控制
        
        // 2. 写入本地内存
        dataStore.put(key, datum);
        
        // 3. 通知监听器(触发推送到客户端)
        notifyListener(key, DataOperation.CHANGE);
        
        // 4. 广播到其他节点
        distroProtocol.sync(new DistroKey(key, value), DataOperation.CHANGE);
    }
    
    @Override
    public Datum get(String key) {
        // 从本地内存读取
        return dataStore.get(key);
    }
    
    @Override
    public void remove(String key) {
        // 1. 从本地内存删除
        dataStore.remove(key);
        
        // 2. 广播删除操作到其他节点
        distroProtocol.sync(new DistroKey(key, null), DataOperation.DELETE);
        
        // 3. 通知监听器
        notifyListener(key, DataOperation.DELETE);
    }
}    @Override`
`#// naming/src/main/java/com/alibaba/nacos/naming/consistency/distro/DistroConsistencyServiceImpl.java

public class DistroConsistencyServiceImpl implements ConsistencyService {
    
    // 本地数据存储(内存)
    private final ConcurrentHashMap<String, Datum> dataStore = new ConcurrentHashMap<>(1024);
    
    // 监听器集合
    private final ConcurrentHashMap<String, RecordListener> listeners = new ConcurrentHashMap<>(1024);
    
    @Override
    public void put(String key, Record value) throws NacosException {
        // 1. 构建 Datum(带时间戳的数据)
        Datum datum = new Datum();
        datum.key = key;
        datum.value = value;
        datum.timestamp = System.currentTimeMillis(); // 关键:时间戳用于版本控制
        
        // 2. 写入本地内存
        dataStore.put(key, datum);
        
        // 3. 通知监听器(触发推送到客户端)
        notifyListener(key, DataOperation.CHANGE);
        
        // 4. 广播到其他节点
        distroProtocol.sync(new DistroKey(key, value), DataOperation.CHANGE);
    }
    
    @Override
    public Datum get(String key) {
        // 从本地内存读取
        return dataStore.get(key);
    }
    
    @Override
    public void remove(String key) {
        // 1. 从本地内存删除
        dataStore.remove(key);
        
        // 2. 广播删除操作到其他节点
        distroProtocol.sync(new DistroKey(key, null), DataOperation.DELETE);
        
        // 3. 通知监听器
        notifyListener(key, DataOperation.DELETE);
    }
}    public void put(String key, Record value) throws NacosException {`
`#// naming/src/main/java/com/alibaba/nacos/naming/consistency/distro/DistroConsistencyServiceImpl.java

public class DistroConsistencyServiceImpl implements ConsistencyService {
    
    // 本地数据存储(内存)
    private final ConcurrentHashMap<String, Datum> dataStore = new ConcurrentHashMap<>(1024);
    
    // 监听器集合
    private final ConcurrentHashMap<String, RecordListener> listeners = new ConcurrentHashMap<>(1024);
    
    @Override
    public void put(String key, Record value) throws NacosException {
        // 1. 构建 Datum(带时间戳的数据)
        Datum datum = new Datum();
        datum.key = key;
        datum.value = value;
        datum.timestamp = System.currentTimeMillis(); // 关键:时间戳用于版本控制
        
        // 2. 写入本地内存
        dataStore.put(key, datum);
        
        // 3. 通知监听器(触发推送到客户端)
        notifyListener(key, DataOperation.CHANGE);
        
        // 4. 广播到其他节点
        distroProtocol.sync(new DistroKey(key, value), DataOperation.CHANGE);
    }
    
    @Override
    public Datum get(String key) {
        // 从本地内存读取
        return dataStore.get(key);
    }
    
    @Override
    public void remove(String key) {
        // 1. 从本地内存删除
        dataStore.remove(key);
        
        // 2. 广播删除操作到其他节点
        distroProtocol.sync(new DistroKey(key, null), DataOperation.DELETE);
        
        // 3. 通知监听器
        notifyListener(key, DataOperation.DELETE);
    }
}        // 1. 构建 Datum(带时间戳的数据)`
`#// naming/src/main/java/com/alibaba/nacos/naming/consistency/distro/DistroConsistencyServiceImpl.java

public class DistroConsistencyServiceImpl implements ConsistencyService {
    
    // 本地数据存储(内存)
    private final ConcurrentHashMap<String, Datum> dataStore = new ConcurrentHashMap<>(1024);
    
    // 监听器集合
    private final ConcurrentHashMap<String, RecordListener> listeners = new ConcurrentHashMap<>(1024);
    
    @Override
    public void put(String key, Record value) throws NacosException {
        // 1. 构建 Datum(带时间戳的数据)
        Datum datum = new Datum();
        datum.key = key;
        datum.value = value;
        datum.timestamp = System.currentTimeMillis(); // 关键:时间戳用于版本控制
        
        // 2. 写入本地内存
        dataStore.put(key, datum);
        
        // 3. 通知监听器(触发推送到客户端)
        notifyListener(key, DataOperation.CHANGE);
        
        // 4. 广播到其他节点
        distroProtocol.sync(new DistroKey(key, value), DataOperation.CHANGE);
    }
    
    @Override
    public Datum get(String key) {
        // 从本地内存读取
        return dataStore.get(key);
    }
    
    @Override
    public void remove(String key) {
        // 1. 从本地内存删除
        dataStore.remove(key);
        
        // 2. 广播删除操作到其他节点
        distroProtocol.sync(new DistroKey(key, null), DataOperation.DELETE);
        
        // 3. 通知监听器
        notifyListener(key, DataOperation.DELETE);
    }
}        Datum datum = new Datum();`
`#// naming/src/main/java/com/alibaba/nacos/naming/consistency/distro/DistroConsistencyServiceImpl.java

public class DistroConsistencyServiceImpl implements ConsistencyService {
    
    // 本地数据存储(内存)
    private final ConcurrentHashMap<String, Datum> dataStore = new ConcurrentHashMap<>(1024);
    
    // 监听器集合
    private final ConcurrentHashMap<String, RecordListener> listeners = new ConcurrentHashMap<>(1024);
    
    @Override
    public void put(String key, Record value) throws NacosException {
        // 1. 构建 Datum(带时间戳的数据)
        Datum datum = new Datum();
        datum.key = key;
        datum.value = value;
        datum.timestamp = System.currentTimeMillis(); // 关键:时间戳用于版本控制
        
        // 2. 写入本地内存
        dataStore.put(key, datum);
        
        // 3. 通知监听器(触发推送到客户端)
        notifyListener(key, DataOperation.CHANGE);
        
        // 4. 广播到其他节点
        distroProtocol.sync(new DistroKey(key, value), DataOperation.CHANGE);
    }
    
    @Override
    public Datum get(String key) {
        // 从本地内存读取
        return dataStore.get(key);
    }
    
    @Override
    public void remove(String key) {
        // 1. 从本地内存删除
        dataStore.remove(key);
        
        // 2. 广播删除操作到其他节点
        distroProtocol.sync(new DistroKey(key, null), DataOperation.DELETE);
        
        // 3. 通知监听器
        notifyListener(key, DataOperation.DELETE);
    }
}        datum.key = key;`
`#// naming/src/main/java/com/alibaba/nacos/naming/consistency/distro/DistroConsistencyServiceImpl.java

public class DistroConsistencyServiceImpl implements ConsistencyService {
    
    // 本地数据存储(内存)
    private final ConcurrentHashMap<String, Datum> dataStore = new ConcurrentHashMap<>(1024);
    
    // 监听器集合
    private final ConcurrentHashMap<String, RecordListener> listeners = new ConcurrentHashMap<>(1024);
    
    @Override
    public void put(String key, Record value) throws NacosException {
        // 1. 构建 Datum(带时间戳的数据)
        Datum datum = new Datum();
        datum.key = key;
        datum.value = value;
        datum.timestamp = System.currentTimeMillis(); // 关键:时间戳用于版本控制
        
        // 2. 写入本地内存
        dataStore.put(key, datum);
        
        // 3. 通知监听器(触发推送到客户端)
        notifyListener(key, DataOperation.CHANGE);
        
        // 4. 广播到其他节点
        distroProtocol.sync(new DistroKey(key, value), DataOperation.CHANGE);
    }
    
    @Override
    public Datum get(String key) {
        // 从本地内存读取
        return dataStore.get(key);
    }
    
    @Override
    public void remove(String key) {
        // 1. 从本地内存删除
        dataStore.remove(key);
        
        // 2. 广播删除操作到其他节点
        distroProtocol.sync(new DistroKey(key, null), DataOperation.DELETE);
        
        // 3. 通知监听器
        notifyListener(key, DataOperation.DELETE);
    }
}        datum.value = value;`
`#// naming/src/main/java/com/alibaba/nacos/naming/consistency/distro/DistroConsistencyServiceImpl.java

public class DistroConsistencyServiceImpl implements ConsistencyService {
    
    // 本地数据存储(内存)
    private final ConcurrentHashMap<String, Datum> dataStore = new ConcurrentHashMap<>(1024);
    
    // 监听器集合
    private final ConcurrentHashMap<String, RecordListener> listeners = new ConcurrentHashMap<>(1024);
    
    @Override
    public void put(String key, Record value) throws NacosException {
        // 1. 构建 Datum(带时间戳的数据)
        Datum datum = new Datum();
        datum.key = key;
        datum.value = value;
        datum.timestamp = System.currentTimeMillis(); // 关键:时间戳用于版本控制
        
        // 2. 写入本地内存
        dataStore.put(key, datum);
        
        // 3. 通知监听器(触发推送到客户端)
        notifyListener(key, DataOperation.CHANGE);
        
        // 4. 广播到其他节点
        distroProtocol.sync(new DistroKey(key, value), DataOperation.CHANGE);
    }
    
    @Override
    public Datum get(String key) {
        // 从本地内存读取
        return dataStore.get(key);
    }
    
    @Override
    public void remove(String key) {
        // 1. 从本地内存删除
        dataStore.remove(key);
        
        // 2. 广播删除操作到其他节点
        distroProtocol.sync(new DistroKey(key, null), DataOperation.DELETE);
        
        // 3. 通知监听器
        notifyListener(key, DataOperation.DELETE);
    }
}        datum.timestamp = System.currentTimeMillis(); // 关键:时间戳用于版本控制`
`#// naming/src/main/java/com/alibaba/nacos/naming/consistency/distro/DistroConsistencyServiceImpl.java

public class DistroConsistencyServiceImpl implements ConsistencyService {
    
    // 本地数据存储(内存)
    private final ConcurrentHashMap<String, Datum> dataStore = new ConcurrentHashMap<>(1024);
    
    // 监听器集合
    private final ConcurrentHashMap<String, RecordListener> listeners = new ConcurrentHashMap<>(1024);
    
    @Override
    public void put(String key, Record value) throws NacosException {
        // 1. 构建 Datum(带时间戳的数据)
        Datum datum = new Datum();
        datum.key = key;
        datum.value = value;
        datum.timestamp = System.currentTimeMillis(); // 关键:时间戳用于版本控制
        
        // 2. 写入本地内存
        dataStore.put(key, datum);
        
        // 3. 通知监听器(触发推送到客户端)
        notifyListener(key, DataOperation.CHANGE);
        
        // 4. 广播到其他节点
        distroProtocol.sync(new DistroKey(key, value), DataOperation.CHANGE);
    }
    
    @Override
    public Datum get(String key) {
        // 从本地内存读取
        return dataStore.get(key);
    }
    
    @Override
    public void remove(String key) {
        // 1. 从本地内存删除
        dataStore.remove(key);
        
        // 2. 广播删除操作到其他节点
        distroProtocol.sync(new DistroKey(key, null), DataOperation.DELETE);
        
        // 3. 通知监听器
        notifyListener(key, DataOperation.DELETE);
    }
}        `
`#// naming/src/main/java/com/alibaba/nacos/naming/consistency/distro/DistroConsistencyServiceImpl.java

public class DistroConsistencyServiceImpl implements ConsistencyService {
    
    // 本地数据存储(内存)
    private final ConcurrentHashMap<String, Datum> dataStore = new ConcurrentHashMap<>(1024);
    
    // 监听器集合
    private final ConcurrentHashMap<String, RecordListener> listeners = new ConcurrentHashMap<>(1024);
    
    @Override
    public void put(String key, Record value) throws NacosException {
        // 1. 构建 Datum(带时间戳的数据)
        Datum datum = new Datum();
        datum.key = key;
        datum.value = value;
        datum.timestamp = System.currentTimeMillis(); // 关键:时间戳用于版本控制
        
        // 2. 写入本地内存
        dataStore.put(key, datum);
        
        // 3. 通知监听器(触发推送到客户端)
        notifyListener(key, DataOperation.CHANGE);
        
        // 4. 广播到其他节点
        distroProtocol.sync(new DistroKey(key, value), DataOperation.CHANGE);
    }
    
    @Override
    public Datum get(String key) {
        // 从本地内存读取
        return dataStore.get(key);
    }
    
    @Override
    public void remove(String key) {
        // 1. 从本地内存删除
        dataStore.remove(key);
        
        // 2. 广播删除操作到其他节点
        distroProtocol.sync(new DistroKey(key, null), DataOperation.DELETE);
        
        // 3. 通知监听器
        notifyListener(key, DataOperation.DELETE);
    }
}        // 2. 写入本地内存`
`#// naming/src/main/java/com/alibaba/nacos/naming/consistency/distro/DistroConsistencyServiceImpl.java

public class DistroConsistencyServiceImpl implements ConsistencyService {
    
    // 本地数据存储(内存)
    private final ConcurrentHashMap<String, Datum> dataStore = new ConcurrentHashMap<>(1024);
    
    // 监听器集合
    private final ConcurrentHashMap<String, RecordListener> listeners = new ConcurrentHashMap<>(1024);
    
    @Override
    public void put(String key, Record value) throws NacosException {
        // 1. 构建 Datum(带时间戳的数据)
        Datum datum = new Datum();
        datum.key = key;
        datum.value = value;
        datum.timestamp = System.currentTimeMillis(); // 关键:时间戳用于版本控制
        
        // 2. 写入本地内存
        dataStore.put(key, datum);
        
        // 3. 通知监听器(触发推送到客户端)
        notifyListener(key, DataOperation.CHANGE);
        
        // 4. 广播到其他节点
        distroProtocol.sync(new DistroKey(key, value), DataOperation.CHANGE);
    }
    
    @Override
    public Datum get(String key) {
        // 从本地内存读取
        return dataStore.get(key);
    }
    
    @Override
    public void remove(String key) {
        // 1. 从本地内存删除
        dataStore.remove(key);
        
        // 2. 广播删除操作到其他节点
        distroProtocol.sync(new DistroKey(key, null), DataOperation.DELETE);
        
        // 3. 通知监听器
        notifyListener(key, DataOperation.DELETE);
    }
}        dataStore.put(key, datum);`
`#// naming/src/main/java/com/alibaba/nacos/naming/consistency/distro/DistroConsistencyServiceImpl.java

public class DistroConsistencyServiceImpl implements ConsistencyService {
    
    // 本地数据存储(内存)
    private final ConcurrentHashMap<String, Datum> dataStore = new ConcurrentHashMap<>(1024);
    
    // 监听器集合
    private final ConcurrentHashMap<String, RecordListener> listeners = new ConcurrentHashMap<>(1024);
    
    @Override
    public void put(String key, Record value) throws NacosException {
        // 1. 构建 Datum(带时间戳的数据)
        Datum datum = new Datum();
        datum.key = key;
        datum.value = value;
        datum.timestamp = System.currentTimeMillis(); // 关键:时间戳用于版本控制
        
        // 2. 写入本地内存
        dataStore.put(key, datum);
        
        // 3. 通知监听器(触发推送到客户端)
        notifyListener(key, DataOperation.CHANGE);
        
        // 4. 广播到其他节点
        distroProtocol.sync(new DistroKey(key, value), DataOperation.CHANGE);
    }
    
    @Override
    public Datum get(String key) {
        // 从本地内存读取
        return dataStore.get(key);
    }
    
    @Override
    public void remove(String key) {
        // 1. 从本地内存删除
        dataStore.remove(key);
        
        // 2. 广播删除操作到其他节点
        distroProtocol.sync(new DistroKey(key, null), DataOperation.DELETE);
        
        // 3. 通知监听器
        notifyListener(key, DataOperation.DELETE);
    }
}        `
`#// naming/src/main/java/com/alibaba/nacos/naming/consistency/distro/DistroConsistencyServiceImpl.java

public class DistroConsistencyServiceImpl implements ConsistencyService {
    
    // 本地数据存储(内存)
    private final ConcurrentHashMap<String, Datum> dataStore = new ConcurrentHashMap<>(1024);
    
    // 监听器集合
    private final ConcurrentHashMap<String, RecordListener> listeners = new ConcurrentHashMap<>(1024);
    
    @Override
    public void put(String key, Record value) throws NacosException {
        // 1. 构建 Datum(带时间戳的数据)
        Datum datum = new Datum();
        datum.key = key;
        datum.value = value;
        datum.timestamp = System.currentTimeMillis(); // 关键:时间戳用于版本控制
        
        // 2. 写入本地内存
        dataStore.put(key, datum);
        
        // 3. 通知监听器(触发推送到客户端)
        notifyListener(key, DataOperation.CHANGE);
        
        // 4. 广播到其他节点
        distroProtocol.sync(new DistroKey(key, value), DataOperation.CHANGE);
    }
    
    @Override
    public Datum get(String key) {
        // 从本地内存读取
        return dataStore.get(key);
    }
    
    @Override
    public void remove(String key) {
        // 1. 从本地内存删除
        dataStore.remove(key);
        
        // 2. 广播删除操作到其他节点
        distroProtocol.sync(new DistroKey(key, null), DataOperation.DELETE);
        
        // 3. 通知监听器
        notifyListener(key, DataOperation.DELETE);
    }
}        // 3. 通知监听器(触发推送到客户端)`
`#// naming/src/main/java/com/alibaba/nacos/naming/consistency/distro/DistroConsistencyServiceImpl.java

public class DistroConsistencyServiceImpl implements ConsistencyService {
    
    // 本地数据存储(内存)
    private final ConcurrentHashMap<String, Datum> dataStore = new ConcurrentHashMap<>(1024);
    
    // 监听器集合
    private final ConcurrentHashMap<String, RecordListener> listeners = new ConcurrentHashMap<>(1024);
    
    @Override
    public void put(String key, Record value) throws NacosException {
        // 1. 构建 Datum(带时间戳的数据)
        Datum datum = new Datum();
        datum.key = key;
        datum.value = value;
        datum.timestamp = System.currentTimeMillis(); // 关键:时间戳用于版本控制
        
        // 2. 写入本地内存
        dataStore.put(key, datum);
        
        // 3. 通知监听器(触发推送到客户端)
        notifyListener(key, DataOperation.CHANGE);
        
        // 4. 广播到其他节点
        distroProtocol.sync(new DistroKey(key, value), DataOperation.CHANGE);
    }
    
    @Override
    public Datum get(String key) {
        // 从本地内存读取
        return dataStore.get(key);
    }
    
    @Override
    public void remove(String key) {
        // 1. 从本地内存删除
        dataStore.remove(key);
        
        // 2. 广播删除操作到其他节点
        distroProtocol.sync(new DistroKey(key, null), DataOperation.DELETE);
        
        // 3. 通知监听器
        notifyListener(key, DataOperation.DELETE);
    }
}        notifyListener(key, DataOperation.CHANGE);`
`#// naming/src/main/java/com/alibaba/nacos/naming/consistency/distro/DistroConsistencyServiceImpl.java

public class DistroConsistencyServiceImpl implements ConsistencyService {
    
    // 本地数据存储(内存)
    private final ConcurrentHashMap<String, Datum> dataStore = new ConcurrentHashMap<>(1024);
    
    // 监听器集合
    private final ConcurrentHashMap<String, RecordListener> listeners = new ConcurrentHashMap<>(1024);
    
    @Override
    public void put(String key, Record value) throws NacosException {
        // 1. 构建 Datum(带时间戳的数据)
        Datum datum = new Datum();
        datum.key = key;
        datum.value = value;
        datum.timestamp = System.currentTimeMillis(); // 关键:时间戳用于版本控制
        
        // 2. 写入本地内存
        dataStore.put(key, datum);
        
        // 3. 通知监听器(触发推送到客户端)
        notifyListener(key, DataOperation.CHANGE);
        
        // 4. 广播到其他节点
        distroProtocol.sync(new DistroKey(key, value), DataOperation.CHANGE);
    }
    
    @Override
    public Datum get(String key) {
        // 从本地内存读取
        return dataStore.get(key);
    }
    
    @Override
    public void remove(String key) {
        // 1. 从本地内存删除
        dataStore.remove(key);
        
        // 2. 广播删除操作到其他节点
        distroProtocol.sync(new DistroKey(key, null), DataOperation.DELETE);
        
        // 3. 通知监听器
        notifyListener(key, DataOperation.DELETE);
    }
}        `
`#// naming/src/main/java/com/alibaba/nacos/naming/consistency/distro/DistroConsistencyServiceImpl.java

public class DistroConsistencyServiceImpl implements ConsistencyService {
    
    // 本地数据存储(内存)
    private final ConcurrentHashMap<String, Datum> dataStore = new ConcurrentHashMap<>(1024);
    
    // 监听器集合
    private final ConcurrentHashMap<String, RecordListener> listeners = new ConcurrentHashMap<>(1024);
    
    @Override
    public void put(String key, Record value) throws NacosException {
        // 1. 构建 Datum(带时间戳的数据)
        Datum datum = new Datum();
        datum.key = key;
        datum.value = value;
        datum.timestamp = System.currentTimeMillis(); // 关键:时间戳用于版本控制
        
        // 2. 写入本地内存
        dataStore.put(key, datum);
        
        // 3. 通知监听器(触发推送到客户端)
        notifyListener(key, DataOperation.CHANGE);
        
        // 4. 广播到其他节点
        distroProtocol.sync(new DistroKey(key, value), DataOperation.CHANGE);
    }
    
    @Override
    public Datum get(String key) {
        // 从本地内存读取
        return dataStore.get(key);
    }
    
    @Override
    public void remove(String key) {
        // 1. 从本地内存删除
        dataStore.remove(key);
        
        // 2. 广播删除操作到其他节点
        distroProtocol.sync(new DistroKey(key, null), DataOperation.DELETE);
        
        // 3. 通知监听器
        notifyListener(key, DataOperation.DELETE);
    }
}        // 4. 广播到其他节点`
`#// naming/src/main/java/com/alibaba/nacos/naming/consistency/distro/DistroConsistencyServiceImpl.java

public class DistroConsistencyServiceImpl implements ConsistencyService {
    
    // 本地数据存储(内存)
    private final ConcurrentHashMap<String, Datum> dataStore = new ConcurrentHashMap<>(1024);
    
    // 监听器集合
    private final ConcurrentHashMap<String, RecordListener> listeners = new ConcurrentHashMap<>(1024);
    
    @Override
    public void put(String key, Record value) throws NacosException {
        // 1. 构建 Datum(带时间戳的数据)
        Datum datum = new Datum();
        datum.key = key;
        datum.value = value;
        datum.timestamp = System.currentTimeMillis(); // 关键:时间戳用于版本控制
        
        // 2. 写入本地内存
        dataStore.put(key, datum);
        
        // 3. 通知监听器(触发推送到客户端)
        notifyListener(key, DataOperation.CHANGE);
        
        // 4. 广播到其他节点
        distroProtocol.sync(new DistroKey(key, value), DataOperation.CHANGE);
    }
    
    @Override
    public Datum get(String key) {
        // 从本地内存读取
        return dataStore.get(key);
    }
    
    @Override
    public void remove(String key) {
        // 1. 从本地内存删除
        dataStore.remove(key);
        
        // 2. 广播删除操作到其他节点
        distroProtocol.sync(new DistroKey(key, null), DataOperation.DELETE);
        
        // 3. 通知监听器
        notifyListener(key, DataOperation.DELETE);
    }
}        distroProtocol.sync(new DistroKey(key, value), DataOperation.CHANGE);`
`#// naming/src/main/java/com/alibaba/nacos/naming/consistency/distro/DistroConsistencyServiceImpl.java

public class DistroConsistencyServiceImpl implements ConsistencyService {
    
    // 本地数据存储(内存)
    private final ConcurrentHashMap<String, Datum> dataStore = new ConcurrentHashMap<>(1024);
    
    // 监听器集合
    private final ConcurrentHashMap<String, RecordListener> listeners = new ConcurrentHashMap<>(1024);
    
    @Override
    public void put(String key, Record value) throws NacosException {
        // 1. 构建 Datum(带时间戳的数据)
        Datum datum = new Datum();
        datum.key = key;
        datum.value = value;
        datum.timestamp = System.currentTimeMillis(); // 关键:时间戳用于版本控制
        
        // 2. 写入本地内存
        dataStore.put(key, datum);
        
        // 3. 通知监听器(触发推送到客户端)
        notifyListener(key, DataOperation.CHANGE);
        
        // 4. 广播到其他节点
        distroProtocol.sync(new DistroKey(key, value), DataOperation.CHANGE);
    }
    
    @Override
    public Datum get(String key) {
        // 从本地内存读取
        return dataStore.get(key);
    }
    
    @Override
    public void remove(String key) {
        // 1. 从本地内存删除
        dataStore.remove(key);
        
        // 2. 广播删除操作到其他节点
        distroProtocol.sync(new DistroKey(key, null), DataOperation.DELETE);
        
        // 3. 通知监听器
        notifyListener(key, DataOperation.DELETE);
    }
}    }`
`#// naming/src/main/java/com/alibaba/nacos/naming/consistency/distro/DistroConsistencyServiceImpl.java

public class DistroConsistencyServiceImpl implements ConsistencyService {
    
    // 本地数据存储(内存)
    private final ConcurrentHashMap<String, Datum> dataStore = new ConcurrentHashMap<>(1024);
    
    // 监听器集合
    private final ConcurrentHashMap<String, RecordListener> listeners = new ConcurrentHashMap<>(1024);
    
    @Override
    public void put(String key, Record value) throws NacosException {
        // 1. 构建 Datum(带时间戳的数据)
        Datum datum = new Datum();
        datum.key = key;
        datum.value = value;
        datum.timestamp = System.currentTimeMillis(); // 关键:时间戳用于版本控制
        
        // 2. 写入本地内存
        dataStore.put(key, datum);
        
        // 3. 通知监听器(触发推送到客户端)
        notifyListener(key, DataOperation.CHANGE);
        
        // 4. 广播到其他节点
        distroProtocol.sync(new DistroKey(key, value), DataOperation.CHANGE);
    }
    
    @Override
    public Datum get(String key) {
        // 从本地内存读取
        return dataStore.get(key);
    }
    
    @Override
    public void remove(String key) {
        // 1. 从本地内存删除
        dataStore.remove(key);
        
        // 2. 广播删除操作到其他节点
        distroProtocol.sync(new DistroKey(key, null), DataOperation.DELETE);
        
        // 3. 通知监听器
        notifyListener(key, DataOperation.DELETE);
    }
}    `
`#// naming/src/main/java/com/alibaba/nacos/naming/consistency/distro/DistroConsistencyServiceImpl.java

public class DistroConsistencyServiceImpl implements ConsistencyService {
    
    // 本地数据存储(内存)
    private final ConcurrentHashMap<String, Datum> dataStore = new ConcurrentHashMap<>(1024);
    
    // 监听器集合
    private final ConcurrentHashMap<String, RecordListener> listeners = new ConcurrentHashMap<>(1024);
    
    @Override
    public void put(String key, Record value) throws NacosException {
        // 1. 构建 Datum(带时间戳的数据)
        Datum datum = new Datum();
        datum.key = key;
        datum.value = value;
        datum.timestamp = System.currentTimeMillis(); // 关键:时间戳用于版本控制
        
        // 2. 写入本地内存
        dataStore.put(key, datum);
        
        // 3. 通知监听器(触发推送到客户端)
        notifyListener(key, DataOperation.CHANGE);
        
        // 4. 广播到其他节点
        distroProtocol.sync(new DistroKey(key, value), DataOperation.CHANGE);
    }
    
    @Override
    public Datum get(String key) {
        // 从本地内存读取
        return dataStore.get(key);
    }
    
    @Override
    public void remove(String key) {
        // 1. 从本地内存删除
        dataStore.remove(key);
        
        // 2. 广播删除操作到其他节点
        distroProtocol.sync(new DistroKey(key, null), DataOperation.DELETE);
        
        // 3. 通知监听器
        notifyListener(key, DataOperation.DELETE);
    }
}    @Override`
`#// naming/src/main/java/com/alibaba/nacos/naming/consistency/distro/DistroConsistencyServiceImpl.java

public class DistroConsistencyServiceImpl implements ConsistencyService {
    
    // 本地数据存储(内存)
    private final ConcurrentHashMap<String, Datum> dataStore = new ConcurrentHashMap<>(1024);
    
    // 监听器集合
    private final ConcurrentHashMap<String, RecordListener> listeners = new ConcurrentHashMap<>(1024);
    
    @Override
    public void put(String key, Record value) throws NacosException {
        // 1. 构建 Datum(带时间戳的数据)
        Datum datum = new Datum();
        datum.key = key;
        datum.value = value;
        datum.timestamp = System.currentTimeMillis(); // 关键:时间戳用于版本控制
        
        // 2. 写入本地内存
        dataStore.put(key, datum);
        
        // 3. 通知监听器(触发推送到客户端)
        notifyListener(key, DataOperation.CHANGE);
        
        // 4. 广播到其他节点
        distroProtocol.sync(new DistroKey(key, value), DataOperation.CHANGE);
    }
    
    @Override
    public Datum get(String key) {
        // 从本地内存读取
        return dataStore.get(key);
    }
    
    @Override
    public void remove(String key) {
        // 1. 从本地内存删除
        dataStore.remove(key);
        
        // 2. 广播删除操作到其他节点
        distroProtocol.sync(new DistroKey(key, null), DataOperation.DELETE);
        
        // 3. 通知监听器
        notifyListener(key, DataOperation.DELETE);
    }
}    public Datum get(String key) {`
`#// naming/src/main/java/com/alibaba/nacos/naming/consistency/distro/DistroConsistencyServiceImpl.java

public class DistroConsistencyServiceImpl implements ConsistencyService {
    
    // 本地数据存储(内存)
    private final ConcurrentHashMap<String, Datum> dataStore = new ConcurrentHashMap<>(1024);
    
    // 监听器集合
    private final ConcurrentHashMap<String, RecordListener> listeners = new ConcurrentHashMap<>(1024);
    
    @Override
    public void put(String key, Record value) throws NacosException {
        // 1. 构建 Datum(带时间戳的数据)
        Datum datum = new Datum();
        datum.key = key;
        datum.value = value;
        datum.timestamp = System.currentTimeMillis(); // 关键:时间戳用于版本控制
        
        // 2. 写入本地内存
        dataStore.put(key, datum);
        
        // 3. 通知监听器(触发推送到客户端)
        notifyListener(key, DataOperation.CHANGE);
        
        // 4. 广播到其他节点
        distroProtocol.sync(new DistroKey(key, value), DataOperation.CHANGE);
    }
    
    @Override
    public Datum get(String key) {
        // 从本地内存读取
        return dataStore.get(key);
    }
    
    @Override
    public void remove(String key) {
        // 1. 从本地内存删除
        dataStore.remove(key);
        
        // 2. 广播删除操作到其他节点
        distroProtocol.sync(new DistroKey(key, null), DataOperation.DELETE);
        
        // 3. 通知监听器
        notifyListener(key, DataOperation.DELETE);
    }
}        // 从本地内存读取`
`#// naming/src/main/java/com/alibaba/nacos/naming/consistency/distro/DistroConsistencyServiceImpl.java

public class DistroConsistencyServiceImpl implements ConsistencyService {
    
    // 本地数据存储(内存)
    private final ConcurrentHashMap<String, Datum> dataStore = new ConcurrentHashMap<>(1024);
    
    // 监听器集合
    private final ConcurrentHashMap<String, RecordListener> listeners = new ConcurrentHashMap<>(1024);
    
    @Override
    public void put(String key, Record value) throws NacosException {
        // 1. 构建 Datum(带时间戳的数据)
        Datum datum = new Datum();
        datum.key = key;
        datum.value = value;
        datum.timestamp = System.currentTimeMillis(); // 关键:时间戳用于版本控制
        
        // 2. 写入本地内存
        dataStore.put(key, datum);
        
        // 3. 通知监听器(触发推送到客户端)
        notifyListener(key, DataOperation.CHANGE);
        
        // 4. 广播到其他节点
        distroProtocol.sync(new DistroKey(key, value), DataOperation.CHANGE);
    }
    
    @Override
    public Datum get(String key) {
        // 从本地内存读取
        return dataStore.get(key);
    }
    
    @Override
    public void remove(String key) {
        // 1. 从本地内存删除
        dataStore.remove(key);
        
        // 2. 广播删除操作到其他节点
        distroProtocol.sync(new DistroKey(key, null), DataOperation.DELETE);
        
        // 3. 通知监听器
        notifyListener(key, DataOperation.DELETE);
    }
}        return dataStore.get(key);`
`#// naming/src/main/java/com/alibaba/nacos/naming/consistency/distro/DistroConsistencyServiceImpl.java

public class DistroConsistencyServiceImpl implements ConsistencyService {
    
    // 本地数据存储(内存)
    private final ConcurrentHashMap<String, Datum> dataStore = new ConcurrentHashMap<>(1024);
    
    // 监听器集合
    private final ConcurrentHashMap<String, RecordListener> listeners = new ConcurrentHashMap<>(1024);
    
    @Override
    public void put(String key, Record value) throws NacosException {
        // 1. 构建 Datum(带时间戳的数据)
        Datum datum = new Datum();
        datum.key = key;
        datum.value = value;
        datum.timestamp = System.currentTimeMillis(); // 关键:时间戳用于版本控制
        
        // 2. 写入本地内存
        dataStore.put(key, datum);
        
        // 3. 通知监听器(触发推送到客户端)
        notifyListener(key, DataOperation.CHANGE);
        
        // 4. 广播到其他节点
        distroProtocol.sync(new DistroKey(key, value), DataOperation.CHANGE);
    }
    
    @Override
    public Datum get(String key) {
        // 从本地内存读取
        return dataStore.get(key);
    }
    
    @Override
    public void remove(String key) {
        // 1. 从本地内存删除
        dataStore.remove(key);
        
        // 2. 广播删除操作到其他节点
        distroProtocol.sync(new DistroKey(key, null), DataOperation.DELETE);
        
        // 3. 通知监听器
        notifyListener(key, DataOperation.DELETE);
    }
}    }`
`#// naming/src/main/java/com/alibaba/nacos/naming/consistency/distro/DistroConsistencyServiceImpl.java

public class DistroConsistencyServiceImpl implements ConsistencyService {
    
    // 本地数据存储(内存)
    private final ConcurrentHashMap<String, Datum> dataStore = new ConcurrentHashMap<>(1024);
    
    // 监听器集合
    private final ConcurrentHashMap<String, RecordListener> listeners = new ConcurrentHashMap<>(1024);
    
    @Override
    public void put(String key, Record value) throws NacosException {
        // 1. 构建 Datum(带时间戳的数据)
        Datum datum = new Datum();
        datum.key = key;
        datum.value = value;
        datum.timestamp = System.currentTimeMillis(); // 关键:时间戳用于版本控制
        
        // 2. 写入本地内存
        dataStore.put(key, datum);
        
        // 3. 通知监听器(触发推送到客户端)
        notifyListener(key, DataOperation.CHANGE);
        
        // 4. 广播到其他节点
        distroProtocol.sync(new DistroKey(key, value), DataOperation.CHANGE);
    }
    
    @Override
    public Datum get(String key) {
        // 从本地内存读取
        return dataStore.get(key);
    }
    
    @Override
    public void remove(String key) {
        // 1. 从本地内存删除
        dataStore.remove(key);
        
        // 2. 广播删除操作到其他节点
        distroProtocol.sync(new DistroKey(key, null), DataOperation.DELETE);
        
        // 3. 通知监听器
        notifyListener(key, DataOperation.DELETE);
    }
}    `
`#// naming/src/main/java/com/alibaba/nacos/naming/consistency/distro/DistroConsistencyServiceImpl.java

public class DistroConsistencyServiceImpl implements ConsistencyService {
    
    // 本地数据存储(内存)
    private final ConcurrentHashMap<String, Datum> dataStore = new ConcurrentHashMap<>(1024);
    
    // 监听器集合
    private final ConcurrentHashMap<String, RecordListener> listeners = new ConcurrentHashMap<>(1024);
    
    @Override
    public void put(String key, Record value) throws NacosException {
        // 1. 构建 Datum(带时间戳的数据)
        Datum datum = new Datum();
        datum.key = key;
        datum.value = value;
        datum.timestamp = System.currentTimeMillis(); // 关键:时间戳用于版本控制
        
        // 2. 写入本地内存
        dataStore.put(key, datum);
        
        // 3. 通知监听器(触发推送到客户端)
        notifyListener(key, DataOperation.CHANGE);
        
        // 4. 广播到其他节点
        distroProtocol.sync(new DistroKey(key, value), DataOperation.CHANGE);
    }
    
    @Override
    public Datum get(String key) {
        // 从本地内存读取
        return dataStore.get(key);
    }
    
    @Override
    public void remove(String key) {
        // 1. 从本地内存删除
        dataStore.remove(key);
        
        // 2. 广播删除操作到其他节点
        distroProtocol.sync(new DistroKey(key, null), DataOperation.DELETE);
        
        // 3. 通知监听器
        notifyListener(key, DataOperation.DELETE);
    }
}    @Override`
`#// naming/src/main/java/com/alibaba/nacos/naming/consistency/distro/DistroConsistencyServiceImpl.java

public class DistroConsistencyServiceImpl implements ConsistencyService {
    
    // 本地数据存储(内存)
    private final ConcurrentHashMap<String, Datum> dataStore = new ConcurrentHashMap<>(1024);
    
    // 监听器集合
    private final ConcurrentHashMap<String, RecordListener> listeners = new ConcurrentHashMap<>(1024);
    
    @Override
    public void put(String key, Record value) throws NacosException {
        // 1. 构建 Datum(带时间戳的数据)
        Datum datum = new Datum();
        datum.key = key;
        datum.value = value;
        datum.timestamp = System.currentTimeMillis(); // 关键:时间戳用于版本控制
        
        // 2. 写入本地内存
        dataStore.put(key, datum);
        
        // 3. 通知监听器(触发推送到客户端)
        notifyListener(key, DataOperation.CHANGE);
        
        // 4. 广播到其他节点
        distroProtocol.sync(new DistroKey(key, value), DataOperation.CHANGE);
    }
    
    @Override
    public Datum get(String key) {
        // 从本地内存读取
        return dataStore.get(key);
    }
    
    @Override
    public void remove(String key) {
        // 1. 从本地内存删除
        dataStore.remove(key);
        
        // 2. 广播删除操作到其他节点
        distroProtocol.sync(new DistroKey(key, null), DataOperation.DELETE);
        
        // 3. 通知监听器
        notifyListener(key, DataOperation.DELETE);
    }
}    public void remove(String key) {`
`#// naming/src/main/java/com/alibaba/nacos/naming/consistency/distro/DistroConsistencyServiceImpl.java

public class DistroConsistencyServiceImpl implements ConsistencyService {
    
    // 本地数据存储(内存)
    private final ConcurrentHashMap<String, Datum> dataStore = new ConcurrentHashMap<>(1024);
    
    // 监听器集合
    private final ConcurrentHashMap<String, RecordListener> listeners = new ConcurrentHashMap<>(1024);
    
    @Override
    public void put(String key, Record value) throws NacosException {
        // 1. 构建 Datum(带时间戳的数据)
        Datum datum = new Datum();
        datum.key = key;
        datum.value = value;
        datum.timestamp = System.currentTimeMillis(); // 关键:时间戳用于版本控制
        
        // 2. 写入本地内存
        dataStore.put(key, datum);
        
        // 3. 通知监听器(触发推送到客户端)
        notifyListener(key, DataOperation.CHANGE);
        
        // 4. 广播到其他节点
        distroProtocol.sync(new DistroKey(key, value), DataOperation.CHANGE);
    }
    
    @Override
    public Datum get(String key) {
        // 从本地内存读取
        return dataStore.get(key);
    }
    
    @Override
    public void remove(String key) {
        // 1. 从本地内存删除
        dataStore.remove(key);
        
        // 2. 广播删除操作到其他节点
        distroProtocol.sync(new DistroKey(key, null), DataOperation.DELETE);
        
        // 3. 通知监听器
        notifyListener(key, DataOperation.DELETE);
    }
}        // 1. 从本地内存删除`
`#// naming/src/main/java/com/alibaba/nacos/naming/consistency/distro/DistroConsistencyServiceImpl.java

public class DistroConsistencyServiceImpl implements ConsistencyService {
    
    // 本地数据存储(内存)
    private final ConcurrentHashMap<String, Datum> dataStore = new ConcurrentHashMap<>(1024);
    
    // 监听器集合
    private final ConcurrentHashMap<String, RecordListener> listeners = new ConcurrentHashMap<>(1024);
    
    @Override
    public void put(String key, Record value) throws NacosException {
        // 1. 构建 Datum(带时间戳的数据)
        Datum datum = new Datum();
        datum.key = key;
        datum.value = value;
        datum.timestamp = System.currentTimeMillis(); // 关键:时间戳用于版本控制
        
        // 2. 写入本地内存
        dataStore.put(key, datum);
        
        // 3. 通知监听器(触发推送到客户端)
        notifyListener(key, DataOperation.CHANGE);
        
        // 4. 广播到其他节点
        distroProtocol.sync(new DistroKey(key, value), DataOperation.CHANGE);
    }
    
    @Override
    public Datum get(String key) {
        // 从本地内存读取
        return dataStore.get(key);
    }
    
    @Override
    public void remove(String key) {
        // 1. 从本地内存删除
        dataStore.remove(key);
        
        // 2. 广播删除操作到其他节点
        distroProtocol.sync(new DistroKey(key, null), DataOperation.DELETE);
        
        // 3. 通知监听器
        notifyListener(key, DataOperation.DELETE);
    }
}        dataStore.remove(key);`
`#// naming/src/main/java/com/alibaba/nacos/naming/consistency/distro/DistroConsistencyServiceImpl.java

public class DistroConsistencyServiceImpl implements ConsistencyService {
    
    // 本地数据存储(内存)
    private final ConcurrentHashMap<String, Datum> dataStore = new ConcurrentHashMap<>(1024);
    
    // 监听器集合
    private final ConcurrentHashMap<String, RecordListener> listeners = new ConcurrentHashMap<>(1024);
    
    @Override
    public void put(String key, Record value) throws NacosException {
        // 1. 构建 Datum(带时间戳的数据)
        Datum datum = new Datum();
        datum.key = key;
        datum.value = value;
        datum.timestamp = System.currentTimeMillis(); // 关键:时间戳用于版本控制
        
        // 2. 写入本地内存
        dataStore.put(key, datum);
        
        // 3. 通知监听器(触发推送到客户端)
        notifyListener(key, DataOperation.CHANGE);
        
        // 4. 广播到其他节点
        distroProtocol.sync(new DistroKey(key, value), DataOperation.CHANGE);
    }
    
    @Override
    public Datum get(String key) {
        // 从本地内存读取
        return dataStore.get(key);
    }
    
    @Override
    public void remove(String key) {
        // 1. 从本地内存删除
        dataStore.remove(key);
        
        // 2. 广播删除操作到其他节点
        distroProtocol.sync(new DistroKey(key, null), DataOperation.DELETE);
        
        // 3. 通知监听器
        notifyListener(key, DataOperation.DELETE);
    }
}        `
`#// naming/src/main/java/com/alibaba/nacos/naming/consistency/distro/DistroConsistencyServiceImpl.java

public class DistroConsistencyServiceImpl implements ConsistencyService {
    
    // 本地数据存储(内存)
    private final ConcurrentHashMap<String, Datum> dataStore = new ConcurrentHashMap<>(1024);
    
    // 监听器集合
    private final ConcurrentHashMap<String, RecordListener> listeners = new ConcurrentHashMap<>(1024);
    
    @Override
    public void put(String key, Record value) throws NacosException {
        // 1. 构建 Datum(带时间戳的数据)
        Datum datum = new Datum();
        datum.key = key;
        datum.value = value;
        datum.timestamp = System.currentTimeMillis(); // 关键:时间戳用于版本控制
        
        // 2. 写入本地内存
        dataStore.put(key, datum);
        
        // 3. 通知监听器(触发推送到客户端)
        notifyListener(key, DataOperation.CHANGE);
        
        // 4. 广播到其他节点
        distroProtocol.sync(new DistroKey(key, value), DataOperation.CHANGE);
    }
    
    @Override
    public Datum get(String key) {
        // 从本地内存读取
        return dataStore.get(key);
    }
    
    @Override
    public void remove(String key) {
        // 1. 从本地内存删除
        dataStore.remove(key);
        
        // 2. 广播删除操作到其他节点
        distroProtocol.sync(new DistroKey(key, null), DataOperation.DELETE);
        
        // 3. 通知监听器
        notifyListener(key, DataOperation.DELETE);
    }
}        // 2. 广播删除操作到其他节点`
`#// naming/src/main/java/com/alibaba/nacos/naming/consistency/distro/DistroConsistencyServiceImpl.java

public class DistroConsistencyServiceImpl implements ConsistencyService {
    
    // 本地数据存储(内存)
    private final ConcurrentHashMap<String, Datum> dataStore = new ConcurrentHashMap<>(1024);
    
    // 监听器集合
    private final ConcurrentHashMap<String, RecordListener> listeners = new ConcurrentHashMap<>(1024);
    
    @Override
    public void put(String key, Record value) throws NacosException {
        // 1. 构建 Datum(带时间戳的数据)
        Datum datum = new Datum();
        datum.key = key;
        datum.value = value;
        datum.timestamp = System.currentTimeMillis(); // 关键:时间戳用于版本控制
        
        // 2. 写入本地内存
        dataStore.put(key, datum);
        
        // 3. 通知监听器(触发推送到客户端)
        notifyListener(key, DataOperation.CHANGE);
        
        // 4. 广播到其他节点
        distroProtocol.sync(new DistroKey(key, value), DataOperation.CHANGE);
    }
    
    @Override
    public Datum get(String key) {
        // 从本地内存读取
        return dataStore.get(key);
    }
    
    @Override
    public void remove(String key) {
        // 1. 从本地内存删除
        dataStore.remove(key);
        
        // 2. 广播删除操作到其他节点
        distroProtocol.sync(new DistroKey(key, null), DataOperation.DELETE);
        
        // 3. 通知监听器
        notifyListener(key, DataOperation.DELETE);
    }
}        distroProtocol.sync(new DistroKey(key, null), DataOperation.DELETE);`
`#// naming/src/main/java/com/alibaba/nacos/naming/consistency/distro/DistroConsistencyServiceImpl.java

public class DistroConsistencyServiceImpl implements ConsistencyService {
    
    // 本地数据存储(内存)
    private final ConcurrentHashMap<String, Datum> dataStore = new ConcurrentHashMap<>(1024);
    
    // 监听器集合
    private final ConcurrentHashMap<String, RecordListener> listeners = new ConcurrentHashMap<>(1024);
    
    @Override
    public void put(String key, Record value) throws NacosException {
        // 1. 构建 Datum(带时间戳的数据)
        Datum datum = new Datum();
        datum.key = key;
        datum.value = value;
        datum.timestamp = System.currentTimeMillis(); // 关键:时间戳用于版本控制
        
        // 2. 写入本地内存
        dataStore.put(key, datum);
        
        // 3. 通知监听器(触发推送到客户端)
        notifyListener(key, DataOperation.CHANGE);
        
        // 4. 广播到其他节点
        distroProtocol.sync(new DistroKey(key, value), DataOperation.CHANGE);
    }
    
    @Override
    public Datum get(String key) {
        // 从本地内存读取
        return dataStore.get(key);
    }
    
    @Override
    public void remove(String key) {
        // 1. 从本地内存删除
        dataStore.remove(key);
        
        // 2. 广播删除操作到其他节点
        distroProtocol.sync(new DistroKey(key, null), DataOperation.DELETE);
        
        // 3. 通知监听器
        notifyListener(key, DataOperation.DELETE);
    }
}        `
`#// naming/src/main/java/com/alibaba/nacos/naming/consistency/distro/DistroConsistencyServiceImpl.java

public class DistroConsistencyServiceImpl implements ConsistencyService {
    
    // 本地数据存储(内存)
    private final ConcurrentHashMap<String, Datum> dataStore = new ConcurrentHashMap<>(1024);
    
    // 监听器集合
    private final ConcurrentHashMap<String, RecordListener> listeners = new ConcurrentHashMap<>(1024);
    
    @Override
    public void put(String key, Record value) throws NacosException {
        // 1. 构建 Datum(带时间戳的数据)
        Datum datum = new Datum();
        datum.key = key;
        datum.value = value;
        datum.timestamp = System.currentTimeMillis(); // 关键:时间戳用于版本控制
        
        // 2. 写入本地内存
        dataStore.put(key, datum);
        
        // 3. 通知监听器(触发推送到客户端)
        notifyListener(key, DataOperation.CHANGE);
        
        // 4. 广播到其他节点
        distroProtocol.sync(new DistroKey(key, value), DataOperation.CHANGE);
    }
    
    @Override
    public Datum get(String key) {
        // 从本地内存读取
        return dataStore.get(key);
    }
    
    @Override
    public void remove(String key) {
        // 1. 从本地内存删除
        dataStore.remove(key);
        
        // 2. 广播删除操作到其他节点
        distroProtocol.sync(new DistroKey(key, null), DataOperation.DELETE);
        
        // 3. 通知监听器
        notifyListener(key, DataOperation.DELETE);
    }
}        // 3. 通知监听器`
`#// naming/src/main/java/com/alibaba/nacos/naming/consistency/distro/DistroConsistencyServiceImpl.java

public class DistroConsistencyServiceImpl implements ConsistencyService {
    
    // 本地数据存储(内存)
    private final ConcurrentHashMap<String, Datum> dataStore = new ConcurrentHashMap<>(1024);
    
    // 监听器集合
    private final ConcurrentHashMap<String, RecordListener> listeners = new ConcurrentHashMap<>(1024);
    
    @Override
    public void put(String key, Record value) throws NacosException {
        // 1. 构建 Datum(带时间戳的数据)
        Datum datum = new Datum();
        datum.key = key;
        datum.value = value;
        datum.timestamp = System.currentTimeMillis(); // 关键:时间戳用于版本控制
        
        // 2. 写入本地内存
        dataStore.put(key, datum);
        
        // 3. 通知监听器(触发推送到客户端)
        notifyListener(key, DataOperation.CHANGE);
        
        // 4. 广播到其他节点
        distroProtocol.sync(new DistroKey(key, value), DataOperation.CHANGE);
    }
    
    @Override
    public Datum get(String key) {
        // 从本地内存读取
        return dataStore.get(key);
    }
    
    @Override
    public void remove(String key) {
        // 1. 从本地内存删除
        dataStore.remove(key);
        
        // 2. 广播删除操作到其他节点
        distroProtocol.sync(new DistroKey(key, null), DataOperation.DELETE);
        
        // 3. 通知监听器
        notifyListener(key, DataOperation.DELETE);
    }
}        notifyListener(key, DataOperation.DELETE);`
`#// naming/src/main/java/com/alibaba/nacos/naming/consistency/distro/DistroConsistencyServiceImpl.java

public class DistroConsistencyServiceImpl implements ConsistencyService {
    
    // 本地数据存储(内存)
    private final ConcurrentHashMap<String, Datum> dataStore = new ConcurrentHashMap<>(1024);
    
    // 监听器集合
    private final ConcurrentHashMap<String, RecordListener> listeners = new ConcurrentHashMap<>(1024);
    
    @Override
    public void put(String key, Record value) throws NacosException {
        // 1. 构建 Datum(带时间戳的数据)
        Datum datum = new Datum();
        datum.key = key;
        datum.value = value;
        datum.timestamp = System.currentTimeMillis(); // 关键:时间戳用于版本控制
        
        // 2. 写入本地内存
        dataStore.put(key, datum);
        
        // 3. 通知监听器(触发推送到客户端)
        notifyListener(key, DataOperation.CHANGE);
        
        // 4. 广播到其他节点
        distroProtocol.sync(new DistroKey(key, value), DataOperation.CHANGE);
    }
    
    @Override
    public Datum get(String key) {
        // 从本地内存读取
        return dataStore.get(key);
    }
    
    @Override
    public void remove(String key) {
        // 1. 从本地内存删除
        dataStore.remove(key);
        
        // 2. 广播删除操作到其他节点
        distroProtocol.sync(new DistroKey(key, null), DataOperation.DELETE);
        
        // 3. 通知监听器
        notifyListener(key, DataOperation.DELETE);
    }
}    }`
`#// naming/src/main/java/com/alibaba/nacos/naming/consistency/distro/DistroConsistencyServiceImpl.java

public class DistroConsistencyServiceImpl implements ConsistencyService {
    
    // 本地数据存储(内存)
    private final ConcurrentHashMap<String, Datum> dataStore = new ConcurrentHashMap<>(1024);
    
    // 监听器集合
    private final ConcurrentHashMap<String, RecordListener> listeners = new ConcurrentHashMap<>(1024);
    
    @Override
    public void put(String key, Record value) throws NacosException {
        // 1. 构建 Datum(带时间戳的数据)
        Datum datum = new Datum();
        datum.key = key;
        datum.value = value;
        datum.timestamp = System.currentTimeMillis(); // 关键:时间戳用于版本控制
        
        // 2. 写入本地内存
        dataStore.put(key, datum);
        
        // 3. 通知监听器(触发推送到客户端)
        notifyListener(key, DataOperation.CHANGE);
        
        // 4. 广播到其他节点
        distroProtocol.sync(new DistroKey(key, value), DataOperation.CHANGE);
    }
    
    @Override
    public Datum get(String key) {
        // 从本地内存读取
        return dataStore.get(key);
    }
    
    @Override
    public void remove(String key) {
        // 1. 从本地内存删除
        dataStore.remove(key);
        
        // 2. 广播删除操作到其他节点
        distroProtocol.sync(new DistroKey(key, null), DataOperation.DELETE);
        
        // 3. 通知监听器
        notifyListener(key, DataOperation.DELETE);
    }
}}

3.3 Distro 协议同步

源码位置naming/src/main/java/com/alibaba/nacos/naming/core/DistroProtocol.java

java 复制代码
#// naming/src/main/java/com/alibaba/nacos/naming/core/DistroProtocol.java

public class DistroProtocol {
    
    // 同步数据到其他节点
    public void sync(DistroKey key, DataOperation action) {
        // 1. 遍历所有集群节点(除自己)
        for (Member member : memberManager.allMembersWithoutSelf()) {
            // 2. 异步同步(不阻塞主流程)
            distroTaskEngineHolder.getExecuteWorkers().get(member.getAddress())
                .addTask(new DistroSyncTask(key, action, member.getAddress()));
        }
    }
}

// naming/src/main/java/com/alibaba/nacos/naming/core/DistroSyncTask.java

public class DistroSyncTask implements Runnable {
    
    @Override
    public void run() {
        try {
            // 1. 构建 HTTP 请求
            String url = "http://" + targetServer + "/v1/ns/distro/datum";
            
            // 2. 序列化数据
            Map<String, Object> data = new HashMap<>();
            data.put("key", distroKey.getKey());
            data.put("timestamp", System.currentTimeMillis());
            
            // 3. 发送 HTTP 请求
            RestResult<String> result = restTemplate.post(url, data);
            
            if (result.ok()) {
                log.info("同步成功: {}", distroKey);
            }
        } catch (Exception e) {
            log.error("同步失败: {}", distroKey, e);
        }
    }
}// naming/src/main/java/com/alibaba/nacos/naming/core/DistroProtocol.java`
`#// naming/src/main/java/com/alibaba/nacos/naming/core/DistroProtocol.java

public class DistroProtocol {
    
    // 同步数据到其他节点
    public void sync(DistroKey key, DataOperation action) {
        // 1. 遍历所有集群节点(除自己)
        for (Member member : memberManager.allMembersWithoutSelf()) {
            // 2. 异步同步(不阻塞主流程)
            distroTaskEngineHolder.getExecuteWorkers().get(member.getAddress())
                .addTask(new DistroSyncTask(key, action, member.getAddress()));
        }
    }
}

// naming/src/main/java/com/alibaba/nacos/naming/core/DistroSyncTask.java

public class DistroSyncTask implements Runnable {
    
    @Override
    public void run() {
        try {
            // 1. 构建 HTTP 请求
            String url = "http://" + targetServer + "/v1/ns/distro/datum";
            
            // 2. 序列化数据
            Map<String, Object> data = new HashMap<>();
            data.put("key", distroKey.getKey());
            data.put("timestamp", System.currentTimeMillis());
            
            // 3. 发送 HTTP 请求
            RestResult<String> result = restTemplate.post(url, data);
            
            if (result.ok()) {
                log.info("同步成功: {}", distroKey);
            }
        } catch (Exception e) {
            log.error("同步失败: {}", distroKey, e);
        }
    }
}`
`#// naming/src/main/java/com/alibaba/nacos/naming/core/DistroProtocol.java

public class DistroProtocol {
    
    // 同步数据到其他节点
    public void sync(DistroKey key, DataOperation action) {
        // 1. 遍历所有集群节点(除自己)
        for (Member member : memberManager.allMembersWithoutSelf()) {
            // 2. 异步同步(不阻塞主流程)
            distroTaskEngineHolder.getExecuteWorkers().get(member.getAddress())
                .addTask(new DistroSyncTask(key, action, member.getAddress()));
        }
    }
}

// naming/src/main/java/com/alibaba/nacos/naming/core/DistroSyncTask.java

public class DistroSyncTask implements Runnable {
    
    @Override
    public void run() {
        try {
            // 1. 构建 HTTP 请求
            String url = "http://" + targetServer + "/v1/ns/distro/datum";
            
            // 2. 序列化数据
            Map<String, Object> data = new HashMap<>();
            data.put("key", distroKey.getKey());
            data.put("timestamp", System.currentTimeMillis());
            
            // 3. 发送 HTTP 请求
            RestResult<String> result = restTemplate.post(url, data);
            
            if (result.ok()) {
                log.info("同步成功: {}", distroKey);
            }
        } catch (Exception e) {
            log.error("同步失败: {}", distroKey, e);
        }
    }
}public class DistroProtocol {`
`#// naming/src/main/java/com/alibaba/nacos/naming/core/DistroProtocol.java

public class DistroProtocol {
    
    // 同步数据到其他节点
    public void sync(DistroKey key, DataOperation action) {
        // 1. 遍历所有集群节点(除自己)
        for (Member member : memberManager.allMembersWithoutSelf()) {
            // 2. 异步同步(不阻塞主流程)
            distroTaskEngineHolder.getExecuteWorkers().get(member.getAddress())
                .addTask(new DistroSyncTask(key, action, member.getAddress()));
        }
    }
}

// naming/src/main/java/com/alibaba/nacos/naming/core/DistroSyncTask.java

public class DistroSyncTask implements Runnable {
    
    @Override
    public void run() {
        try {
            // 1. 构建 HTTP 请求
            String url = "http://" + targetServer + "/v1/ns/distro/datum";
            
            // 2. 序列化数据
            Map<String, Object> data = new HashMap<>();
            data.put("key", distroKey.getKey());
            data.put("timestamp", System.currentTimeMillis());
            
            // 3. 发送 HTTP 请求
            RestResult<String> result = restTemplate.post(url, data);
            
            if (result.ok()) {
                log.info("同步成功: {}", distroKey);
            }
        } catch (Exception e) {
            log.error("同步失败: {}", distroKey, e);
        }
    }
}    `
`#// naming/src/main/java/com/alibaba/nacos/naming/core/DistroProtocol.java

public class DistroProtocol {
    
    // 同步数据到其他节点
    public void sync(DistroKey key, DataOperation action) {
        // 1. 遍历所有集群节点(除自己)
        for (Member member : memberManager.allMembersWithoutSelf()) {
            // 2. 异步同步(不阻塞主流程)
            distroTaskEngineHolder.getExecuteWorkers().get(member.getAddress())
                .addTask(new DistroSyncTask(key, action, member.getAddress()));
        }
    }
}

// naming/src/main/java/com/alibaba/nacos/naming/core/DistroSyncTask.java

public class DistroSyncTask implements Runnable {
    
    @Override
    public void run() {
        try {
            // 1. 构建 HTTP 请求
            String url = "http://" + targetServer + "/v1/ns/distro/datum";
            
            // 2. 序列化数据
            Map<String, Object> data = new HashMap<>();
            data.put("key", distroKey.getKey());
            data.put("timestamp", System.currentTimeMillis());
            
            // 3. 发送 HTTP 请求
            RestResult<String> result = restTemplate.post(url, data);
            
            if (result.ok()) {
                log.info("同步成功: {}", distroKey);
            }
        } catch (Exception e) {
            log.error("同步失败: {}", distroKey, e);
        }
    }
}    // 同步数据到其他节点`
`#// naming/src/main/java/com/alibaba/nacos/naming/core/DistroProtocol.java

public class DistroProtocol {
    
    // 同步数据到其他节点
    public void sync(DistroKey key, DataOperation action) {
        // 1. 遍历所有集群节点(除自己)
        for (Member member : memberManager.allMembersWithoutSelf()) {
            // 2. 异步同步(不阻塞主流程)
            distroTaskEngineHolder.getExecuteWorkers().get(member.getAddress())
                .addTask(new DistroSyncTask(key, action, member.getAddress()));
        }
    }
}

// naming/src/main/java/com/alibaba/nacos/naming/core/DistroSyncTask.java

public class DistroSyncTask implements Runnable {
    
    @Override
    public void run() {
        try {
            // 1. 构建 HTTP 请求
            String url = "http://" + targetServer + "/v1/ns/distro/datum";
            
            // 2. 序列化数据
            Map<String, Object> data = new HashMap<>();
            data.put("key", distroKey.getKey());
            data.put("timestamp", System.currentTimeMillis());
            
            // 3. 发送 HTTP 请求
            RestResult<String> result = restTemplate.post(url, data);
            
            if (result.ok()) {
                log.info("同步成功: {}", distroKey);
            }
        } catch (Exception e) {
            log.error("同步失败: {}", distroKey, e);
        }
    }
}    public void sync(DistroKey key, DataOperation action) {`
`#// naming/src/main/java/com/alibaba/nacos/naming/core/DistroProtocol.java

public class DistroProtocol {
    
    // 同步数据到其他节点
    public void sync(DistroKey key, DataOperation action) {
        // 1. 遍历所有集群节点(除自己)
        for (Member member : memberManager.allMembersWithoutSelf()) {
            // 2. 异步同步(不阻塞主流程)
            distroTaskEngineHolder.getExecuteWorkers().get(member.getAddress())
                .addTask(new DistroSyncTask(key, action, member.getAddress()));
        }
    }
}

// naming/src/main/java/com/alibaba/nacos/naming/core/DistroSyncTask.java

public class DistroSyncTask implements Runnable {
    
    @Override
    public void run() {
        try {
            // 1. 构建 HTTP 请求
            String url = "http://" + targetServer + "/v1/ns/distro/datum";
            
            // 2. 序列化数据
            Map<String, Object> data = new HashMap<>();
            data.put("key", distroKey.getKey());
            data.put("timestamp", System.currentTimeMillis());
            
            // 3. 发送 HTTP 请求
            RestResult<String> result = restTemplate.post(url, data);
            
            if (result.ok()) {
                log.info("同步成功: {}", distroKey);
            }
        } catch (Exception e) {
            log.error("同步失败: {}", distroKey, e);
        }
    }
}        // 1. 遍历所有集群节点(除自己)`
`#// naming/src/main/java/com/alibaba/nacos/naming/core/DistroProtocol.java

public class DistroProtocol {
    
    // 同步数据到其他节点
    public void sync(DistroKey key, DataOperation action) {
        // 1. 遍历所有集群节点(除自己)
        for (Member member : memberManager.allMembersWithoutSelf()) {
            // 2. 异步同步(不阻塞主流程)
            distroTaskEngineHolder.getExecuteWorkers().get(member.getAddress())
                .addTask(new DistroSyncTask(key, action, member.getAddress()));
        }
    }
}

// naming/src/main/java/com/alibaba/nacos/naming/core/DistroSyncTask.java

public class DistroSyncTask implements Runnable {
    
    @Override
    public void run() {
        try {
            // 1. 构建 HTTP 请求
            String url = "http://" + targetServer + "/v1/ns/distro/datum";
            
            // 2. 序列化数据
            Map<String, Object> data = new HashMap<>();
            data.put("key", distroKey.getKey());
            data.put("timestamp", System.currentTimeMillis());
            
            // 3. 发送 HTTP 请求
            RestResult<String> result = restTemplate.post(url, data);
            
            if (result.ok()) {
                log.info("同步成功: {}", distroKey);
            }
        } catch (Exception e) {
            log.error("同步失败: {}", distroKey, e);
        }
    }
}        for (Member member : memberManager.allMembersWithoutSelf()) {`
`#// naming/src/main/java/com/alibaba/nacos/naming/core/DistroProtocol.java

public class DistroProtocol {
    
    // 同步数据到其他节点
    public void sync(DistroKey key, DataOperation action) {
        // 1. 遍历所有集群节点(除自己)
        for (Member member : memberManager.allMembersWithoutSelf()) {
            // 2. 异步同步(不阻塞主流程)
            distroTaskEngineHolder.getExecuteWorkers().get(member.getAddress())
                .addTask(new DistroSyncTask(key, action, member.getAddress()));
        }
    }
}

// naming/src/main/java/com/alibaba/nacos/naming/core/DistroSyncTask.java

public class DistroSyncTask implements Runnable {
    
    @Override
    public void run() {
        try {
            // 1. 构建 HTTP 请求
            String url = "http://" + targetServer + "/v1/ns/distro/datum";
            
            // 2. 序列化数据
            Map<String, Object> data = new HashMap<>();
            data.put("key", distroKey.getKey());
            data.put("timestamp", System.currentTimeMillis());
            
            // 3. 发送 HTTP 请求
            RestResult<String> result = restTemplate.post(url, data);
            
            if (result.ok()) {
                log.info("同步成功: {}", distroKey);
            }
        } catch (Exception e) {
            log.error("同步失败: {}", distroKey, e);
        }
    }
}            // 2. 异步同步(不阻塞主流程)`
`#// naming/src/main/java/com/alibaba/nacos/naming/core/DistroProtocol.java

public class DistroProtocol {
    
    // 同步数据到其他节点
    public void sync(DistroKey key, DataOperation action) {
        // 1. 遍历所有集群节点(除自己)
        for (Member member : memberManager.allMembersWithoutSelf()) {
            // 2. 异步同步(不阻塞主流程)
            distroTaskEngineHolder.getExecuteWorkers().get(member.getAddress())
                .addTask(new DistroSyncTask(key, action, member.getAddress()));
        }
    }
}

// naming/src/main/java/com/alibaba/nacos/naming/core/DistroSyncTask.java

public class DistroSyncTask implements Runnable {
    
    @Override
    public void run() {
        try {
            // 1. 构建 HTTP 请求
            String url = "http://" + targetServer + "/v1/ns/distro/datum";
            
            // 2. 序列化数据
            Map<String, Object> data = new HashMap<>();
            data.put("key", distroKey.getKey());
            data.put("timestamp", System.currentTimeMillis());
            
            // 3. 发送 HTTP 请求
            RestResult<String> result = restTemplate.post(url, data);
            
            if (result.ok()) {
                log.info("同步成功: {}", distroKey);
            }
        } catch (Exception e) {
            log.error("同步失败: {}", distroKey, e);
        }
    }
}            distroTaskEngineHolder.getExecuteWorkers().get(member.getAddress())`
`#// naming/src/main/java/com/alibaba/nacos/naming/core/DistroProtocol.java

public class DistroProtocol {
    
    // 同步数据到其他节点
    public void sync(DistroKey key, DataOperation action) {
        // 1. 遍历所有集群节点(除自己)
        for (Member member : memberManager.allMembersWithoutSelf()) {
            // 2. 异步同步(不阻塞主流程)
            distroTaskEngineHolder.getExecuteWorkers().get(member.getAddress())
                .addTask(new DistroSyncTask(key, action, member.getAddress()));
        }
    }
}

// naming/src/main/java/com/alibaba/nacos/naming/core/DistroSyncTask.java

public class DistroSyncTask implements Runnable {
    
    @Override
    public void run() {
        try {
            // 1. 构建 HTTP 请求
            String url = "http://" + targetServer + "/v1/ns/distro/datum";
            
            // 2. 序列化数据
            Map<String, Object> data = new HashMap<>();
            data.put("key", distroKey.getKey());
            data.put("timestamp", System.currentTimeMillis());
            
            // 3. 发送 HTTP 请求
            RestResult<String> result = restTemplate.post(url, data);
            
            if (result.ok()) {
                log.info("同步成功: {}", distroKey);
            }
        } catch (Exception e) {
            log.error("同步失败: {}", distroKey, e);
        }
    }
}                .addTask(new DistroSyncTask(key, action, member.getAddress()));`
`#// naming/src/main/java/com/alibaba/nacos/naming/core/DistroProtocol.java

public class DistroProtocol {
    
    // 同步数据到其他节点
    public void sync(DistroKey key, DataOperation action) {
        // 1. 遍历所有集群节点(除自己)
        for (Member member : memberManager.allMembersWithoutSelf()) {
            // 2. 异步同步(不阻塞主流程)
            distroTaskEngineHolder.getExecuteWorkers().get(member.getAddress())
                .addTask(new DistroSyncTask(key, action, member.getAddress()));
        }
    }
}

// naming/src/main/java/com/alibaba/nacos/naming/core/DistroSyncTask.java

public class DistroSyncTask implements Runnable {
    
    @Override
    public void run() {
        try {
            // 1. 构建 HTTP 请求
            String url = "http://" + targetServer + "/v1/ns/distro/datum";
            
            // 2. 序列化数据
            Map<String, Object> data = new HashMap<>();
            data.put("key", distroKey.getKey());
            data.put("timestamp", System.currentTimeMillis());
            
            // 3. 发送 HTTP 请求
            RestResult<String> result = restTemplate.post(url, data);
            
            if (result.ok()) {
                log.info("同步成功: {}", distroKey);
            }
        } catch (Exception e) {
            log.error("同步失败: {}", distroKey, e);
        }
    }
}        }`
`#// naming/src/main/java/com/alibaba/nacos/naming/core/DistroProtocol.java

public class DistroProtocol {
    
    // 同步数据到其他节点
    public void sync(DistroKey key, DataOperation action) {
        // 1. 遍历所有集群节点(除自己)
        for (Member member : memberManager.allMembersWithoutSelf()) {
            // 2. 异步同步(不阻塞主流程)
            distroTaskEngineHolder.getExecuteWorkers().get(member.getAddress())
                .addTask(new DistroSyncTask(key, action, member.getAddress()));
        }
    }
}

// naming/src/main/java/com/alibaba/nacos/naming/core/DistroSyncTask.java

public class DistroSyncTask implements Runnable {
    
    @Override
    public void run() {
        try {
            // 1. 构建 HTTP 请求
            String url = "http://" + targetServer + "/v1/ns/distro/datum";
            
            // 2. 序列化数据
            Map<String, Object> data = new HashMap<>();
            data.put("key", distroKey.getKey());
            data.put("timestamp", System.currentTimeMillis());
            
            // 3. 发送 HTTP 请求
            RestResult<String> result = restTemplate.post(url, data);
            
            if (result.ok()) {
                log.info("同步成功: {}", distroKey);
            }
        } catch (Exception e) {
            log.error("同步失败: {}", distroKey, e);
        }
    }
}    }`
`#// naming/src/main/java/com/alibaba/nacos/naming/core/DistroProtocol.java

public class DistroProtocol {
    
    // 同步数据到其他节点
    public void sync(DistroKey key, DataOperation action) {
        // 1. 遍历所有集群节点(除自己)
        for (Member member : memberManager.allMembersWithoutSelf()) {
            // 2. 异步同步(不阻塞主流程)
            distroTaskEngineHolder.getExecuteWorkers().get(member.getAddress())
                .addTask(new DistroSyncTask(key, action, member.getAddress()));
        }
    }
}

// naming/src/main/java/com/alibaba/nacos/naming/core/DistroSyncTask.java

public class DistroSyncTask implements Runnable {
    
    @Override
    public void run() {
        try {
            // 1. 构建 HTTP 请求
            String url = "http://" + targetServer + "/v1/ns/distro/datum";
            
            // 2. 序列化数据
            Map<String, Object> data = new HashMap<>();
            data.put("key", distroKey.getKey());
            data.put("timestamp", System.currentTimeMillis());
            
            // 3. 发送 HTTP 请求
            RestResult<String> result = restTemplate.post(url, data);
            
            if (result.ok()) {
                log.info("同步成功: {}", distroKey);
            }
        } catch (Exception e) {
            log.error("同步失败: {}", distroKey, e);
        }
    }
}}`
`#// naming/src/main/java/com/alibaba/nacos/naming/core/DistroProtocol.java

public class DistroProtocol {
    
    // 同步数据到其他节点
    public void sync(DistroKey key, DataOperation action) {
        // 1. 遍历所有集群节点(除自己)
        for (Member member : memberManager.allMembersWithoutSelf()) {
            // 2. 异步同步(不阻塞主流程)
            distroTaskEngineHolder.getExecuteWorkers().get(member.getAddress())
                .addTask(new DistroSyncTask(key, action, member.getAddress()));
        }
    }
}

// naming/src/main/java/com/alibaba/nacos/naming/core/DistroSyncTask.java

public class DistroSyncTask implements Runnable {
    
    @Override
    public void run() {
        try {
            // 1. 构建 HTTP 请求
            String url = "http://" + targetServer + "/v1/ns/distro/datum";
            
            // 2. 序列化数据
            Map<String, Object> data = new HashMap<>();
            data.put("key", distroKey.getKey());
            data.put("timestamp", System.currentTimeMillis());
            
            // 3. 发送 HTTP 请求
            RestResult<String> result = restTemplate.post(url, data);
            
            if (result.ok()) {
                log.info("同步成功: {}", distroKey);
            }
        } catch (Exception e) {
            log.error("同步失败: {}", distroKey, e);
        }
    }
}`
`#// naming/src/main/java/com/alibaba/nacos/naming/core/DistroProtocol.java

public class DistroProtocol {
    
    // 同步数据到其他节点
    public void sync(DistroKey key, DataOperation action) {
        // 1. 遍历所有集群节点(除自己)
        for (Member member : memberManager.allMembersWithoutSelf()) {
            // 2. 异步同步(不阻塞主流程)
            distroTaskEngineHolder.getExecuteWorkers().get(member.getAddress())
                .addTask(new DistroSyncTask(key, action, member.getAddress()));
        }
    }
}

// naming/src/main/java/com/alibaba/nacos/naming/core/DistroSyncTask.java

public class DistroSyncTask implements Runnable {
    
    @Override
    public void run() {
        try {
            // 1. 构建 HTTP 请求
            String url = "http://" + targetServer + "/v1/ns/distro/datum";
            
            // 2. 序列化数据
            Map<String, Object> data = new HashMap<>();
            data.put("key", distroKey.getKey());
            data.put("timestamp", System.currentTimeMillis());
            
            // 3. 发送 HTTP 请求
            RestResult<String> result = restTemplate.post(url, data);
            
            if (result.ok()) {
                log.info("同步成功: {}", distroKey);
            }
        } catch (Exception e) {
            log.error("同步失败: {}", distroKey, e);
        }
    }
}// naming/src/main/java/com/alibaba/nacos/naming/core/DistroSyncTask.java`
`#// naming/src/main/java/com/alibaba/nacos/naming/core/DistroProtocol.java

public class DistroProtocol {
    
    // 同步数据到其他节点
    public void sync(DistroKey key, DataOperation action) {
        // 1. 遍历所有集群节点(除自己)
        for (Member member : memberManager.allMembersWithoutSelf()) {
            // 2. 异步同步(不阻塞主流程)
            distroTaskEngineHolder.getExecuteWorkers().get(member.getAddress())
                .addTask(new DistroSyncTask(key, action, member.getAddress()));
        }
    }
}

// naming/src/main/java/com/alibaba/nacos/naming/core/DistroSyncTask.java

public class DistroSyncTask implements Runnable {
    
    @Override
    public void run() {
        try {
            // 1. 构建 HTTP 请求
            String url = "http://" + targetServer + "/v1/ns/distro/datum";
            
            // 2. 序列化数据
            Map<String, Object> data = new HashMap<>();
            data.put("key", distroKey.getKey());
            data.put("timestamp", System.currentTimeMillis());
            
            // 3. 发送 HTTP 请求
            RestResult<String> result = restTemplate.post(url, data);
            
            if (result.ok()) {
                log.info("同步成功: {}", distroKey);
            }
        } catch (Exception e) {
            log.error("同步失败: {}", distroKey, e);
        }
    }
}`
`#// naming/src/main/java/com/alibaba/nacos/naming/core/DistroProtocol.java

public class DistroProtocol {
    
    // 同步数据到其他节点
    public void sync(DistroKey key, DataOperation action) {
        // 1. 遍历所有集群节点(除自己)
        for (Member member : memberManager.allMembersWithoutSelf()) {
            // 2. 异步同步(不阻塞主流程)
            distroTaskEngineHolder.getExecuteWorkers().get(member.getAddress())
                .addTask(new DistroSyncTask(key, action, member.getAddress()));
        }
    }
}

// naming/src/main/java/com/alibaba/nacos/naming/core/DistroSyncTask.java

public class DistroSyncTask implements Runnable {
    
    @Override
    public void run() {
        try {
            // 1. 构建 HTTP 请求
            String url = "http://" + targetServer + "/v1/ns/distro/datum";
            
            // 2. 序列化数据
            Map<String, Object> data = new HashMap<>();
            data.put("key", distroKey.getKey());
            data.put("timestamp", System.currentTimeMillis());
            
            // 3. 发送 HTTP 请求
            RestResult<String> result = restTemplate.post(url, data);
            
            if (result.ok()) {
                log.info("同步成功: {}", distroKey);
            }
        } catch (Exception e) {
            log.error("同步失败: {}", distroKey, e);
        }
    }
}public class DistroSyncTask implements Runnable {`
`#// naming/src/main/java/com/alibaba/nacos/naming/core/DistroProtocol.java

public class DistroProtocol {
    
    // 同步数据到其他节点
    public void sync(DistroKey key, DataOperation action) {
        // 1. 遍历所有集群节点(除自己)
        for (Member member : memberManager.allMembersWithoutSelf()) {
            // 2. 异步同步(不阻塞主流程)
            distroTaskEngineHolder.getExecuteWorkers().get(member.getAddress())
                .addTask(new DistroSyncTask(key, action, member.getAddress()));
        }
    }
}

// naming/src/main/java/com/alibaba/nacos/naming/core/DistroSyncTask.java

public class DistroSyncTask implements Runnable {
    
    @Override
    public void run() {
        try {
            // 1. 构建 HTTP 请求
            String url = "http://" + targetServer + "/v1/ns/distro/datum";
            
            // 2. 序列化数据
            Map<String, Object> data = new HashMap<>();
            data.put("key", distroKey.getKey());
            data.put("timestamp", System.currentTimeMillis());
            
            // 3. 发送 HTTP 请求
            RestResult<String> result = restTemplate.post(url, data);
            
            if (result.ok()) {
                log.info("同步成功: {}", distroKey);
            }
        } catch (Exception e) {
            log.error("同步失败: {}", distroKey, e);
        }
    }
}    `
`#// naming/src/main/java/com/alibaba/nacos/naming/core/DistroProtocol.java

public class DistroProtocol {
    
    // 同步数据到其他节点
    public void sync(DistroKey key, DataOperation action) {
        // 1. 遍历所有集群节点(除自己)
        for (Member member : memberManager.allMembersWithoutSelf()) {
            // 2. 异步同步(不阻塞主流程)
            distroTaskEngineHolder.getExecuteWorkers().get(member.getAddress())
                .addTask(new DistroSyncTask(key, action, member.getAddress()));
        }
    }
}

// naming/src/main/java/com/alibaba/nacos/naming/core/DistroSyncTask.java

public class DistroSyncTask implements Runnable {
    
    @Override
    public void run() {
        try {
            // 1. 构建 HTTP 请求
            String url = "http://" + targetServer + "/v1/ns/distro/datum";
            
            // 2. 序列化数据
            Map<String, Object> data = new HashMap<>();
            data.put("key", distroKey.getKey());
            data.put("timestamp", System.currentTimeMillis());
            
            // 3. 发送 HTTP 请求
            RestResult<String> result = restTemplate.post(url, data);
            
            if (result.ok()) {
                log.info("同步成功: {}", distroKey);
            }
        } catch (Exception e) {
            log.error("同步失败: {}", distroKey, e);
        }
    }
}    @Override`
`#// naming/src/main/java/com/alibaba/nacos/naming/core/DistroProtocol.java

public class DistroProtocol {
    
    // 同步数据到其他节点
    public void sync(DistroKey key, DataOperation action) {
        // 1. 遍历所有集群节点(除自己)
        for (Member member : memberManager.allMembersWithoutSelf()) {
            // 2. 异步同步(不阻塞主流程)
            distroTaskEngineHolder.getExecuteWorkers().get(member.getAddress())
                .addTask(new DistroSyncTask(key, action, member.getAddress()));
        }
    }
}

// naming/src/main/java/com/alibaba/nacos/naming/core/DistroSyncTask.java

public class DistroSyncTask implements Runnable {
    
    @Override
    public void run() {
        try {
            // 1. 构建 HTTP 请求
            String url = "http://" + targetServer + "/v1/ns/distro/datum";
            
            // 2. 序列化数据
            Map<String, Object> data = new HashMap<>();
            data.put("key", distroKey.getKey());
            data.put("timestamp", System.currentTimeMillis());
            
            // 3. 发送 HTTP 请求
            RestResult<String> result = restTemplate.post(url, data);
            
            if (result.ok()) {
                log.info("同步成功: {}", distroKey);
            }
        } catch (Exception e) {
            log.error("同步失败: {}", distroKey, e);
        }
    }
}    public void run() {`
`#// naming/src/main/java/com/alibaba/nacos/naming/core/DistroProtocol.java

public class DistroProtocol {
    
    // 同步数据到其他节点
    public void sync(DistroKey key, DataOperation action) {
        // 1. 遍历所有集群节点(除自己)
        for (Member member : memberManager.allMembersWithoutSelf()) {
            // 2. 异步同步(不阻塞主流程)
            distroTaskEngineHolder.getExecuteWorkers().get(member.getAddress())
                .addTask(new DistroSyncTask(key, action, member.getAddress()));
        }
    }
}

// naming/src/main/java/com/alibaba/nacos/naming/core/DistroSyncTask.java

public class DistroSyncTask implements Runnable {
    
    @Override
    public void run() {
        try {
            // 1. 构建 HTTP 请求
            String url = "http://" + targetServer + "/v1/ns/distro/datum";
            
            // 2. 序列化数据
            Map<String, Object> data = new HashMap<>();
            data.put("key", distroKey.getKey());
            data.put("timestamp", System.currentTimeMillis());
            
            // 3. 发送 HTTP 请求
            RestResult<String> result = restTemplate.post(url, data);
            
            if (result.ok()) {
                log.info("同步成功: {}", distroKey);
            }
        } catch (Exception e) {
            log.error("同步失败: {}", distroKey, e);
        }
    }
}        try {`
`#// naming/src/main/java/com/alibaba/nacos/naming/core/DistroProtocol.java

public class DistroProtocol {
    
    // 同步数据到其他节点
    public void sync(DistroKey key, DataOperation action) {
        // 1. 遍历所有集群节点(除自己)
        for (Member member : memberManager.allMembersWithoutSelf()) {
            // 2. 异步同步(不阻塞主流程)
            distroTaskEngineHolder.getExecuteWorkers().get(member.getAddress())
                .addTask(new DistroSyncTask(key, action, member.getAddress()));
        }
    }
}

// naming/src/main/java/com/alibaba/nacos/naming/core/DistroSyncTask.java

public class DistroSyncTask implements Runnable {
    
    @Override
    public void run() {
        try {
            // 1. 构建 HTTP 请求
            String url = "http://" + targetServer + "/v1/ns/distro/datum";
            
            // 2. 序列化数据
            Map<String, Object> data = new HashMap<>();
            data.put("key", distroKey.getKey());
            data.put("timestamp", System.currentTimeMillis());
            
            // 3. 发送 HTTP 请求
            RestResult<String> result = restTemplate.post(url, data);
            
            if (result.ok()) {
                log.info("同步成功: {}", distroKey);
            }
        } catch (Exception e) {
            log.error("同步失败: {}", distroKey, e);
        }
    }
}            // 1. 构建 HTTP 请求`
`#// naming/src/main/java/com/alibaba/nacos/naming/core/DistroProtocol.java

public class DistroProtocol {
    
    // 同步数据到其他节点
    public void sync(DistroKey key, DataOperation action) {
        // 1. 遍历所有集群节点(除自己)
        for (Member member : memberManager.allMembersWithoutSelf()) {
            // 2. 异步同步(不阻塞主流程)
            distroTaskEngineHolder.getExecuteWorkers().get(member.getAddress())
                .addTask(new DistroSyncTask(key, action, member.getAddress()));
        }
    }
}

// naming/src/main/java/com/alibaba/nacos/naming/core/DistroSyncTask.java

public class DistroSyncTask implements Runnable {
    
    @Override
    public void run() {
        try {
            // 1. 构建 HTTP 请求
            String url = "http://" + targetServer + "/v1/ns/distro/datum";
            
            // 2. 序列化数据
            Map<String, Object> data = new HashMap<>();
            data.put("key", distroKey.getKey());
            data.put("timestamp", System.currentTimeMillis());
            
            // 3. 发送 HTTP 请求
            RestResult<String> result = restTemplate.post(url, data);
            
            if (result.ok()) {
                log.info("同步成功: {}", distroKey);
            }
        } catch (Exception e) {
            log.error("同步失败: {}", distroKey, e);
        }
    }
}            String url = "http://" + targetServer + "/v1/ns/distro/datum";`
`#// naming/src/main/java/com/alibaba/nacos/naming/core/DistroProtocol.java

public class DistroProtocol {
    
    // 同步数据到其他节点
    public void sync(DistroKey key, DataOperation action) {
        // 1. 遍历所有集群节点(除自己)
        for (Member member : memberManager.allMembersWithoutSelf()) {
            // 2. 异步同步(不阻塞主流程)
            distroTaskEngineHolder.getExecuteWorkers().get(member.getAddress())
                .addTask(new DistroSyncTask(key, action, member.getAddress()));
        }
    }
}

// naming/src/main/java/com/alibaba/nacos/naming/core/DistroSyncTask.java

public class DistroSyncTask implements Runnable {
    
    @Override
    public void run() {
        try {
            // 1. 构建 HTTP 请求
            String url = "http://" + targetServer + "/v1/ns/distro/datum";
            
            // 2. 序列化数据
            Map<String, Object> data = new HashMap<>();
            data.put("key", distroKey.getKey());
            data.put("timestamp", System.currentTimeMillis());
            
            // 3. 发送 HTTP 请求
            RestResult<String> result = restTemplate.post(url, data);
            
            if (result.ok()) {
                log.info("同步成功: {}", distroKey);
            }
        } catch (Exception e) {
            log.error("同步失败: {}", distroKey, e);
        }
    }
}            `
`#// naming/src/main/java/com/alibaba/nacos/naming/core/DistroProtocol.java

public class DistroProtocol {
    
    // 同步数据到其他节点
    public void sync(DistroKey key, DataOperation action) {
        // 1. 遍历所有集群节点(除自己)
        for (Member member : memberManager.allMembersWithoutSelf()) {
            // 2. 异步同步(不阻塞主流程)
            distroTaskEngineHolder.getExecuteWorkers().get(member.getAddress())
                .addTask(new DistroSyncTask(key, action, member.getAddress()));
        }
    }
}

// naming/src/main/java/com/alibaba/nacos/naming/core/DistroSyncTask.java

public class DistroSyncTask implements Runnable {
    
    @Override
    public void run() {
        try {
            // 1. 构建 HTTP 请求
            String url = "http://" + targetServer + "/v1/ns/distro/datum";
            
            // 2. 序列化数据
            Map<String, Object> data = new HashMap<>();
            data.put("key", distroKey.getKey());
            data.put("timestamp", System.currentTimeMillis());
            
            // 3. 发送 HTTP 请求
            RestResult<String> result = restTemplate.post(url, data);
            
            if (result.ok()) {
                log.info("同步成功: {}", distroKey);
            }
        } catch (Exception e) {
            log.error("同步失败: {}", distroKey, e);
        }
    }
}            // 2. 序列化数据`
`#// naming/src/main/java/com/alibaba/nacos/naming/core/DistroProtocol.java

public class DistroProtocol {
    
    // 同步数据到其他节点
    public void sync(DistroKey key, DataOperation action) {
        // 1. 遍历所有集群节点(除自己)
        for (Member member : memberManager.allMembersWithoutSelf()) {
            // 2. 异步同步(不阻塞主流程)
            distroTaskEngineHolder.getExecuteWorkers().get(member.getAddress())
                .addTask(new DistroSyncTask(key, action, member.getAddress()));
        }
    }
}

// naming/src/main/java/com/alibaba/nacos/naming/core/DistroSyncTask.java

public class DistroSyncTask implements Runnable {
    
    @Override
    public void run() {
        try {
            // 1. 构建 HTTP 请求
            String url = "http://" + targetServer + "/v1/ns/distro/datum";
            
            // 2. 序列化数据
            Map<String, Object> data = new HashMap<>();
            data.put("key", distroKey.getKey());
            data.put("timestamp", System.currentTimeMillis());
            
            // 3. 发送 HTTP 请求
            RestResult<String> result = restTemplate.post(url, data);
            
            if (result.ok()) {
                log.info("同步成功: {}", distroKey);
            }
        } catch (Exception e) {
            log.error("同步失败: {}", distroKey, e);
        }
    }
}            Map<String, Object> data = new HashMap<>();`
`#// naming/src/main/java/com/alibaba/nacos/naming/core/DistroProtocol.java

public class DistroProtocol {
    
    // 同步数据到其他节点
    public void sync(DistroKey key, DataOperation action) {
        // 1. 遍历所有集群节点(除自己)
        for (Member member : memberManager.allMembersWithoutSelf()) {
            // 2. 异步同步(不阻塞主流程)
            distroTaskEngineHolder.getExecuteWorkers().get(member.getAddress())
                .addTask(new DistroSyncTask(key, action, member.getAddress()));
        }
    }
}

// naming/src/main/java/com/alibaba/nacos/naming/core/DistroSyncTask.java

public class DistroSyncTask implements Runnable {
    
    @Override
    public void run() {
        try {
            // 1. 构建 HTTP 请求
            String url = "http://" + targetServer + "/v1/ns/distro/datum";
            
            // 2. 序列化数据
            Map<String, Object> data = new HashMap<>();
            data.put("key", distroKey.getKey());
            data.put("timestamp", System.currentTimeMillis());
            
            // 3. 发送 HTTP 请求
            RestResult<String> result = restTemplate.post(url, data);
            
            if (result.ok()) {
                log.info("同步成功: {}", distroKey);
            }
        } catch (Exception e) {
            log.error("同步失败: {}", distroKey, e);
        }
    }
}            data.put("key", distroKey.getKey());`
`#// naming/src/main/java/com/alibaba/nacos/naming/core/DistroProtocol.java

public class DistroProtocol {
    
    // 同步数据到其他节点
    public void sync(DistroKey key, DataOperation action) {
        // 1. 遍历所有集群节点(除自己)
        for (Member member : memberManager.allMembersWithoutSelf()) {
            // 2. 异步同步(不阻塞主流程)
            distroTaskEngineHolder.getExecuteWorkers().get(member.getAddress())
                .addTask(new DistroSyncTask(key, action, member.getAddress()));
        }
    }
}

// naming/src/main/java/com/alibaba/nacos/naming/core/DistroSyncTask.java

public class DistroSyncTask implements Runnable {
    
    @Override
    public void run() {
        try {
            // 1. 构建 HTTP 请求
            String url = "http://" + targetServer + "/v1/ns/distro/datum";
            
            // 2. 序列化数据
            Map<String, Object> data = new HashMap<>();
            data.put("key", distroKey.getKey());
            data.put("timestamp", System.currentTimeMillis());
            
            // 3. 发送 HTTP 请求
            RestResult<String> result = restTemplate.post(url, data);
            
            if (result.ok()) {
                log.info("同步成功: {}", distroKey);
            }
        } catch (Exception e) {
            log.error("同步失败: {}", distroKey, e);
        }
    }
}            data.put("timestamp", System.currentTimeMillis());`
`#// naming/src/main/java/com/alibaba/nacos/naming/core/DistroProtocol.java

public class DistroProtocol {
    
    // 同步数据到其他节点
    public void sync(DistroKey key, DataOperation action) {
        // 1. 遍历所有集群节点(除自己)
        for (Member member : memberManager.allMembersWithoutSelf()) {
            // 2. 异步同步(不阻塞主流程)
            distroTaskEngineHolder.getExecuteWorkers().get(member.getAddress())
                .addTask(new DistroSyncTask(key, action, member.getAddress()));
        }
    }
}

// naming/src/main/java/com/alibaba/nacos/naming/core/DistroSyncTask.java

public class DistroSyncTask implements Runnable {
    
    @Override
    public void run() {
        try {
            // 1. 构建 HTTP 请求
            String url = "http://" + targetServer + "/v1/ns/distro/datum";
            
            // 2. 序列化数据
            Map<String, Object> data = new HashMap<>();
            data.put("key", distroKey.getKey());
            data.put("timestamp", System.currentTimeMillis());
            
            // 3. 发送 HTTP 请求
            RestResult<String> result = restTemplate.post(url, data);
            
            if (result.ok()) {
                log.info("同步成功: {}", distroKey);
            }
        } catch (Exception e) {
            log.error("同步失败: {}", distroKey, e);
        }
    }
}            `
`#// naming/src/main/java/com/alibaba/nacos/naming/core/DistroProtocol.java

public class DistroProtocol {
    
    // 同步数据到其他节点
    public void sync(DistroKey key, DataOperation action) {
        // 1. 遍历所有集群节点(除自己)
        for (Member member : memberManager.allMembersWithoutSelf()) {
            // 2. 异步同步(不阻塞主流程)
            distroTaskEngineHolder.getExecuteWorkers().get(member.getAddress())
                .addTask(new DistroSyncTask(key, action, member.getAddress()));
        }
    }
}

// naming/src/main/java/com/alibaba/nacos/naming/core/DistroSyncTask.java

public class DistroSyncTask implements Runnable {
    
    @Override
    public void run() {
        try {
            // 1. 构建 HTTP 请求
            String url = "http://" + targetServer + "/v1/ns/distro/datum";
            
            // 2. 序列化数据
            Map<String, Object> data = new HashMap<>();
            data.put("key", distroKey.getKey());
            data.put("timestamp", System.currentTimeMillis());
            
            // 3. 发送 HTTP 请求
            RestResult<String> result = restTemplate.post(url, data);
            
            if (result.ok()) {
                log.info("同步成功: {}", distroKey);
            }
        } catch (Exception e) {
            log.error("同步失败: {}", distroKey, e);
        }
    }
}            // 3. 发送 HTTP 请求`
`#// naming/src/main/java/com/alibaba/nacos/naming/core/DistroProtocol.java

public class DistroProtocol {
    
    // 同步数据到其他节点
    public void sync(DistroKey key, DataOperation action) {
        // 1. 遍历所有集群节点(除自己)
        for (Member member : memberManager.allMembersWithoutSelf()) {
            // 2. 异步同步(不阻塞主流程)
            distroTaskEngineHolder.getExecuteWorkers().get(member.getAddress())
                .addTask(new DistroSyncTask(key, action, member.getAddress()));
        }
    }
}

// naming/src/main/java/com/alibaba/nacos/naming/core/DistroSyncTask.java

public class DistroSyncTask implements Runnable {
    
    @Override
    public void run() {
        try {
            // 1. 构建 HTTP 请求
            String url = "http://" + targetServer + "/v1/ns/distro/datum";
            
            // 2. 序列化数据
            Map<String, Object> data = new HashMap<>();
            data.put("key", distroKey.getKey());
            data.put("timestamp", System.currentTimeMillis());
            
            // 3. 发送 HTTP 请求
            RestResult<String> result = restTemplate.post(url, data);
            
            if (result.ok()) {
                log.info("同步成功: {}", distroKey);
            }
        } catch (Exception e) {
            log.error("同步失败: {}", distroKey, e);
        }
    }
}            RestResult<String> result = restTemplate.post(url, data);`
`#// naming/src/main/java/com/alibaba/nacos/naming/core/DistroProtocol.java

public class DistroProtocol {
    
    // 同步数据到其他节点
    public void sync(DistroKey key, DataOperation action) {
        // 1. 遍历所有集群节点(除自己)
        for (Member member : memberManager.allMembersWithoutSelf()) {
            // 2. 异步同步(不阻塞主流程)
            distroTaskEngineHolder.getExecuteWorkers().get(member.getAddress())
                .addTask(new DistroSyncTask(key, action, member.getAddress()));
        }
    }
}

// naming/src/main/java/com/alibaba/nacos/naming/core/DistroSyncTask.java

public class DistroSyncTask implements Runnable {
    
    @Override
    public void run() {
        try {
            // 1. 构建 HTTP 请求
            String url = "http://" + targetServer + "/v1/ns/distro/datum";
            
            // 2. 序列化数据
            Map<String, Object> data = new HashMap<>();
            data.put("key", distroKey.getKey());
            data.put("timestamp", System.currentTimeMillis());
            
            // 3. 发送 HTTP 请求
            RestResult<String> result = restTemplate.post(url, data);
            
            if (result.ok()) {
                log.info("同步成功: {}", distroKey);
            }
        } catch (Exception e) {
            log.error("同步失败: {}", distroKey, e);
        }
    }
}            `
`#// naming/src/main/java/com/alibaba/nacos/naming/core/DistroProtocol.java

public class DistroProtocol {
    
    // 同步数据到其他节点
    public void sync(DistroKey key, DataOperation action) {
        // 1. 遍历所有集群节点(除自己)
        for (Member member : memberManager.allMembersWithoutSelf()) {
            // 2. 异步同步(不阻塞主流程)
            distroTaskEngineHolder.getExecuteWorkers().get(member.getAddress())
                .addTask(new DistroSyncTask(key, action, member.getAddress()));
        }
    }
}

// naming/src/main/java/com/alibaba/nacos/naming/core/DistroSyncTask.java

public class DistroSyncTask implements Runnable {
    
    @Override
    public void run() {
        try {
            // 1. 构建 HTTP 请求
            String url = "http://" + targetServer + "/v1/ns/distro/datum";
            
            // 2. 序列化数据
            Map<String, Object> data = new HashMap<>();
            data.put("key", distroKey.getKey());
            data.put("timestamp", System.currentTimeMillis());
            
            // 3. 发送 HTTP 请求
            RestResult<String> result = restTemplate.post(url, data);
            
            if (result.ok()) {
                log.info("同步成功: {}", distroKey);
            }
        } catch (Exception e) {
            log.error("同步失败: {}", distroKey, e);
        }
    }
}            if (result.ok()) {`
`#// naming/src/main/java/com/alibaba/nacos/naming/core/DistroProtocol.java

public class DistroProtocol {
    
    // 同步数据到其他节点
    public void sync(DistroKey key, DataOperation action) {
        // 1. 遍历所有集群节点(除自己)
        for (Member member : memberManager.allMembersWithoutSelf()) {
            // 2. 异步同步(不阻塞主流程)
            distroTaskEngineHolder.getExecuteWorkers().get(member.getAddress())
                .addTask(new DistroSyncTask(key, action, member.getAddress()));
        }
    }
}

// naming/src/main/java/com/alibaba/nacos/naming/core/DistroSyncTask.java

public class DistroSyncTask implements Runnable {
    
    @Override
    public void run() {
        try {
            // 1. 构建 HTTP 请求
            String url = "http://" + targetServer + "/v1/ns/distro/datum";
            
            // 2. 序列化数据
            Map<String, Object> data = new HashMap<>();
            data.put("key", distroKey.getKey());
            data.put("timestamp", System.currentTimeMillis());
            
            // 3. 发送 HTTP 请求
            RestResult<String> result = restTemplate.post(url, data);
            
            if (result.ok()) {
                log.info("同步成功: {}", distroKey);
            }
        } catch (Exception e) {
            log.error("同步失败: {}", distroKey, e);
        }
    }
}                log.info("同步成功: {}", distroKey);`
`#// naming/src/main/java/com/alibaba/nacos/naming/core/DistroProtocol.java

public class DistroProtocol {
    
    // 同步数据到其他节点
    public void sync(DistroKey key, DataOperation action) {
        // 1. 遍历所有集群节点(除自己)
        for (Member member : memberManager.allMembersWithoutSelf()) {
            // 2. 异步同步(不阻塞主流程)
            distroTaskEngineHolder.getExecuteWorkers().get(member.getAddress())
                .addTask(new DistroSyncTask(key, action, member.getAddress()));
        }
    }
}

// naming/src/main/java/com/alibaba/nacos/naming/core/DistroSyncTask.java

public class DistroSyncTask implements Runnable {
    
    @Override
    public void run() {
        try {
            // 1. 构建 HTTP 请求
            String url = "http://" + targetServer + "/v1/ns/distro/datum";
            
            // 2. 序列化数据
            Map<String, Object> data = new HashMap<>();
            data.put("key", distroKey.getKey());
            data.put("timestamp", System.currentTimeMillis());
            
            // 3. 发送 HTTP 请求
            RestResult<String> result = restTemplate.post(url, data);
            
            if (result.ok()) {
                log.info("同步成功: {}", distroKey);
            }
        } catch (Exception e) {
            log.error("同步失败: {}", distroKey, e);
        }
    }
}            }`
`#// naming/src/main/java/com/alibaba/nacos/naming/core/DistroProtocol.java

public class DistroProtocol {
    
    // 同步数据到其他节点
    public void sync(DistroKey key, DataOperation action) {
        // 1. 遍历所有集群节点(除自己)
        for (Member member : memberManager.allMembersWithoutSelf()) {
            // 2. 异步同步(不阻塞主流程)
            distroTaskEngineHolder.getExecuteWorkers().get(member.getAddress())
                .addTask(new DistroSyncTask(key, action, member.getAddress()));
        }
    }
}

// naming/src/main/java/com/alibaba/nacos/naming/core/DistroSyncTask.java

public class DistroSyncTask implements Runnable {
    
    @Override
    public void run() {
        try {
            // 1. 构建 HTTP 请求
            String url = "http://" + targetServer + "/v1/ns/distro/datum";
            
            // 2. 序列化数据
            Map<String, Object> data = new HashMap<>();
            data.put("key", distroKey.getKey());
            data.put("timestamp", System.currentTimeMillis());
            
            // 3. 发送 HTTP 请求
            RestResult<String> result = restTemplate.post(url, data);
            
            if (result.ok()) {
                log.info("同步成功: {}", distroKey);
            }
        } catch (Exception e) {
            log.error("同步失败: {}", distroKey, e);
        }
    }
}        } catch (Exception e) {`
`#// naming/src/main/java/com/alibaba/nacos/naming/core/DistroProtocol.java

public class DistroProtocol {
    
    // 同步数据到其他节点
    public void sync(DistroKey key, DataOperation action) {
        // 1. 遍历所有集群节点(除自己)
        for (Member member : memberManager.allMembersWithoutSelf()) {
            // 2. 异步同步(不阻塞主流程)
            distroTaskEngineHolder.getExecuteWorkers().get(member.getAddress())
                .addTask(new DistroSyncTask(key, action, member.getAddress()));
        }
    }
}

// naming/src/main/java/com/alibaba/nacos/naming/core/DistroSyncTask.java

public class DistroSyncTask implements Runnable {
    
    @Override
    public void run() {
        try {
            // 1. 构建 HTTP 请求
            String url = "http://" + targetServer + "/v1/ns/distro/datum";
            
            // 2. 序列化数据
            Map<String, Object> data = new HashMap<>();
            data.put("key", distroKey.getKey());
            data.put("timestamp", System.currentTimeMillis());
            
            // 3. 发送 HTTP 请求
            RestResult<String> result = restTemplate.post(url, data);
            
            if (result.ok()) {
                log.info("同步成功: {}", distroKey);
            }
        } catch (Exception e) {
            log.error("同步失败: {}", distroKey, e);
        }
    }
}            log.error("同步失败: {}", distroKey, e);`
`#// naming/src/main/java/com/alibaba/nacos/naming/core/DistroProtocol.java

public class DistroProtocol {
    
    // 同步数据到其他节点
    public void sync(DistroKey key, DataOperation action) {
        // 1. 遍历所有集群节点(除自己)
        for (Member member : memberManager.allMembersWithoutSelf()) {
            // 2. 异步同步(不阻塞主流程)
            distroTaskEngineHolder.getExecuteWorkers().get(member.getAddress())
                .addTask(new DistroSyncTask(key, action, member.getAddress()));
        }
    }
}

// naming/src/main/java/com/alibaba/nacos/naming/core/DistroSyncTask.java

public class DistroSyncTask implements Runnable {
    
    @Override
    public void run() {
        try {
            // 1. 构建 HTTP 请求
            String url = "http://" + targetServer + "/v1/ns/distro/datum";
            
            // 2. 序列化数据
            Map<String, Object> data = new HashMap<>();
            data.put("key", distroKey.getKey());
            data.put("timestamp", System.currentTimeMillis());
            
            // 3. 发送 HTTP 请求
            RestResult<String> result = restTemplate.post(url, data);
            
            if (result.ok()) {
                log.info("同步成功: {}", distroKey);
            }
        } catch (Exception e) {
            log.error("同步失败: {}", distroKey, e);
        }
    }
}        }`
`#// naming/src/main/java/com/alibaba/nacos/naming/core/DistroProtocol.java

public class DistroProtocol {
    
    // 同步数据到其他节点
    public void sync(DistroKey key, DataOperation action) {
        // 1. 遍历所有集群节点(除自己)
        for (Member member : memberManager.allMembersWithoutSelf()) {
            // 2. 异步同步(不阻塞主流程)
            distroTaskEngineHolder.getExecuteWorkers().get(member.getAddress())
                .addTask(new DistroSyncTask(key, action, member.getAddress()));
        }
    }
}

// naming/src/main/java/com/alibaba/nacos/naming/core/DistroSyncTask.java

public class DistroSyncTask implements Runnable {
    
    @Override
    public void run() {
        try {
            // 1. 构建 HTTP 请求
            String url = "http://" + targetServer + "/v1/ns/distro/datum";
            
            // 2. 序列化数据
            Map<String, Object> data = new HashMap<>();
            data.put("key", distroKey.getKey());
            data.put("timestamp", System.currentTimeMillis());
            
            // 3. 发送 HTTP 请求
            RestResult<String> result = restTemplate.post(url, data);
            
            if (result.ok()) {
                log.info("同步成功: {}", distroKey);
            }
        } catch (Exception e) {
            log.error("同步失败: {}", distroKey, e);
        }
    }
}    }`
`#// naming/src/main/java/com/alibaba/nacos/naming/core/DistroProtocol.java

public class DistroProtocol {
    
    // 同步数据到其他节点
    public void sync(DistroKey key, DataOperation action) {
        // 1. 遍历所有集群节点(除自己)
        for (Member member : memberManager.allMembersWithoutSelf()) {
            // 2. 异步同步(不阻塞主流程)
            distroTaskEngineHolder.getExecuteWorkers().get(member.getAddress())
                .addTask(new DistroSyncTask(key, action, member.getAddress()));
        }
    }
}

// naming/src/main/java/com/alibaba/nacos/naming/core/DistroSyncTask.java

public class DistroSyncTask implements Runnable {
    
    @Override
    public void run() {
        try {
            // 1. 构建 HTTP 请求
            String url = "http://" + targetServer + "/v1/ns/distro/datum";
            
            // 2. 序列化数据
            Map<String, Object> data = new HashMap<>();
            data.put("key", distroKey.getKey());
            data.put("timestamp", System.currentTimeMillis());
            
            // 3. 发送 HTTP 请求
            RestResult<String> result = restTemplate.post(url, data);
            
            if (result.ok()) {
                log.info("同步成功: {}", distroKey);
            }
        } catch (Exception e) {
            log.error("同步失败: {}", distroKey, e);
        }
    }
}}

3.4 版本冲突处理

java 复制代码
#// naming/src/main/java/com/alibaba/nacos/naming/consistency/distro/DistroConsistencyServiceImpl.java

public void onDatum(DistroDatum datum) {
    // 1. 获取本地数据
    Datum localDatum = dataStore.get(datum.key);
    
    // 2. 版本校验
    if (localDatum != null && localDatum.timestamp > datum.timestamp) {
        // 本地数据更新,丢弃远程数据
        log.warn("丢弃旧数据: local={}, remote={}", localDatum.timestamp, datum.timestamp);
        return;
    }
    
    // 3. 应用远程数据
    dataStore.put(datum.key, datum);
    
    // 4. 通知监听器
    notifyListener(datum.key, DataOperation.CHANGE);
}// naming/src/main/java/com/alibaba/nacos/naming/consistency/distro/DistroConsistencyServiceImpl.java`
`#// naming/src/main/java/com/alibaba/nacos/naming/consistency/distro/DistroConsistencyServiceImpl.java

public void onDatum(DistroDatum datum) {
    // 1. 获取本地数据
    Datum localDatum = dataStore.get(datum.key);
    
    // 2. 版本校验
    if (localDatum != null && localDatum.timestamp > datum.timestamp) {
        // 本地数据更新,丢弃远程数据
        log.warn("丢弃旧数据: local={}, remote={}", localDatum.timestamp, datum.timestamp);
        return;
    }
    
    // 3. 应用远程数据
    dataStore.put(datum.key, datum);
    
    // 4. 通知监听器
    notifyListener(datum.key, DataOperation.CHANGE);
}`
`#// naming/src/main/java/com/alibaba/nacos/naming/consistency/distro/DistroConsistencyServiceImpl.java

public void onDatum(DistroDatum datum) {
    // 1. 获取本地数据
    Datum localDatum = dataStore.get(datum.key);
    
    // 2. 版本校验
    if (localDatum != null && localDatum.timestamp > datum.timestamp) {
        // 本地数据更新,丢弃远程数据
        log.warn("丢弃旧数据: local={}, remote={}", localDatum.timestamp, datum.timestamp);
        return;
    }
    
    // 3. 应用远程数据
    dataStore.put(datum.key, datum);
    
    // 4. 通知监听器
    notifyListener(datum.key, DataOperation.CHANGE);
}public void onDatum(DistroDatum datum) {`
`#// naming/src/main/java/com/alibaba/nacos/naming/consistency/distro/DistroConsistencyServiceImpl.java

public void onDatum(DistroDatum datum) {
    // 1. 获取本地数据
    Datum localDatum = dataStore.get(datum.key);
    
    // 2. 版本校验
    if (localDatum != null && localDatum.timestamp > datum.timestamp) {
        // 本地数据更新,丢弃远程数据
        log.warn("丢弃旧数据: local={}, remote={}", localDatum.timestamp, datum.timestamp);
        return;
    }
    
    // 3. 应用远程数据
    dataStore.put(datum.key, datum);
    
    // 4. 通知监听器
    notifyListener(datum.key, DataOperation.CHANGE);
}    // 1. 获取本地数据`
`#// naming/src/main/java/com/alibaba/nacos/naming/consistency/distro/DistroConsistencyServiceImpl.java

public void onDatum(DistroDatum datum) {
    // 1. 获取本地数据
    Datum localDatum = dataStore.get(datum.key);
    
    // 2. 版本校验
    if (localDatum != null && localDatum.timestamp > datum.timestamp) {
        // 本地数据更新,丢弃远程数据
        log.warn("丢弃旧数据: local={}, remote={}", localDatum.timestamp, datum.timestamp);
        return;
    }
    
    // 3. 应用远程数据
    dataStore.put(datum.key, datum);
    
    // 4. 通知监听器
    notifyListener(datum.key, DataOperation.CHANGE);
}    Datum localDatum = dataStore.get(datum.key);`
`#// naming/src/main/java/com/alibaba/nacos/naming/consistency/distro/DistroConsistencyServiceImpl.java

public void onDatum(DistroDatum datum) {
    // 1. 获取本地数据
    Datum localDatum = dataStore.get(datum.key);
    
    // 2. 版本校验
    if (localDatum != null && localDatum.timestamp > datum.timestamp) {
        // 本地数据更新,丢弃远程数据
        log.warn("丢弃旧数据: local={}, remote={}", localDatum.timestamp, datum.timestamp);
        return;
    }
    
    // 3. 应用远程数据
    dataStore.put(datum.key, datum);
    
    // 4. 通知监听器
    notifyListener(datum.key, DataOperation.CHANGE);
}    `
`#// naming/src/main/java/com/alibaba/nacos/naming/consistency/distro/DistroConsistencyServiceImpl.java

public void onDatum(DistroDatum datum) {
    // 1. 获取本地数据
    Datum localDatum = dataStore.get(datum.key);
    
    // 2. 版本校验
    if (localDatum != null && localDatum.timestamp > datum.timestamp) {
        // 本地数据更新,丢弃远程数据
        log.warn("丢弃旧数据: local={}, remote={}", localDatum.timestamp, datum.timestamp);
        return;
    }
    
    // 3. 应用远程数据
    dataStore.put(datum.key, datum);
    
    // 4. 通知监听器
    notifyListener(datum.key, DataOperation.CHANGE);
}    // 2. 版本校验`
`#// naming/src/main/java/com/alibaba/nacos/naming/consistency/distro/DistroConsistencyServiceImpl.java

public void onDatum(DistroDatum datum) {
    // 1. 获取本地数据
    Datum localDatum = dataStore.get(datum.key);
    
    // 2. 版本校验
    if (localDatum != null && localDatum.timestamp > datum.timestamp) {
        // 本地数据更新,丢弃远程数据
        log.warn("丢弃旧数据: local={}, remote={}", localDatum.timestamp, datum.timestamp);
        return;
    }
    
    // 3. 应用远程数据
    dataStore.put(datum.key, datum);
    
    // 4. 通知监听器
    notifyListener(datum.key, DataOperation.CHANGE);
}    if (localDatum != null && localDatum.timestamp > datum.timestamp) {`
`#// naming/src/main/java/com/alibaba/nacos/naming/consistency/distro/DistroConsistencyServiceImpl.java

public void onDatum(DistroDatum datum) {
    // 1. 获取本地数据
    Datum localDatum = dataStore.get(datum.key);
    
    // 2. 版本校验
    if (localDatum != null && localDatum.timestamp > datum.timestamp) {
        // 本地数据更新,丢弃远程数据
        log.warn("丢弃旧数据: local={}, remote={}", localDatum.timestamp, datum.timestamp);
        return;
    }
    
    // 3. 应用远程数据
    dataStore.put(datum.key, datum);
    
    // 4. 通知监听器
    notifyListener(datum.key, DataOperation.CHANGE);
}        // 本地数据更新,丢弃远程数据`
`#// naming/src/main/java/com/alibaba/nacos/naming/consistency/distro/DistroConsistencyServiceImpl.java

public void onDatum(DistroDatum datum) {
    // 1. 获取本地数据
    Datum localDatum = dataStore.get(datum.key);
    
    // 2. 版本校验
    if (localDatum != null && localDatum.timestamp > datum.timestamp) {
        // 本地数据更新,丢弃远程数据
        log.warn("丢弃旧数据: local={}, remote={}", localDatum.timestamp, datum.timestamp);
        return;
    }
    
    // 3. 应用远程数据
    dataStore.put(datum.key, datum);
    
    // 4. 通知监听器
    notifyListener(datum.key, DataOperation.CHANGE);
}        log.warn("丢弃旧数据: local={}, remote={}", localDatum.timestamp, datum.timestamp);`
`#// naming/src/main/java/com/alibaba/nacos/naming/consistency/distro/DistroConsistencyServiceImpl.java

public void onDatum(DistroDatum datum) {
    // 1. 获取本地数据
    Datum localDatum = dataStore.get(datum.key);
    
    // 2. 版本校验
    if (localDatum != null && localDatum.timestamp > datum.timestamp) {
        // 本地数据更新,丢弃远程数据
        log.warn("丢弃旧数据: local={}, remote={}", localDatum.timestamp, datum.timestamp);
        return;
    }
    
    // 3. 应用远程数据
    dataStore.put(datum.key, datum);
    
    // 4. 通知监听器
    notifyListener(datum.key, DataOperation.CHANGE);
}        return;`
`#// naming/src/main/java/com/alibaba/nacos/naming/consistency/distro/DistroConsistencyServiceImpl.java

public void onDatum(DistroDatum datum) {
    // 1. 获取本地数据
    Datum localDatum = dataStore.get(datum.key);
    
    // 2. 版本校验
    if (localDatum != null && localDatum.timestamp > datum.timestamp) {
        // 本地数据更新,丢弃远程数据
        log.warn("丢弃旧数据: local={}, remote={}", localDatum.timestamp, datum.timestamp);
        return;
    }
    
    // 3. 应用远程数据
    dataStore.put(datum.key, datum);
    
    // 4. 通知监听器
    notifyListener(datum.key, DataOperation.CHANGE);
}    }`
`#// naming/src/main/java/com/alibaba/nacos/naming/consistency/distro/DistroConsistencyServiceImpl.java

public void onDatum(DistroDatum datum) {
    // 1. 获取本地数据
    Datum localDatum = dataStore.get(datum.key);
    
    // 2. 版本校验
    if (localDatum != null && localDatum.timestamp > datum.timestamp) {
        // 本地数据更新,丢弃远程数据
        log.warn("丢弃旧数据: local={}, remote={}", localDatum.timestamp, datum.timestamp);
        return;
    }
    
    // 3. 应用远程数据
    dataStore.put(datum.key, datum);
    
    // 4. 通知监听器
    notifyListener(datum.key, DataOperation.CHANGE);
}    `
`#// naming/src/main/java/com/alibaba/nacos/naming/consistency/distro/DistroConsistencyServiceImpl.java

public void onDatum(DistroDatum datum) {
    // 1. 获取本地数据
    Datum localDatum = dataStore.get(datum.key);
    
    // 2. 版本校验
    if (localDatum != null && localDatum.timestamp > datum.timestamp) {
        // 本地数据更新,丢弃远程数据
        log.warn("丢弃旧数据: local={}, remote={}", localDatum.timestamp, datum.timestamp);
        return;
    }
    
    // 3. 应用远程数据
    dataStore.put(datum.key, datum);
    
    // 4. 通知监听器
    notifyListener(datum.key, DataOperation.CHANGE);
}    // 3. 应用远程数据`
`#// naming/src/main/java/com/alibaba/nacos/naming/consistency/distro/DistroConsistencyServiceImpl.java

public void onDatum(DistroDatum datum) {
    // 1. 获取本地数据
    Datum localDatum = dataStore.get(datum.key);
    
    // 2. 版本校验
    if (localDatum != null && localDatum.timestamp > datum.timestamp) {
        // 本地数据更新,丢弃远程数据
        log.warn("丢弃旧数据: local={}, remote={}", localDatum.timestamp, datum.timestamp);
        return;
    }
    
    // 3. 应用远程数据
    dataStore.put(datum.key, datum);
    
    // 4. 通知监听器
    notifyListener(datum.key, DataOperation.CHANGE);
}    dataStore.put(datum.key, datum);`
`#// naming/src/main/java/com/alibaba/nacos/naming/consistency/distro/DistroConsistencyServiceImpl.java

public void onDatum(DistroDatum datum) {
    // 1. 获取本地数据
    Datum localDatum = dataStore.get(datum.key);
    
    // 2. 版本校验
    if (localDatum != null && localDatum.timestamp > datum.timestamp) {
        // 本地数据更新,丢弃远程数据
        log.warn("丢弃旧数据: local={}, remote={}", localDatum.timestamp, datum.timestamp);
        return;
    }
    
    // 3. 应用远程数据
    dataStore.put(datum.key, datum);
    
    // 4. 通知监听器
    notifyListener(datum.key, DataOperation.CHANGE);
}    `
`#// naming/src/main/java/com/alibaba/nacos/naming/consistency/distro/DistroConsistencyServiceImpl.java

public void onDatum(DistroDatum datum) {
    // 1. 获取本地数据
    Datum localDatum = dataStore.get(datum.key);
    
    // 2. 版本校验
    if (localDatum != null && localDatum.timestamp > datum.timestamp) {
        // 本地数据更新,丢弃远程数据
        log.warn("丢弃旧数据: local={}, remote={}", localDatum.timestamp, datum.timestamp);
        return;
    }
    
    // 3. 应用远程数据
    dataStore.put(datum.key, datum);
    
    // 4. 通知监听器
    notifyListener(datum.key, DataOperation.CHANGE);
}    // 4. 通知监听器`
`#// naming/src/main/java/com/alibaba/nacos/naming/consistency/distro/DistroConsistencyServiceImpl.java

public void onDatum(DistroDatum datum) {
    // 1. 获取本地数据
    Datum localDatum = dataStore.get(datum.key);
    
    // 2. 版本校验
    if (localDatum != null && localDatum.timestamp > datum.timestamp) {
        // 本地数据更新,丢弃远程数据
        log.warn("丢弃旧数据: local={}, remote={}", localDatum.timestamp, datum.timestamp);
        return;
    }
    
    // 3. 应用远程数据
    dataStore.put(datum.key, datum);
    
    // 4. 通知监听器
    notifyListener(datum.key, DataOperation.CHANGE);
}    notifyListener(datum.key, DataOperation.CHANGE);`
`#// naming/src/main/java/com/alibaba/nacos/naming/consistency/distro/DistroConsistencyServiceImpl.java

public void onDatum(DistroDatum datum) {
    // 1. 获取本地数据
    Datum localDatum = dataStore.get(datum.key);
    
    // 2. 版本校验
    if (localDatum != null && localDatum.timestamp > datum.timestamp) {
        // 本地数据更新,丢弃远程数据
        log.warn("丢弃旧数据: local={}, remote={}", localDatum.timestamp, datum.timestamp);
        return;
    }
    
    // 3. 应用远程数据
    dataStore.put(datum.key, datum);
    
    // 4. 通知监听器
    notifyListener(datum.key, DataOperation.CHANGE);
}}

四、健康检查与故障自愈

4.1 客户端心跳机制

java 复制代码
#// 客户端心跳代码(Spring Cloud Alibaba Nacos Discovery)

@Configuration
public class NacosDiscoveryClientConfig {
    
    @Bean
    public NacosNamingService nacosNamingService() {
        Properties properties = new Properties();
        properties.put("serverAddr", "127.0.0.1:8848");
        properties.put("namespace", "public");
        
        return new NacosNamingService(properties);
    }
    
    @Scheduled(fixedRate = 5000) // 每 5 秒发送心跳
    public void sendBeat() {
        try {
            Instance instance = new Instance();
            instance.setIp(InetAddress.getLocalHost().getHostAddress());
            instance.setPort(8080);
            instance.setServiceName("user-service");
            
            // 发送心跳
            BeatInfo beatInfo = new BeatInfo();
            beatInfo.setServiceName("user-service");
            beatInfo.setIp(instance.getIp());
            beatInfo.setPort(instance.getPort());
            beatInfo.setPeriod(5000); // 心跳间隔
            
            nacosNamingService.sendBeat(beatInfo);
        } catch (Exception e) {
            log.error("心跳发送失败", e);
        }
    }
}// 客户端心跳代码(Spring Cloud Alibaba Nacos Discovery)`
`#// 客户端心跳代码(Spring Cloud Alibaba Nacos Discovery)

@Configuration
public class NacosDiscoveryClientConfig {
    
    @Bean
    public NacosNamingService nacosNamingService() {
        Properties properties = new Properties();
        properties.put("serverAddr", "127.0.0.1:8848");
        properties.put("namespace", "public");
        
        return new NacosNamingService(properties);
    }
    
    @Scheduled(fixedRate = 5000) // 每 5 秒发送心跳
    public void sendBeat() {
        try {
            Instance instance = new Instance();
            instance.setIp(InetAddress.getLocalHost().getHostAddress());
            instance.setPort(8080);
            instance.setServiceName("user-service");
            
            // 发送心跳
            BeatInfo beatInfo = new BeatInfo();
            beatInfo.setServiceName("user-service");
            beatInfo.setIp(instance.getIp());
            beatInfo.setPort(instance.getPort());
            beatInfo.setPeriod(5000); // 心跳间隔
            
            nacosNamingService.sendBeat(beatInfo);
        } catch (Exception e) {
            log.error("心跳发送失败", e);
        }
    }
}`
`#// 客户端心跳代码(Spring Cloud Alibaba Nacos Discovery)

@Configuration
public class NacosDiscoveryClientConfig {
    
    @Bean
    public NacosNamingService nacosNamingService() {
        Properties properties = new Properties();
        properties.put("serverAddr", "127.0.0.1:8848");
        properties.put("namespace", "public");
        
        return new NacosNamingService(properties);
    }
    
    @Scheduled(fixedRate = 5000) // 每 5 秒发送心跳
    public void sendBeat() {
        try {
            Instance instance = new Instance();
            instance.setIp(InetAddress.getLocalHost().getHostAddress());
            instance.setPort(8080);
            instance.setServiceName("user-service");
            
            // 发送心跳
            BeatInfo beatInfo = new BeatInfo();
            beatInfo.setServiceName("user-service");
            beatInfo.setIp(instance.getIp());
            beatInfo.setPort(instance.getPort());
            beatInfo.setPeriod(5000); // 心跳间隔
            
            nacosNamingService.sendBeat(beatInfo);
        } catch (Exception e) {
            log.error("心跳发送失败", e);
        }
    }
}@Configuration`
`#// 客户端心跳代码(Spring Cloud Alibaba Nacos Discovery)

@Configuration
public class NacosDiscoveryClientConfig {
    
    @Bean
    public NacosNamingService nacosNamingService() {
        Properties properties = new Properties();
        properties.put("serverAddr", "127.0.0.1:8848");
        properties.put("namespace", "public");
        
        return new NacosNamingService(properties);
    }
    
    @Scheduled(fixedRate = 5000) // 每 5 秒发送心跳
    public void sendBeat() {
        try {
            Instance instance = new Instance();
            instance.setIp(InetAddress.getLocalHost().getHostAddress());
            instance.setPort(8080);
            instance.setServiceName("user-service");
            
            // 发送心跳
            BeatInfo beatInfo = new BeatInfo();
            beatInfo.setServiceName("user-service");
            beatInfo.setIp(instance.getIp());
            beatInfo.setPort(instance.getPort());
            beatInfo.setPeriod(5000); // 心跳间隔
            
            nacosNamingService.sendBeat(beatInfo);
        } catch (Exception e) {
            log.error("心跳发送失败", e);
        }
    }
}public class NacosDiscoveryClientConfig {`
`#// 客户端心跳代码(Spring Cloud Alibaba Nacos Discovery)

@Configuration
public class NacosDiscoveryClientConfig {
    
    @Bean
    public NacosNamingService nacosNamingService() {
        Properties properties = new Properties();
        properties.put("serverAddr", "127.0.0.1:8848");
        properties.put("namespace", "public");
        
        return new NacosNamingService(properties);
    }
    
    @Scheduled(fixedRate = 5000) // 每 5 秒发送心跳
    public void sendBeat() {
        try {
            Instance instance = new Instance();
            instance.setIp(InetAddress.getLocalHost().getHostAddress());
            instance.setPort(8080);
            instance.setServiceName("user-service");
            
            // 发送心跳
            BeatInfo beatInfo = new BeatInfo();
            beatInfo.setServiceName("user-service");
            beatInfo.setIp(instance.getIp());
            beatInfo.setPort(instance.getPort());
            beatInfo.setPeriod(5000); // 心跳间隔
            
            nacosNamingService.sendBeat(beatInfo);
        } catch (Exception e) {
            log.error("心跳发送失败", e);
        }
    }
}    `
`#// 客户端心跳代码(Spring Cloud Alibaba Nacos Discovery)

@Configuration
public class NacosDiscoveryClientConfig {
    
    @Bean
    public NacosNamingService nacosNamingService() {
        Properties properties = new Properties();
        properties.put("serverAddr", "127.0.0.1:8848");
        properties.put("namespace", "public");
        
        return new NacosNamingService(properties);
    }
    
    @Scheduled(fixedRate = 5000) // 每 5 秒发送心跳
    public void sendBeat() {
        try {
            Instance instance = new Instance();
            instance.setIp(InetAddress.getLocalHost().getHostAddress());
            instance.setPort(8080);
            instance.setServiceName("user-service");
            
            // 发送心跳
            BeatInfo beatInfo = new BeatInfo();
            beatInfo.setServiceName("user-service");
            beatInfo.setIp(instance.getIp());
            beatInfo.setPort(instance.getPort());
            beatInfo.setPeriod(5000); // 心跳间隔
            
            nacosNamingService.sendBeat(beatInfo);
        } catch (Exception e) {
            log.error("心跳发送失败", e);
        }
    }
}    @Bean`
`#// 客户端心跳代码(Spring Cloud Alibaba Nacos Discovery)

@Configuration
public class NacosDiscoveryClientConfig {
    
    @Bean
    public NacosNamingService nacosNamingService() {
        Properties properties = new Properties();
        properties.put("serverAddr", "127.0.0.1:8848");
        properties.put("namespace", "public");
        
        return new NacosNamingService(properties);
    }
    
    @Scheduled(fixedRate = 5000) // 每 5 秒发送心跳
    public void sendBeat() {
        try {
            Instance instance = new Instance();
            instance.setIp(InetAddress.getLocalHost().getHostAddress());
            instance.setPort(8080);
            instance.setServiceName("user-service");
            
            // 发送心跳
            BeatInfo beatInfo = new BeatInfo();
            beatInfo.setServiceName("user-service");
            beatInfo.setIp(instance.getIp());
            beatInfo.setPort(instance.getPort());
            beatInfo.setPeriod(5000); // 心跳间隔
            
            nacosNamingService.sendBeat(beatInfo);
        } catch (Exception e) {
            log.error("心跳发送失败", e);
        }
    }
}    public NacosNamingService nacosNamingService() {`
`#// 客户端心跳代码(Spring Cloud Alibaba Nacos Discovery)

@Configuration
public class NacosDiscoveryClientConfig {
    
    @Bean
    public NacosNamingService nacosNamingService() {
        Properties properties = new Properties();
        properties.put("serverAddr", "127.0.0.1:8848");
        properties.put("namespace", "public");
        
        return new NacosNamingService(properties);
    }
    
    @Scheduled(fixedRate = 5000) // 每 5 秒发送心跳
    public void sendBeat() {
        try {
            Instance instance = new Instance();
            instance.setIp(InetAddress.getLocalHost().getHostAddress());
            instance.setPort(8080);
            instance.setServiceName("user-service");
            
            // 发送心跳
            BeatInfo beatInfo = new BeatInfo();
            beatInfo.setServiceName("user-service");
            beatInfo.setIp(instance.getIp());
            beatInfo.setPort(instance.getPort());
            beatInfo.setPeriod(5000); // 心跳间隔
            
            nacosNamingService.sendBeat(beatInfo);
        } catch (Exception e) {
            log.error("心跳发送失败", e);
        }
    }
}        Properties properties = new Properties();`
`#// 客户端心跳代码(Spring Cloud Alibaba Nacos Discovery)

@Configuration
public class NacosDiscoveryClientConfig {
    
    @Bean
    public NacosNamingService nacosNamingService() {
        Properties properties = new Properties();
        properties.put("serverAddr", "127.0.0.1:8848");
        properties.put("namespace", "public");
        
        return new NacosNamingService(properties);
    }
    
    @Scheduled(fixedRate = 5000) // 每 5 秒发送心跳
    public void sendBeat() {
        try {
            Instance instance = new Instance();
            instance.setIp(InetAddress.getLocalHost().getHostAddress());
            instance.setPort(8080);
            instance.setServiceName("user-service");
            
            // 发送心跳
            BeatInfo beatInfo = new BeatInfo();
            beatInfo.setServiceName("user-service");
            beatInfo.setIp(instance.getIp());
            beatInfo.setPort(instance.getPort());
            beatInfo.setPeriod(5000); // 心跳间隔
            
            nacosNamingService.sendBeat(beatInfo);
        } catch (Exception e) {
            log.error("心跳发送失败", e);
        }
    }
}        properties.put("serverAddr", "127.0.0.1:8848");`
`#// 客户端心跳代码(Spring Cloud Alibaba Nacos Discovery)

@Configuration
public class NacosDiscoveryClientConfig {
    
    @Bean
    public NacosNamingService nacosNamingService() {
        Properties properties = new Properties();
        properties.put("serverAddr", "127.0.0.1:8848");
        properties.put("namespace", "public");
        
        return new NacosNamingService(properties);
    }
    
    @Scheduled(fixedRate = 5000) // 每 5 秒发送心跳
    public void sendBeat() {
        try {
            Instance instance = new Instance();
            instance.setIp(InetAddress.getLocalHost().getHostAddress());
            instance.setPort(8080);
            instance.setServiceName("user-service");
            
            // 发送心跳
            BeatInfo beatInfo = new BeatInfo();
            beatInfo.setServiceName("user-service");
            beatInfo.setIp(instance.getIp());
            beatInfo.setPort(instance.getPort());
            beatInfo.setPeriod(5000); // 心跳间隔
            
            nacosNamingService.sendBeat(beatInfo);
        } catch (Exception e) {
            log.error("心跳发送失败", e);
        }
    }
}        properties.put("namespace", "public");`
`#// 客户端心跳代码(Spring Cloud Alibaba Nacos Discovery)

@Configuration
public class NacosDiscoveryClientConfig {
    
    @Bean
    public NacosNamingService nacosNamingService() {
        Properties properties = new Properties();
        properties.put("serverAddr", "127.0.0.1:8848");
        properties.put("namespace", "public");
        
        return new NacosNamingService(properties);
    }
    
    @Scheduled(fixedRate = 5000) // 每 5 秒发送心跳
    public void sendBeat() {
        try {
            Instance instance = new Instance();
            instance.setIp(InetAddress.getLocalHost().getHostAddress());
            instance.setPort(8080);
            instance.setServiceName("user-service");
            
            // 发送心跳
            BeatInfo beatInfo = new BeatInfo();
            beatInfo.setServiceName("user-service");
            beatInfo.setIp(instance.getIp());
            beatInfo.setPort(instance.getPort());
            beatInfo.setPeriod(5000); // 心跳间隔
            
            nacosNamingService.sendBeat(beatInfo);
        } catch (Exception e) {
            log.error("心跳发送失败", e);
        }
    }
}        `
`#// 客户端心跳代码(Spring Cloud Alibaba Nacos Discovery)

@Configuration
public class NacosDiscoveryClientConfig {
    
    @Bean
    public NacosNamingService nacosNamingService() {
        Properties properties = new Properties();
        properties.put("serverAddr", "127.0.0.1:8848");
        properties.put("namespace", "public");
        
        return new NacosNamingService(properties);
    }
    
    @Scheduled(fixedRate = 5000) // 每 5 秒发送心跳
    public void sendBeat() {
        try {
            Instance instance = new Instance();
            instance.setIp(InetAddress.getLocalHost().getHostAddress());
            instance.setPort(8080);
            instance.setServiceName("user-service");
            
            // 发送心跳
            BeatInfo beatInfo = new BeatInfo();
            beatInfo.setServiceName("user-service");
            beatInfo.setIp(instance.getIp());
            beatInfo.setPort(instance.getPort());
            beatInfo.setPeriod(5000); // 心跳间隔
            
            nacosNamingService.sendBeat(beatInfo);
        } catch (Exception e) {
            log.error("心跳发送失败", e);
        }
    }
}        return new NacosNamingService(properties);`
`#// 客户端心跳代码(Spring Cloud Alibaba Nacos Discovery)

@Configuration
public class NacosDiscoveryClientConfig {
    
    @Bean
    public NacosNamingService nacosNamingService() {
        Properties properties = new Properties();
        properties.put("serverAddr", "127.0.0.1:8848");
        properties.put("namespace", "public");
        
        return new NacosNamingService(properties);
    }
    
    @Scheduled(fixedRate = 5000) // 每 5 秒发送心跳
    public void sendBeat() {
        try {
            Instance instance = new Instance();
            instance.setIp(InetAddress.getLocalHost().getHostAddress());
            instance.setPort(8080);
            instance.setServiceName("user-service");
            
            // 发送心跳
            BeatInfo beatInfo = new BeatInfo();
            beatInfo.setServiceName("user-service");
            beatInfo.setIp(instance.getIp());
            beatInfo.setPort(instance.getPort());
            beatInfo.setPeriod(5000); // 心跳间隔
            
            nacosNamingService.sendBeat(beatInfo);
        } catch (Exception e) {
            log.error("心跳发送失败", e);
        }
    }
}    }`
`#// 客户端心跳代码(Spring Cloud Alibaba Nacos Discovery)

@Configuration
public class NacosDiscoveryClientConfig {
    
    @Bean
    public NacosNamingService nacosNamingService() {
        Properties properties = new Properties();
        properties.put("serverAddr", "127.0.0.1:8848");
        properties.put("namespace", "public");
        
        return new NacosNamingService(properties);
    }
    
    @Scheduled(fixedRate = 5000) // 每 5 秒发送心跳
    public void sendBeat() {
        try {
            Instance instance = new Instance();
            instance.setIp(InetAddress.getLocalHost().getHostAddress());
            instance.setPort(8080);
            instance.setServiceName("user-service");
            
            // 发送心跳
            BeatInfo beatInfo = new BeatInfo();
            beatInfo.setServiceName("user-service");
            beatInfo.setIp(instance.getIp());
            beatInfo.setPort(instance.getPort());
            beatInfo.setPeriod(5000); // 心跳间隔
            
            nacosNamingService.sendBeat(beatInfo);
        } catch (Exception e) {
            log.error("心跳发送失败", e);
        }
    }
}    `
`#// 客户端心跳代码(Spring Cloud Alibaba Nacos Discovery)

@Configuration
public class NacosDiscoveryClientConfig {
    
    @Bean
    public NacosNamingService nacosNamingService() {
        Properties properties = new Properties();
        properties.put("serverAddr", "127.0.0.1:8848");
        properties.put("namespace", "public");
        
        return new NacosNamingService(properties);
    }
    
    @Scheduled(fixedRate = 5000) // 每 5 秒发送心跳
    public void sendBeat() {
        try {
            Instance instance = new Instance();
            instance.setIp(InetAddress.getLocalHost().getHostAddress());
            instance.setPort(8080);
            instance.setServiceName("user-service");
            
            // 发送心跳
            BeatInfo beatInfo = new BeatInfo();
            beatInfo.setServiceName("user-service");
            beatInfo.setIp(instance.getIp());
            beatInfo.setPort(instance.getPort());
            beatInfo.setPeriod(5000); // 心跳间隔
            
            nacosNamingService.sendBeat(beatInfo);
        } catch (Exception e) {
            log.error("心跳发送失败", e);
        }
    }
}    @Scheduled(fixedRate = 5000) // 每 5 秒发送心跳`
`#// 客户端心跳代码(Spring Cloud Alibaba Nacos Discovery)

@Configuration
public class NacosDiscoveryClientConfig {
    
    @Bean
    public NacosNamingService nacosNamingService() {
        Properties properties = new Properties();
        properties.put("serverAddr", "127.0.0.1:8848");
        properties.put("namespace", "public");
        
        return new NacosNamingService(properties);
    }
    
    @Scheduled(fixedRate = 5000) // 每 5 秒发送心跳
    public void sendBeat() {
        try {
            Instance instance = new Instance();
            instance.setIp(InetAddress.getLocalHost().getHostAddress());
            instance.setPort(8080);
            instance.setServiceName("user-service");
            
            // 发送心跳
            BeatInfo beatInfo = new BeatInfo();
            beatInfo.setServiceName("user-service");
            beatInfo.setIp(instance.getIp());
            beatInfo.setPort(instance.getPort());
            beatInfo.setPeriod(5000); // 心跳间隔
            
            nacosNamingService.sendBeat(beatInfo);
        } catch (Exception e) {
            log.error("心跳发送失败", e);
        }
    }
}    public void sendBeat() {`
`#// 客户端心跳代码(Spring Cloud Alibaba Nacos Discovery)

@Configuration
public class NacosDiscoveryClientConfig {
    
    @Bean
    public NacosNamingService nacosNamingService() {
        Properties properties = new Properties();
        properties.put("serverAddr", "127.0.0.1:8848");
        properties.put("namespace", "public");
        
        return new NacosNamingService(properties);
    }
    
    @Scheduled(fixedRate = 5000) // 每 5 秒发送心跳
    public void sendBeat() {
        try {
            Instance instance = new Instance();
            instance.setIp(InetAddress.getLocalHost().getHostAddress());
            instance.setPort(8080);
            instance.setServiceName("user-service");
            
            // 发送心跳
            BeatInfo beatInfo = new BeatInfo();
            beatInfo.setServiceName("user-service");
            beatInfo.setIp(instance.getIp());
            beatInfo.setPort(instance.getPort());
            beatInfo.setPeriod(5000); // 心跳间隔
            
            nacosNamingService.sendBeat(beatInfo);
        } catch (Exception e) {
            log.error("心跳发送失败", e);
        }
    }
}        try {`
`#// 客户端心跳代码(Spring Cloud Alibaba Nacos Discovery)

@Configuration
public class NacosDiscoveryClientConfig {
    
    @Bean
    public NacosNamingService nacosNamingService() {
        Properties properties = new Properties();
        properties.put("serverAddr", "127.0.0.1:8848");
        properties.put("namespace", "public");
        
        return new NacosNamingService(properties);
    }
    
    @Scheduled(fixedRate = 5000) // 每 5 秒发送心跳
    public void sendBeat() {
        try {
            Instance instance = new Instance();
            instance.setIp(InetAddress.getLocalHost().getHostAddress());
            instance.setPort(8080);
            instance.setServiceName("user-service");
            
            // 发送心跳
            BeatInfo beatInfo = new BeatInfo();
            beatInfo.setServiceName("user-service");
            beatInfo.setIp(instance.getIp());
            beatInfo.setPort(instance.getPort());
            beatInfo.setPeriod(5000); // 心跳间隔
            
            nacosNamingService.sendBeat(beatInfo);
        } catch (Exception e) {
            log.error("心跳发送失败", e);
        }
    }
}            Instance instance = new Instance();`
`#// 客户端心跳代码(Spring Cloud Alibaba Nacos Discovery)

@Configuration
public class NacosDiscoveryClientConfig {
    
    @Bean
    public NacosNamingService nacosNamingService() {
        Properties properties = new Properties();
        properties.put("serverAddr", "127.0.0.1:8848");
        properties.put("namespace", "public");
        
        return new NacosNamingService(properties);
    }
    
    @Scheduled(fixedRate = 5000) // 每 5 秒发送心跳
    public void sendBeat() {
        try {
            Instance instance = new Instance();
            instance.setIp(InetAddress.getLocalHost().getHostAddress());
            instance.setPort(8080);
            instance.setServiceName("user-service");
            
            // 发送心跳
            BeatInfo beatInfo = new BeatInfo();
            beatInfo.setServiceName("user-service");
            beatInfo.setIp(instance.getIp());
            beatInfo.setPort(instance.getPort());
            beatInfo.setPeriod(5000); // 心跳间隔
            
            nacosNamingService.sendBeat(beatInfo);
        } catch (Exception e) {
            log.error("心跳发送失败", e);
        }
    }
}            instance.setIp(InetAddress.getLocalHost().getHostAddress());`
`#// 客户端心跳代码(Spring Cloud Alibaba Nacos Discovery)

@Configuration
public class NacosDiscoveryClientConfig {
    
    @Bean
    public NacosNamingService nacosNamingService() {
        Properties properties = new Properties();
        properties.put("serverAddr", "127.0.0.1:8848");
        properties.put("namespace", "public");
        
        return new NacosNamingService(properties);
    }
    
    @Scheduled(fixedRate = 5000) // 每 5 秒发送心跳
    public void sendBeat() {
        try {
            Instance instance = new Instance();
            instance.setIp(InetAddress.getLocalHost().getHostAddress());
            instance.setPort(8080);
            instance.setServiceName("user-service");
            
            // 发送心跳
            BeatInfo beatInfo = new BeatInfo();
            beatInfo.setServiceName("user-service");
            beatInfo.setIp(instance.getIp());
            beatInfo.setPort(instance.getPort());
            beatInfo.setPeriod(5000); // 心跳间隔
            
            nacosNamingService.sendBeat(beatInfo);
        } catch (Exception e) {
            log.error("心跳发送失败", e);
        }
    }
}            instance.setPort(8080);`
`#// 客户端心跳代码(Spring Cloud Alibaba Nacos Discovery)

@Configuration
public class NacosDiscoveryClientConfig {
    
    @Bean
    public NacosNamingService nacosNamingService() {
        Properties properties = new Properties();
        properties.put("serverAddr", "127.0.0.1:8848");
        properties.put("namespace", "public");
        
        return new NacosNamingService(properties);
    }
    
    @Scheduled(fixedRate = 5000) // 每 5 秒发送心跳
    public void sendBeat() {
        try {
            Instance instance = new Instance();
            instance.setIp(InetAddress.getLocalHost().getHostAddress());
            instance.setPort(8080);
            instance.setServiceName("user-service");
            
            // 发送心跳
            BeatInfo beatInfo = new BeatInfo();
            beatInfo.setServiceName("user-service");
            beatInfo.setIp(instance.getIp());
            beatInfo.setPort(instance.getPort());
            beatInfo.setPeriod(5000); // 心跳间隔
            
            nacosNamingService.sendBeat(beatInfo);
        } catch (Exception e) {
            log.error("心跳发送失败", e);
        }
    }
}            instance.setServiceName("user-service");`
`#// 客户端心跳代码(Spring Cloud Alibaba Nacos Discovery)

@Configuration
public class NacosDiscoveryClientConfig {
    
    @Bean
    public NacosNamingService nacosNamingService() {
        Properties properties = new Properties();
        properties.put("serverAddr", "127.0.0.1:8848");
        properties.put("namespace", "public");
        
        return new NacosNamingService(properties);
    }
    
    @Scheduled(fixedRate = 5000) // 每 5 秒发送心跳
    public void sendBeat() {
        try {
            Instance instance = new Instance();
            instance.setIp(InetAddress.getLocalHost().getHostAddress());
            instance.setPort(8080);
            instance.setServiceName("user-service");
            
            // 发送心跳
            BeatInfo beatInfo = new BeatInfo();
            beatInfo.setServiceName("user-service");
            beatInfo.setIp(instance.getIp());
            beatInfo.setPort(instance.getPort());
            beatInfo.setPeriod(5000); // 心跳间隔
            
            nacosNamingService.sendBeat(beatInfo);
        } catch (Exception e) {
            log.error("心跳发送失败", e);
        }
    }
}            `
`#// 客户端心跳代码(Spring Cloud Alibaba Nacos Discovery)

@Configuration
public class NacosDiscoveryClientConfig {
    
    @Bean
    public NacosNamingService nacosNamingService() {
        Properties properties = new Properties();
        properties.put("serverAddr", "127.0.0.1:8848");
        properties.put("namespace", "public");
        
        return new NacosNamingService(properties);
    }
    
    @Scheduled(fixedRate = 5000) // 每 5 秒发送心跳
    public void sendBeat() {
        try {
            Instance instance = new Instance();
            instance.setIp(InetAddress.getLocalHost().getHostAddress());
            instance.setPort(8080);
            instance.setServiceName("user-service");
            
            // 发送心跳
            BeatInfo beatInfo = new BeatInfo();
            beatInfo.setServiceName("user-service");
            beatInfo.setIp(instance.getIp());
            beatInfo.setPort(instance.getPort());
            beatInfo.setPeriod(5000); // 心跳间隔
            
            nacosNamingService.sendBeat(beatInfo);
        } catch (Exception e) {
            log.error("心跳发送失败", e);
        }
    }
}            // 发送心跳`
`#// 客户端心跳代码(Spring Cloud Alibaba Nacos Discovery)

@Configuration
public class NacosDiscoveryClientConfig {
    
    @Bean
    public NacosNamingService nacosNamingService() {
        Properties properties = new Properties();
        properties.put("serverAddr", "127.0.0.1:8848");
        properties.put("namespace", "public");
        
        return new NacosNamingService(properties);
    }
    
    @Scheduled(fixedRate = 5000) // 每 5 秒发送心跳
    public void sendBeat() {
        try {
            Instance instance = new Instance();
            instance.setIp(InetAddress.getLocalHost().getHostAddress());
            instance.setPort(8080);
            instance.setServiceName("user-service");
            
            // 发送心跳
            BeatInfo beatInfo = new BeatInfo();
            beatInfo.setServiceName("user-service");
            beatInfo.setIp(instance.getIp());
            beatInfo.setPort(instance.getPort());
            beatInfo.setPeriod(5000); // 心跳间隔
            
            nacosNamingService.sendBeat(beatInfo);
        } catch (Exception e) {
            log.error("心跳发送失败", e);
        }
    }
}            BeatInfo beatInfo = new BeatInfo();`
`#// 客户端心跳代码(Spring Cloud Alibaba Nacos Discovery)

@Configuration
public class NacosDiscoveryClientConfig {
    
    @Bean
    public NacosNamingService nacosNamingService() {
        Properties properties = new Properties();
        properties.put("serverAddr", "127.0.0.1:8848");
        properties.put("namespace", "public");
        
        return new NacosNamingService(properties);
    }
    
    @Scheduled(fixedRate = 5000) // 每 5 秒发送心跳
    public void sendBeat() {
        try {
            Instance instance = new Instance();
            instance.setIp(InetAddress.getLocalHost().getHostAddress());
            instance.setPort(8080);
            instance.setServiceName("user-service");
            
            // 发送心跳
            BeatInfo beatInfo = new BeatInfo();
            beatInfo.setServiceName("user-service");
            beatInfo.setIp(instance.getIp());
            beatInfo.setPort(instance.getPort());
            beatInfo.setPeriod(5000); // 心跳间隔
            
            nacosNamingService.sendBeat(beatInfo);
        } catch (Exception e) {
            log.error("心跳发送失败", e);
        }
    }
}            beatInfo.setServiceName("user-service");`
`#// 客户端心跳代码(Spring Cloud Alibaba Nacos Discovery)

@Configuration
public class NacosDiscoveryClientConfig {
    
    @Bean
    public NacosNamingService nacosNamingService() {
        Properties properties = new Properties();
        properties.put("serverAddr", "127.0.0.1:8848");
        properties.put("namespace", "public");
        
        return new NacosNamingService(properties);
    }
    
    @Scheduled(fixedRate = 5000) // 每 5 秒发送心跳
    public void sendBeat() {
        try {
            Instance instance = new Instance();
            instance.setIp(InetAddress.getLocalHost().getHostAddress());
            instance.setPort(8080);
            instance.setServiceName("user-service");
            
            // 发送心跳
            BeatInfo beatInfo = new BeatInfo();
            beatInfo.setServiceName("user-service");
            beatInfo.setIp(instance.getIp());
            beatInfo.setPort(instance.getPort());
            beatInfo.setPeriod(5000); // 心跳间隔
            
            nacosNamingService.sendBeat(beatInfo);
        } catch (Exception e) {
            log.error("心跳发送失败", e);
        }
    }
}            beatInfo.setIp(instance.getIp());`
`#// 客户端心跳代码(Spring Cloud Alibaba Nacos Discovery)

@Configuration
public class NacosDiscoveryClientConfig {
    
    @Bean
    public NacosNamingService nacosNamingService() {
        Properties properties = new Properties();
        properties.put("serverAddr", "127.0.0.1:8848");
        properties.put("namespace", "public");
        
        return new NacosNamingService(properties);
    }
    
    @Scheduled(fixedRate = 5000) // 每 5 秒发送心跳
    public void sendBeat() {
        try {
            Instance instance = new Instance();
            instance.setIp(InetAddress.getLocalHost().getHostAddress());
            instance.setPort(8080);
            instance.setServiceName("user-service");
            
            // 发送心跳
            BeatInfo beatInfo = new BeatInfo();
            beatInfo.setServiceName("user-service");
            beatInfo.setIp(instance.getIp());
            beatInfo.setPort(instance.getPort());
            beatInfo.setPeriod(5000); // 心跳间隔
            
            nacosNamingService.sendBeat(beatInfo);
        } catch (Exception e) {
            log.error("心跳发送失败", e);
        }
    }
}            beatInfo.setPort(instance.getPort());`
`#// 客户端心跳代码(Spring Cloud Alibaba Nacos Discovery)

@Configuration
public class NacosDiscoveryClientConfig {
    
    @Bean
    public NacosNamingService nacosNamingService() {
        Properties properties = new Properties();
        properties.put("serverAddr", "127.0.0.1:8848");
        properties.put("namespace", "public");
        
        return new NacosNamingService(properties);
    }
    
    @Scheduled(fixedRate = 5000) // 每 5 秒发送心跳
    public void sendBeat() {
        try {
            Instance instance = new Instance();
            instance.setIp(InetAddress.getLocalHost().getHostAddress());
            instance.setPort(8080);
            instance.setServiceName("user-service");
            
            // 发送心跳
            BeatInfo beatInfo = new BeatInfo();
            beatInfo.setServiceName("user-service");
            beatInfo.setIp(instance.getIp());
            beatInfo.setPort(instance.getPort());
            beatInfo.setPeriod(5000); // 心跳间隔
            
            nacosNamingService.sendBeat(beatInfo);
        } catch (Exception e) {
            log.error("心跳发送失败", e);
        }
    }
}            beatInfo.setPeriod(5000); // 心跳间隔`
`#// 客户端心跳代码(Spring Cloud Alibaba Nacos Discovery)

@Configuration
public class NacosDiscoveryClientConfig {
    
    @Bean
    public NacosNamingService nacosNamingService() {
        Properties properties = new Properties();
        properties.put("serverAddr", "127.0.0.1:8848");
        properties.put("namespace", "public");
        
        return new NacosNamingService(properties);
    }
    
    @Scheduled(fixedRate = 5000) // 每 5 秒发送心跳
    public void sendBeat() {
        try {
            Instance instance = new Instance();
            instance.setIp(InetAddress.getLocalHost().getHostAddress());
            instance.setPort(8080);
            instance.setServiceName("user-service");
            
            // 发送心跳
            BeatInfo beatInfo = new BeatInfo();
            beatInfo.setServiceName("user-service");
            beatInfo.setIp(instance.getIp());
            beatInfo.setPort(instance.getPort());
            beatInfo.setPeriod(5000); // 心跳间隔
            
            nacosNamingService.sendBeat(beatInfo);
        } catch (Exception e) {
            log.error("心跳发送失败", e);
        }
    }
}            `
`#// 客户端心跳代码(Spring Cloud Alibaba Nacos Discovery)

@Configuration
public class NacosDiscoveryClientConfig {
    
    @Bean
    public NacosNamingService nacosNamingService() {
        Properties properties = new Properties();
        properties.put("serverAddr", "127.0.0.1:8848");
        properties.put("namespace", "public");
        
        return new NacosNamingService(properties);
    }
    
    @Scheduled(fixedRate = 5000) // 每 5 秒发送心跳
    public void sendBeat() {
        try {
            Instance instance = new Instance();
            instance.setIp(InetAddress.getLocalHost().getHostAddress());
            instance.setPort(8080);
            instance.setServiceName("user-service");
            
            // 发送心跳
            BeatInfo beatInfo = new BeatInfo();
            beatInfo.setServiceName("user-service");
            beatInfo.setIp(instance.getIp());
            beatInfo.setPort(instance.getPort());
            beatInfo.setPeriod(5000); // 心跳间隔
            
            nacosNamingService.sendBeat(beatInfo);
        } catch (Exception e) {
            log.error("心跳发送失败", e);
        }
    }
}            nacosNamingService.sendBeat(beatInfo);`
`#// 客户端心跳代码(Spring Cloud Alibaba Nacos Discovery)

@Configuration
public class NacosDiscoveryClientConfig {
    
    @Bean
    public NacosNamingService nacosNamingService() {
        Properties properties = new Properties();
        properties.put("serverAddr", "127.0.0.1:8848");
        properties.put("namespace", "public");
        
        return new NacosNamingService(properties);
    }
    
    @Scheduled(fixedRate = 5000) // 每 5 秒发送心跳
    public void sendBeat() {
        try {
            Instance instance = new Instance();
            instance.setIp(InetAddress.getLocalHost().getHostAddress());
            instance.setPort(8080);
            instance.setServiceName("user-service");
            
            // 发送心跳
            BeatInfo beatInfo = new BeatInfo();
            beatInfo.setServiceName("user-service");
            beatInfo.setIp(instance.getIp());
            beatInfo.setPort(instance.getPort());
            beatInfo.setPeriod(5000); // 心跳间隔
            
            nacosNamingService.sendBeat(beatInfo);
        } catch (Exception e) {
            log.error("心跳发送失败", e);
        }
    }
}        } catch (Exception e) {`
`#// 客户端心跳代码(Spring Cloud Alibaba Nacos Discovery)

@Configuration
public class NacosDiscoveryClientConfig {
    
    @Bean
    public NacosNamingService nacosNamingService() {
        Properties properties = new Properties();
        properties.put("serverAddr", "127.0.0.1:8848");
        properties.put("namespace", "public");
        
        return new NacosNamingService(properties);
    }
    
    @Scheduled(fixedRate = 5000) // 每 5 秒发送心跳
    public void sendBeat() {
        try {
            Instance instance = new Instance();
            instance.setIp(InetAddress.getLocalHost().getHostAddress());
            instance.setPort(8080);
            instance.setServiceName("user-service");
            
            // 发送心跳
            BeatInfo beatInfo = new BeatInfo();
            beatInfo.setServiceName("user-service");
            beatInfo.setIp(instance.getIp());
            beatInfo.setPort(instance.getPort());
            beatInfo.setPeriod(5000); // 心跳间隔
            
            nacosNamingService.sendBeat(beatInfo);
        } catch (Exception e) {
            log.error("心跳发送失败", e);
        }
    }
}            log.error("心跳发送失败", e);`
`#// 客户端心跳代码(Spring Cloud Alibaba Nacos Discovery)

@Configuration
public class NacosDiscoveryClientConfig {
    
    @Bean
    public NacosNamingService nacosNamingService() {
        Properties properties = new Properties();
        properties.put("serverAddr", "127.0.0.1:8848");
        properties.put("namespace", "public");
        
        return new NacosNamingService(properties);
    }
    
    @Scheduled(fixedRate = 5000) // 每 5 秒发送心跳
    public void sendBeat() {
        try {
            Instance instance = new Instance();
            instance.setIp(InetAddress.getLocalHost().getHostAddress());
            instance.setPort(8080);
            instance.setServiceName("user-service");
            
            // 发送心跳
            BeatInfo beatInfo = new BeatInfo();
            beatInfo.setServiceName("user-service");
            beatInfo.setIp(instance.getIp());
            beatInfo.setPort(instance.getPort());
            beatInfo.setPeriod(5000); // 心跳间隔
            
            nacosNamingService.sendBeat(beatInfo);
        } catch (Exception e) {
            log.error("心跳发送失败", e);
        }
    }
}        }`
`#// 客户端心跳代码(Spring Cloud Alibaba Nacos Discovery)

@Configuration
public class NacosDiscoveryClientConfig {
    
    @Bean
    public NacosNamingService nacosNamingService() {
        Properties properties = new Properties();
        properties.put("serverAddr", "127.0.0.1:8848");
        properties.put("namespace", "public");
        
        return new NacosNamingService(properties);
    }
    
    @Scheduled(fixedRate = 5000) // 每 5 秒发送心跳
    public void sendBeat() {
        try {
            Instance instance = new Instance();
            instance.setIp(InetAddress.getLocalHost().getHostAddress());
            instance.setPort(8080);
            instance.setServiceName("user-service");
            
            // 发送心跳
            BeatInfo beatInfo = new BeatInfo();
            beatInfo.setServiceName("user-service");
            beatInfo.setIp(instance.getIp());
            beatInfo.setPort(instance.getPort());
            beatInfo.setPeriod(5000); // 心跳间隔
            
            nacosNamingService.sendBeat(beatInfo);
        } catch (Exception e) {
            log.error("心跳发送失败", e);
        }
    }
}    }`
`#// 客户端心跳代码(Spring Cloud Alibaba Nacos Discovery)

@Configuration
public class NacosDiscoveryClientConfig {
    
    @Bean
    public NacosNamingService nacosNamingService() {
        Properties properties = new Properties();
        properties.put("serverAddr", "127.0.0.1:8848");
        properties.put("namespace", "public");
        
        return new NacosNamingService(properties);
    }
    
    @Scheduled(fixedRate = 5000) // 每 5 秒发送心跳
    public void sendBeat() {
        try {
            Instance instance = new Instance();
            instance.setIp(InetAddress.getLocalHost().getHostAddress());
            instance.setPort(8080);
            instance.setServiceName("user-service");
            
            // 发送心跳
            BeatInfo beatInfo = new BeatInfo();
            beatInfo.setServiceName("user-service");
            beatInfo.setIp(instance.getIp());
            beatInfo.setPort(instance.getPort());
            beatInfo.setPeriod(5000); // 心跳间隔
            
            nacosNamingService.sendBeat(beatInfo);
        } catch (Exception e) {
            log.error("心跳发送失败", e);
        }
    }
}}

4.2 服务端健康检查

java 复制代码
#// naming/src/main/java/com/alibaba/nacos/naming/healthcheck/ClientBeatCheckTask.java

public class ClientBeatCheckTask implements Runnable {
    
    @Override
    public void run() {
        try {
            // 1. 获取所有服务实例
            Collection<Service> services = serviceManager.getAllServices();
            
            for (Service service : services) {
                // 2. 获取服务的所有实例
                List<Instance> instances = service.allIPs();
                
                for (Instance instance : instances) {
                    // 3. 检查实例是否健康
                    if (instance.isEphemeral()) { // 临时实例需要健康检查
                        if (System.currentTimeMillis() - instance.getLastBeat() > HEARTBEAT_TIMEOUT) {
                            // 超过 20 秒未收到心跳,标记为不健康
                            instance.setHealthy(false);
                            
                            // 通知客户端
                            distroConsistencyService.put(service.getName(), instance);
                        }
                        
                        if (System.currentTimeMillis() - instance.getLastBeat() > IP_DELETE_TIMEOUT) {
                            // 超过 30 秒未收到心跳,删除实例
                            distroConsistencyService.remove(service.getName(), instance);
                        }
                    }
                }
            }
        } catch (Exception e) {
            log.error("健康检查失败", e);
        }
    }
}// naming/src/main/java/com/alibaba/nacos/naming/healthcheck/ClientBeatCheckTask.java`
`#// naming/src/main/java/com/alibaba/nacos/naming/healthcheck/ClientBeatCheckTask.java

public class ClientBeatCheckTask implements Runnable {
    
    @Override
    public void run() {
        try {
            // 1. 获取所有服务实例
            Collection<Service> services = serviceManager.getAllServices();
            
            for (Service service : services) {
                // 2. 获取服务的所有实例
                List<Instance> instances = service.allIPs();
                
                for (Instance instance : instances) {
                    // 3. 检查实例是否健康
                    if (instance.isEphemeral()) { // 临时实例需要健康检查
                        if (System.currentTimeMillis() - instance.getLastBeat() > HEARTBEAT_TIMEOUT) {
                            // 超过 20 秒未收到心跳,标记为不健康
                            instance.setHealthy(false);
                            
                            // 通知客户端
                            distroConsistencyService.put(service.getName(), instance);
                        }
                        
                        if (System.currentTimeMillis() - instance.getLastBeat() > IP_DELETE_TIMEOUT) {
                            // 超过 30 秒未收到心跳,删除实例
                            distroConsistencyService.remove(service.getName(), instance);
                        }
                    }
                }
            }
        } catch (Exception e) {
            log.error("健康检查失败", e);
        }
    }
}`
`#// naming/src/main/java/com/alibaba/nacos/naming/healthcheck/ClientBeatCheckTask.java

public class ClientBeatCheckTask implements Runnable {
    
    @Override
    public void run() {
        try {
            // 1. 获取所有服务实例
            Collection<Service> services = serviceManager.getAllServices();
            
            for (Service service : services) {
                // 2. 获取服务的所有实例
                List<Instance> instances = service.allIPs();
                
                for (Instance instance : instances) {
                    // 3. 检查实例是否健康
                    if (instance.isEphemeral()) { // 临时实例需要健康检查
                        if (System.currentTimeMillis() - instance.getLastBeat() > HEARTBEAT_TIMEOUT) {
                            // 超过 20 秒未收到心跳,标记为不健康
                            instance.setHealthy(false);
                            
                            // 通知客户端
                            distroConsistencyService.put(service.getName(), instance);
                        }
                        
                        if (System.currentTimeMillis() - instance.getLastBeat() > IP_DELETE_TIMEOUT) {
                            // 超过 30 秒未收到心跳,删除实例
                            distroConsistencyService.remove(service.getName(), instance);
                        }
                    }
                }
            }
        } catch (Exception e) {
            log.error("健康检查失败", e);
        }
    }
}public class ClientBeatCheckTask implements Runnable {`
`#// naming/src/main/java/com/alibaba/nacos/naming/healthcheck/ClientBeatCheckTask.java

public class ClientBeatCheckTask implements Runnable {
    
    @Override
    public void run() {
        try {
            // 1. 获取所有服务实例
            Collection<Service> services = serviceManager.getAllServices();
            
            for (Service service : services) {
                // 2. 获取服务的所有实例
                List<Instance> instances = service.allIPs();
                
                for (Instance instance : instances) {
                    // 3. 检查实例是否健康
                    if (instance.isEphemeral()) { // 临时实例需要健康检查
                        if (System.currentTimeMillis() - instance.getLastBeat() > HEARTBEAT_TIMEOUT) {
                            // 超过 20 秒未收到心跳,标记为不健康
                            instance.setHealthy(false);
                            
                            // 通知客户端
                            distroConsistencyService.put(service.getName(), instance);
                        }
                        
                        if (System.currentTimeMillis() - instance.getLastBeat() > IP_DELETE_TIMEOUT) {
                            // 超过 30 秒未收到心跳,删除实例
                            distroConsistencyService.remove(service.getName(), instance);
                        }
                    }
                }
            }
        } catch (Exception e) {
            log.error("健康检查失败", e);
        }
    }
}    `
`#// naming/src/main/java/com/alibaba/nacos/naming/healthcheck/ClientBeatCheckTask.java

public class ClientBeatCheckTask implements Runnable {
    
    @Override
    public void run() {
        try {
            // 1. 获取所有服务实例
            Collection<Service> services = serviceManager.getAllServices();
            
            for (Service service : services) {
                // 2. 获取服务的所有实例
                List<Instance> instances = service.allIPs();
                
                for (Instance instance : instances) {
                    // 3. 检查实例是否健康
                    if (instance.isEphemeral()) { // 临时实例需要健康检查
                        if (System.currentTimeMillis() - instance.getLastBeat() > HEARTBEAT_TIMEOUT) {
                            // 超过 20 秒未收到心跳,标记为不健康
                            instance.setHealthy(false);
                            
                            // 通知客户端
                            distroConsistencyService.put(service.getName(), instance);
                        }
                        
                        if (System.currentTimeMillis() - instance.getLastBeat() > IP_DELETE_TIMEOUT) {
                            // 超过 30 秒未收到心跳,删除实例
                            distroConsistencyService.remove(service.getName(), instance);
                        }
                    }
                }
            }
        } catch (Exception e) {
            log.error("健康检查失败", e);
        }
    }
}    @Override`
`#// naming/src/main/java/com/alibaba/nacos/naming/healthcheck/ClientBeatCheckTask.java

public class ClientBeatCheckTask implements Runnable {
    
    @Override
    public void run() {
        try {
            // 1. 获取所有服务实例
            Collection<Service> services = serviceManager.getAllServices();
            
            for (Service service : services) {
                // 2. 获取服务的所有实例
                List<Instance> instances = service.allIPs();
                
                for (Instance instance : instances) {
                    // 3. 检查实例是否健康
                    if (instance.isEphemeral()) { // 临时实例需要健康检查
                        if (System.currentTimeMillis() - instance.getLastBeat() > HEARTBEAT_TIMEOUT) {
                            // 超过 20 秒未收到心跳,标记为不健康
                            instance.setHealthy(false);
                            
                            // 通知客户端
                            distroConsistencyService.put(service.getName(), instance);
                        }
                        
                        if (System.currentTimeMillis() - instance.getLastBeat() > IP_DELETE_TIMEOUT) {
                            // 超过 30 秒未收到心跳,删除实例
                            distroConsistencyService.remove(service.getName(), instance);
                        }
                    }
                }
            }
        } catch (Exception e) {
            log.error("健康检查失败", e);
        }
    }
}    public void run() {`
`#// naming/src/main/java/com/alibaba/nacos/naming/healthcheck/ClientBeatCheckTask.java

public class ClientBeatCheckTask implements Runnable {
    
    @Override
    public void run() {
        try {
            // 1. 获取所有服务实例
            Collection<Service> services = serviceManager.getAllServices();
            
            for (Service service : services) {
                // 2. 获取服务的所有实例
                List<Instance> instances = service.allIPs();
                
                for (Instance instance : instances) {
                    // 3. 检查实例是否健康
                    if (instance.isEphemeral()) { // 临时实例需要健康检查
                        if (System.currentTimeMillis() - instance.getLastBeat() > HEARTBEAT_TIMEOUT) {
                            // 超过 20 秒未收到心跳,标记为不健康
                            instance.setHealthy(false);
                            
                            // 通知客户端
                            distroConsistencyService.put(service.getName(), instance);
                        }
                        
                        if (System.currentTimeMillis() - instance.getLastBeat() > IP_DELETE_TIMEOUT) {
                            // 超过 30 秒未收到心跳,删除实例
                            distroConsistencyService.remove(service.getName(), instance);
                        }
                    }
                }
            }
        } catch (Exception e) {
            log.error("健康检查失败", e);
        }
    }
}        try {`
`#// naming/src/main/java/com/alibaba/nacos/naming/healthcheck/ClientBeatCheckTask.java

public class ClientBeatCheckTask implements Runnable {
    
    @Override
    public void run() {
        try {
            // 1. 获取所有服务实例
            Collection<Service> services = serviceManager.getAllServices();
            
            for (Service service : services) {
                // 2. 获取服务的所有实例
                List<Instance> instances = service.allIPs();
                
                for (Instance instance : instances) {
                    // 3. 检查实例是否健康
                    if (instance.isEphemeral()) { // 临时实例需要健康检查
                        if (System.currentTimeMillis() - instance.getLastBeat() > HEARTBEAT_TIMEOUT) {
                            // 超过 20 秒未收到心跳,标记为不健康
                            instance.setHealthy(false);
                            
                            // 通知客户端
                            distroConsistencyService.put(service.getName(), instance);
                        }
                        
                        if (System.currentTimeMillis() - instance.getLastBeat() > IP_DELETE_TIMEOUT) {
                            // 超过 30 秒未收到心跳,删除实例
                            distroConsistencyService.remove(service.getName(), instance);
                        }
                    }
                }
            }
        } catch (Exception e) {
            log.error("健康检查失败", e);
        }
    }
}            // 1. 获取所有服务实例`
`#// naming/src/main/java/com/alibaba/nacos/naming/healthcheck/ClientBeatCheckTask.java

public class ClientBeatCheckTask implements Runnable {
    
    @Override
    public void run() {
        try {
            // 1. 获取所有服务实例
            Collection<Service> services = serviceManager.getAllServices();
            
            for (Service service : services) {
                // 2. 获取服务的所有实例
                List<Instance> instances = service.allIPs();
                
                for (Instance instance : instances) {
                    // 3. 检查实例是否健康
                    if (instance.isEphemeral()) { // 临时实例需要健康检查
                        if (System.currentTimeMillis() - instance.getLastBeat() > HEARTBEAT_TIMEOUT) {
                            // 超过 20 秒未收到心跳,标记为不健康
                            instance.setHealthy(false);
                            
                            // 通知客户端
                            distroConsistencyService.put(service.getName(), instance);
                        }
                        
                        if (System.currentTimeMillis() - instance.getLastBeat() > IP_DELETE_TIMEOUT) {
                            // 超过 30 秒未收到心跳,删除实例
                            distroConsistencyService.remove(service.getName(), instance);
                        }
                    }
                }
            }
        } catch (Exception e) {
            log.error("健康检查失败", e);
        }
    }
}            Collection<Service> services = serviceManager.getAllServices();`
`#// naming/src/main/java/com/alibaba/nacos/naming/healthcheck/ClientBeatCheckTask.java

public class ClientBeatCheckTask implements Runnable {
    
    @Override
    public void run() {
        try {
            // 1. 获取所有服务实例
            Collection<Service> services = serviceManager.getAllServices();
            
            for (Service service : services) {
                // 2. 获取服务的所有实例
                List<Instance> instances = service.allIPs();
                
                for (Instance instance : instances) {
                    // 3. 检查实例是否健康
                    if (instance.isEphemeral()) { // 临时实例需要健康检查
                        if (System.currentTimeMillis() - instance.getLastBeat() > HEARTBEAT_TIMEOUT) {
                            // 超过 20 秒未收到心跳,标记为不健康
                            instance.setHealthy(false);
                            
                            // 通知客户端
                            distroConsistencyService.put(service.getName(), instance);
                        }
                        
                        if (System.currentTimeMillis() - instance.getLastBeat() > IP_DELETE_TIMEOUT) {
                            // 超过 30 秒未收到心跳,删除实例
                            distroConsistencyService.remove(service.getName(), instance);
                        }
                    }
                }
            }
        } catch (Exception e) {
            log.error("健康检查失败", e);
        }
    }
}            `
`#// naming/src/main/java/com/alibaba/nacos/naming/healthcheck/ClientBeatCheckTask.java

public class ClientBeatCheckTask implements Runnable {
    
    @Override
    public void run() {
        try {
            // 1. 获取所有服务实例
            Collection<Service> services = serviceManager.getAllServices();
            
            for (Service service : services) {
                // 2. 获取服务的所有实例
                List<Instance> instances = service.allIPs();
                
                for (Instance instance : instances) {
                    // 3. 检查实例是否健康
                    if (instance.isEphemeral()) { // 临时实例需要健康检查
                        if (System.currentTimeMillis() - instance.getLastBeat() > HEARTBEAT_TIMEOUT) {
                            // 超过 20 秒未收到心跳,标记为不健康
                            instance.setHealthy(false);
                            
                            // 通知客户端
                            distroConsistencyService.put(service.getName(), instance);
                        }
                        
                        if (System.currentTimeMillis() - instance.getLastBeat() > IP_DELETE_TIMEOUT) {
                            // 超过 30 秒未收到心跳,删除实例
                            distroConsistencyService.remove(service.getName(), instance);
                        }
                    }
                }
            }
        } catch (Exception e) {
            log.error("健康检查失败", e);
        }
    }
}            for (Service service : services) {`
`#// naming/src/main/java/com/alibaba/nacos/naming/healthcheck/ClientBeatCheckTask.java

public class ClientBeatCheckTask implements Runnable {
    
    @Override
    public void run() {
        try {
            // 1. 获取所有服务实例
            Collection<Service> services = serviceManager.getAllServices();
            
            for (Service service : services) {
                // 2. 获取服务的所有实例
                List<Instance> instances = service.allIPs();
                
                for (Instance instance : instances) {
                    // 3. 检查实例是否健康
                    if (instance.isEphemeral()) { // 临时实例需要健康检查
                        if (System.currentTimeMillis() - instance.getLastBeat() > HEARTBEAT_TIMEOUT) {
                            // 超过 20 秒未收到心跳,标记为不健康
                            instance.setHealthy(false);
                            
                            // 通知客户端
                            distroConsistencyService.put(service.getName(), instance);
                        }
                        
                        if (System.currentTimeMillis() - instance.getLastBeat() > IP_DELETE_TIMEOUT) {
                            // 超过 30 秒未收到心跳,删除实例
                            distroConsistencyService.remove(service.getName(), instance);
                        }
                    }
                }
            }
        } catch (Exception e) {
            log.error("健康检查失败", e);
        }
    }
}                // 2. 获取服务的所有实例`
`#// naming/src/main/java/com/alibaba/nacos/naming/healthcheck/ClientBeatCheckTask.java

public class ClientBeatCheckTask implements Runnable {
    
    @Override
    public void run() {
        try {
            // 1. 获取所有服务实例
            Collection<Service> services = serviceManager.getAllServices();
            
            for (Service service : services) {
                // 2. 获取服务的所有实例
                List<Instance> instances = service.allIPs();
                
                for (Instance instance : instances) {
                    // 3. 检查实例是否健康
                    if (instance.isEphemeral()) { // 临时实例需要健康检查
                        if (System.currentTimeMillis() - instance.getLastBeat() > HEARTBEAT_TIMEOUT) {
                            // 超过 20 秒未收到心跳,标记为不健康
                            instance.setHealthy(false);
                            
                            // 通知客户端
                            distroConsistencyService.put(service.getName(), instance);
                        }
                        
                        if (System.currentTimeMillis() - instance.getLastBeat() > IP_DELETE_TIMEOUT) {
                            // 超过 30 秒未收到心跳,删除实例
                            distroConsistencyService.remove(service.getName(), instance);
                        }
                    }
                }
            }
        } catch (Exception e) {
            log.error("健康检查失败", e);
        }
    }
}                List<Instance> instances = service.allIPs();`
`#// naming/src/main/java/com/alibaba/nacos/naming/healthcheck/ClientBeatCheckTask.java

public class ClientBeatCheckTask implements Runnable {
    
    @Override
    public void run() {
        try {
            // 1. 获取所有服务实例
            Collection<Service> services = serviceManager.getAllServices();
            
            for (Service service : services) {
                // 2. 获取服务的所有实例
                List<Instance> instances = service.allIPs();
                
                for (Instance instance : instances) {
                    // 3. 检查实例是否健康
                    if (instance.isEphemeral()) { // 临时实例需要健康检查
                        if (System.currentTimeMillis() - instance.getLastBeat() > HEARTBEAT_TIMEOUT) {
                            // 超过 20 秒未收到心跳,标记为不健康
                            instance.setHealthy(false);
                            
                            // 通知客户端
                            distroConsistencyService.put(service.getName(), instance);
                        }
                        
                        if (System.currentTimeMillis() - instance.getLastBeat() > IP_DELETE_TIMEOUT) {
                            // 超过 30 秒未收到心跳,删除实例
                            distroConsistencyService.remove(service.getName(), instance);
                        }
                    }
                }
            }
        } catch (Exception e) {
            log.error("健康检查失败", e);
        }
    }
}                `
`#// naming/src/main/java/com/alibaba/nacos/naming/healthcheck/ClientBeatCheckTask.java

public class ClientBeatCheckTask implements Runnable {
    
    @Override
    public void run() {
        try {
            // 1. 获取所有服务实例
            Collection<Service> services = serviceManager.getAllServices();
            
            for (Service service : services) {
                // 2. 获取服务的所有实例
                List<Instance> instances = service.allIPs();
                
                for (Instance instance : instances) {
                    // 3. 检查实例是否健康
                    if (instance.isEphemeral()) { // 临时实例需要健康检查
                        if (System.currentTimeMillis() - instance.getLastBeat() > HEARTBEAT_TIMEOUT) {
                            // 超过 20 秒未收到心跳,标记为不健康
                            instance.setHealthy(false);
                            
                            // 通知客户端
                            distroConsistencyService.put(service.getName(), instance);
                        }
                        
                        if (System.currentTimeMillis() - instance.getLastBeat() > IP_DELETE_TIMEOUT) {
                            // 超过 30 秒未收到心跳,删除实例
                            distroConsistencyService.remove(service.getName(), instance);
                        }
                    }
                }
            }
        } catch (Exception e) {
            log.error("健康检查失败", e);
        }
    }
}                for (Instance instance : instances) {`
`#// naming/src/main/java/com/alibaba/nacos/naming/healthcheck/ClientBeatCheckTask.java

public class ClientBeatCheckTask implements Runnable {
    
    @Override
    public void run() {
        try {
            // 1. 获取所有服务实例
            Collection<Service> services = serviceManager.getAllServices();
            
            for (Service service : services) {
                // 2. 获取服务的所有实例
                List<Instance> instances = service.allIPs();
                
                for (Instance instance : instances) {
                    // 3. 检查实例是否健康
                    if (instance.isEphemeral()) { // 临时实例需要健康检查
                        if (System.currentTimeMillis() - instance.getLastBeat() > HEARTBEAT_TIMEOUT) {
                            // 超过 20 秒未收到心跳,标记为不健康
                            instance.setHealthy(false);
                            
                            // 通知客户端
                            distroConsistencyService.put(service.getName(), instance);
                        }
                        
                        if (System.currentTimeMillis() - instance.getLastBeat() > IP_DELETE_TIMEOUT) {
                            // 超过 30 秒未收到心跳,删除实例
                            distroConsistencyService.remove(service.getName(), instance);
                        }
                    }
                }
            }
        } catch (Exception e) {
            log.error("健康检查失败", e);
        }
    }
}                    // 3. 检查实例是否健康`
`#// naming/src/main/java/com/alibaba/nacos/naming/healthcheck/ClientBeatCheckTask.java

public class ClientBeatCheckTask implements Runnable {
    
    @Override
    public void run() {
        try {
            // 1. 获取所有服务实例
            Collection<Service> services = serviceManager.getAllServices();
            
            for (Service service : services) {
                // 2. 获取服务的所有实例
                List<Instance> instances = service.allIPs();
                
                for (Instance instance : instances) {
                    // 3. 检查实例是否健康
                    if (instance.isEphemeral()) { // 临时实例需要健康检查
                        if (System.currentTimeMillis() - instance.getLastBeat() > HEARTBEAT_TIMEOUT) {
                            // 超过 20 秒未收到心跳,标记为不健康
                            instance.setHealthy(false);
                            
                            // 通知客户端
                            distroConsistencyService.put(service.getName(), instance);
                        }
                        
                        if (System.currentTimeMillis() - instance.getLastBeat() > IP_DELETE_TIMEOUT) {
                            // 超过 30 秒未收到心跳,删除实例
                            distroConsistencyService.remove(service.getName(), instance);
                        }
                    }
                }
            }
        } catch (Exception e) {
            log.error("健康检查失败", e);
        }
    }
}                    if (instance.isEphemeral()) { // 临时实例需要健康检查`
`#// naming/src/main/java/com/alibaba/nacos/naming/healthcheck/ClientBeatCheckTask.java

public class ClientBeatCheckTask implements Runnable {
    
    @Override
    public void run() {
        try {
            // 1. 获取所有服务实例
            Collection<Service> services = serviceManager.getAllServices();
            
            for (Service service : services) {
                // 2. 获取服务的所有实例
                List<Instance> instances = service.allIPs();
                
                for (Instance instance : instances) {
                    // 3. 检查实例是否健康
                    if (instance.isEphemeral()) { // 临时实例需要健康检查
                        if (System.currentTimeMillis() - instance.getLastBeat() > HEARTBEAT_TIMEOUT) {
                            // 超过 20 秒未收到心跳,标记为不健康
                            instance.setHealthy(false);
                            
                            // 通知客户端
                            distroConsistencyService.put(service.getName(), instance);
                        }
                        
                        if (System.currentTimeMillis() - instance.getLastBeat() > IP_DELETE_TIMEOUT) {
                            // 超过 30 秒未收到心跳,删除实例
                            distroConsistencyService.remove(service.getName(), instance);
                        }
                    }
                }
            }
        } catch (Exception e) {
            log.error("健康检查失败", e);
        }
    }
}                        if (System.currentTimeMillis() - instance.getLastBeat() > HEARTBEAT_TIMEOUT) {`
`#// naming/src/main/java/com/alibaba/nacos/naming/healthcheck/ClientBeatCheckTask.java

public class ClientBeatCheckTask implements Runnable {
    
    @Override
    public void run() {
        try {
            // 1. 获取所有服务实例
            Collection<Service> services = serviceManager.getAllServices();
            
            for (Service service : services) {
                // 2. 获取服务的所有实例
                List<Instance> instances = service.allIPs();
                
                for (Instance instance : instances) {
                    // 3. 检查实例是否健康
                    if (instance.isEphemeral()) { // 临时实例需要健康检查
                        if (System.currentTimeMillis() - instance.getLastBeat() > HEARTBEAT_TIMEOUT) {
                            // 超过 20 秒未收到心跳,标记为不健康
                            instance.setHealthy(false);
                            
                            // 通知客户端
                            distroConsistencyService.put(service.getName(), instance);
                        }
                        
                        if (System.currentTimeMillis() - instance.getLastBeat() > IP_DELETE_TIMEOUT) {
                            // 超过 30 秒未收到心跳,删除实例
                            distroConsistencyService.remove(service.getName(), instance);
                        }
                    }
                }
            }
        } catch (Exception e) {
            log.error("健康检查失败", e);
        }
    }
}                            // 超过 20 秒未收到心跳,标记为不健康`
`#// naming/src/main/java/com/alibaba/nacos/naming/healthcheck/ClientBeatCheckTask.java

public class ClientBeatCheckTask implements Runnable {
    
    @Override
    public void run() {
        try {
            // 1. 获取所有服务实例
            Collection<Service> services = serviceManager.getAllServices();
            
            for (Service service : services) {
                // 2. 获取服务的所有实例
                List<Instance> instances = service.allIPs();
                
                for (Instance instance : instances) {
                    // 3. 检查实例是否健康
                    if (instance.isEphemeral()) { // 临时实例需要健康检查
                        if (System.currentTimeMillis() - instance.getLastBeat() > HEARTBEAT_TIMEOUT) {
                            // 超过 20 秒未收到心跳,标记为不健康
                            instance.setHealthy(false);
                            
                            // 通知客户端
                            distroConsistencyService.put(service.getName(), instance);
                        }
                        
                        if (System.currentTimeMillis() - instance.getLastBeat() > IP_DELETE_TIMEOUT) {
                            // 超过 30 秒未收到心跳,删除实例
                            distroConsistencyService.remove(service.getName(), instance);
                        }
                    }
                }
            }
        } catch (Exception e) {
            log.error("健康检查失败", e);
        }
    }
}                            instance.setHealthy(false);`
`#// naming/src/main/java/com/alibaba/nacos/naming/healthcheck/ClientBeatCheckTask.java

public class ClientBeatCheckTask implements Runnable {
    
    @Override
    public void run() {
        try {
            // 1. 获取所有服务实例
            Collection<Service> services = serviceManager.getAllServices();
            
            for (Service service : services) {
                // 2. 获取服务的所有实例
                List<Instance> instances = service.allIPs();
                
                for (Instance instance : instances) {
                    // 3. 检查实例是否健康
                    if (instance.isEphemeral()) { // 临时实例需要健康检查
                        if (System.currentTimeMillis() - instance.getLastBeat() > HEARTBEAT_TIMEOUT) {
                            // 超过 20 秒未收到心跳,标记为不健康
                            instance.setHealthy(false);
                            
                            // 通知客户端
                            distroConsistencyService.put(service.getName(), instance);
                        }
                        
                        if (System.currentTimeMillis() - instance.getLastBeat() > IP_DELETE_TIMEOUT) {
                            // 超过 30 秒未收到心跳,删除实例
                            distroConsistencyService.remove(service.getName(), instance);
                        }
                    }
                }
            }
        } catch (Exception e) {
            log.error("健康检查失败", e);
        }
    }
}                            `
`#// naming/src/main/java/com/alibaba/nacos/naming/healthcheck/ClientBeatCheckTask.java

public class ClientBeatCheckTask implements Runnable {
    
    @Override
    public void run() {
        try {
            // 1. 获取所有服务实例
            Collection<Service> services = serviceManager.getAllServices();
            
            for (Service service : services) {
                // 2. 获取服务的所有实例
                List<Instance> instances = service.allIPs();
                
                for (Instance instance : instances) {
                    // 3. 检查实例是否健康
                    if (instance.isEphemeral()) { // 临时实例需要健康检查
                        if (System.currentTimeMillis() - instance.getLastBeat() > HEARTBEAT_TIMEOUT) {
                            // 超过 20 秒未收到心跳,标记为不健康
                            instance.setHealthy(false);
                            
                            // 通知客户端
                            distroConsistencyService.put(service.getName(), instance);
                        }
                        
                        if (System.currentTimeMillis() - instance.getLastBeat() > IP_DELETE_TIMEOUT) {
                            // 超过 30 秒未收到心跳,删除实例
                            distroConsistencyService.remove(service.getName(), instance);
                        }
                    }
                }
            }
        } catch (Exception e) {
            log.error("健康检查失败", e);
        }
    }
}                            // 通知客户端`
`#// naming/src/main/java/com/alibaba/nacos/naming/healthcheck/ClientBeatCheckTask.java

public class ClientBeatCheckTask implements Runnable {
    
    @Override
    public void run() {
        try {
            // 1. 获取所有服务实例
            Collection<Service> services = serviceManager.getAllServices();
            
            for (Service service : services) {
                // 2. 获取服务的所有实例
                List<Instance> instances = service.allIPs();
                
                for (Instance instance : instances) {
                    // 3. 检查实例是否健康
                    if (instance.isEphemeral()) { // 临时实例需要健康检查
                        if (System.currentTimeMillis() - instance.getLastBeat() > HEARTBEAT_TIMEOUT) {
                            // 超过 20 秒未收到心跳,标记为不健康
                            instance.setHealthy(false);
                            
                            // 通知客户端
                            distroConsistencyService.put(service.getName(), instance);
                        }
                        
                        if (System.currentTimeMillis() - instance.getLastBeat() > IP_DELETE_TIMEOUT) {
                            // 超过 30 秒未收到心跳,删除实例
                            distroConsistencyService.remove(service.getName(), instance);
                        }
                    }
                }
            }
        } catch (Exception e) {
            log.error("健康检查失败", e);
        }
    }
}                            distroConsistencyService.put(service.getName(), instance);`
`#// naming/src/main/java/com/alibaba/nacos/naming/healthcheck/ClientBeatCheckTask.java

public class ClientBeatCheckTask implements Runnable {
    
    @Override
    public void run() {
        try {
            // 1. 获取所有服务实例
            Collection<Service> services = serviceManager.getAllServices();
            
            for (Service service : services) {
                // 2. 获取服务的所有实例
                List<Instance> instances = service.allIPs();
                
                for (Instance instance : instances) {
                    // 3. 检查实例是否健康
                    if (instance.isEphemeral()) { // 临时实例需要健康检查
                        if (System.currentTimeMillis() - instance.getLastBeat() > HEARTBEAT_TIMEOUT) {
                            // 超过 20 秒未收到心跳,标记为不健康
                            instance.setHealthy(false);
                            
                            // 通知客户端
                            distroConsistencyService.put(service.getName(), instance);
                        }
                        
                        if (System.currentTimeMillis() - instance.getLastBeat() > IP_DELETE_TIMEOUT) {
                            // 超过 30 秒未收到心跳,删除实例
                            distroConsistencyService.remove(service.getName(), instance);
                        }
                    }
                }
            }
        } catch (Exception e) {
            log.error("健康检查失败", e);
        }
    }
}                        }`
`#// naming/src/main/java/com/alibaba/nacos/naming/healthcheck/ClientBeatCheckTask.java

public class ClientBeatCheckTask implements Runnable {
    
    @Override
    public void run() {
        try {
            // 1. 获取所有服务实例
            Collection<Service> services = serviceManager.getAllServices();
            
            for (Service service : services) {
                // 2. 获取服务的所有实例
                List<Instance> instances = service.allIPs();
                
                for (Instance instance : instances) {
                    // 3. 检查实例是否健康
                    if (instance.isEphemeral()) { // 临时实例需要健康检查
                        if (System.currentTimeMillis() - instance.getLastBeat() > HEARTBEAT_TIMEOUT) {
                            // 超过 20 秒未收到心跳,标记为不健康
                            instance.setHealthy(false);
                            
                            // 通知客户端
                            distroConsistencyService.put(service.getName(), instance);
                        }
                        
                        if (System.currentTimeMillis() - instance.getLastBeat() > IP_DELETE_TIMEOUT) {
                            // 超过 30 秒未收到心跳,删除实例
                            distroConsistencyService.remove(service.getName(), instance);
                        }
                    }
                }
            }
        } catch (Exception e) {
            log.error("健康检查失败", e);
        }
    }
}                        `
`#// naming/src/main/java/com/alibaba/nacos/naming/healthcheck/ClientBeatCheckTask.java

public class ClientBeatCheckTask implements Runnable {
    
    @Override
    public void run() {
        try {
            // 1. 获取所有服务实例
            Collection<Service> services = serviceManager.getAllServices();
            
            for (Service service : services) {
                // 2. 获取服务的所有实例
                List<Instance> instances = service.allIPs();
                
                for (Instance instance : instances) {
                    // 3. 检查实例是否健康
                    if (instance.isEphemeral()) { // 临时实例需要健康检查
                        if (System.currentTimeMillis() - instance.getLastBeat() > HEARTBEAT_TIMEOUT) {
                            // 超过 20 秒未收到心跳,标记为不健康
                            instance.setHealthy(false);
                            
                            // 通知客户端
                            distroConsistencyService.put(service.getName(), instance);
                        }
                        
                        if (System.currentTimeMillis() - instance.getLastBeat() > IP_DELETE_TIMEOUT) {
                            // 超过 30 秒未收到心跳,删除实例
                            distroConsistencyService.remove(service.getName(), instance);
                        }
                    }
                }
            }
        } catch (Exception e) {
            log.error("健康检查失败", e);
        }
    }
}                        if (System.currentTimeMillis() - instance.getLastBeat() > IP_DELETE_TIMEOUT) {`
`#// naming/src/main/java/com/alibaba/nacos/naming/healthcheck/ClientBeatCheckTask.java

public class ClientBeatCheckTask implements Runnable {
    
    @Override
    public void run() {
        try {
            // 1. 获取所有服务实例
            Collection<Service> services = serviceManager.getAllServices();
            
            for (Service service : services) {
                // 2. 获取服务的所有实例
                List<Instance> instances = service.allIPs();
                
                for (Instance instance : instances) {
                    // 3. 检查实例是否健康
                    if (instance.isEphemeral()) { // 临时实例需要健康检查
                        if (System.currentTimeMillis() - instance.getLastBeat() > HEARTBEAT_TIMEOUT) {
                            // 超过 20 秒未收到心跳,标记为不健康
                            instance.setHealthy(false);
                            
                            // 通知客户端
                            distroConsistencyService.put(service.getName(), instance);
                        }
                        
                        if (System.currentTimeMillis() - instance.getLastBeat() > IP_DELETE_TIMEOUT) {
                            // 超过 30 秒未收到心跳,删除实例
                            distroConsistencyService.remove(service.getName(), instance);
                        }
                    }
                }
            }
        } catch (Exception e) {
            log.error("健康检查失败", e);
        }
    }
}                            // 超过 30 秒未收到心跳,删除实例`
`#// naming/src/main/java/com/alibaba/nacos/naming/healthcheck/ClientBeatCheckTask.java

public class ClientBeatCheckTask implements Runnable {
    
    @Override
    public void run() {
        try {
            // 1. 获取所有服务实例
            Collection<Service> services = serviceManager.getAllServices();
            
            for (Service service : services) {
                // 2. 获取服务的所有实例
                List<Instance> instances = service.allIPs();
                
                for (Instance instance : instances) {
                    // 3. 检查实例是否健康
                    if (instance.isEphemeral()) { // 临时实例需要健康检查
                        if (System.currentTimeMillis() - instance.getLastBeat() > HEARTBEAT_TIMEOUT) {
                            // 超过 20 秒未收到心跳,标记为不健康
                            instance.setHealthy(false);
                            
                            // 通知客户端
                            distroConsistencyService.put(service.getName(), instance);
                        }
                        
                        if (System.currentTimeMillis() - instance.getLastBeat() > IP_DELETE_TIMEOUT) {
                            // 超过 30 秒未收到心跳,删除实例
                            distroConsistencyService.remove(service.getName(), instance);
                        }
                    }
                }
            }
        } catch (Exception e) {
            log.error("健康检查失败", e);
        }
    }
}                            distroConsistencyService.remove(service.getName(), instance);`
`#// naming/src/main/java/com/alibaba/nacos/naming/healthcheck/ClientBeatCheckTask.java

public class ClientBeatCheckTask implements Runnable {
    
    @Override
    public void run() {
        try {
            // 1. 获取所有服务实例
            Collection<Service> services = serviceManager.getAllServices();
            
            for (Service service : services) {
                // 2. 获取服务的所有实例
                List<Instance> instances = service.allIPs();
                
                for (Instance instance : instances) {
                    // 3. 检查实例是否健康
                    if (instance.isEphemeral()) { // 临时实例需要健康检查
                        if (System.currentTimeMillis() - instance.getLastBeat() > HEARTBEAT_TIMEOUT) {
                            // 超过 20 秒未收到心跳,标记为不健康
                            instance.setHealthy(false);
                            
                            // 通知客户端
                            distroConsistencyService.put(service.getName(), instance);
                        }
                        
                        if (System.currentTimeMillis() - instance.getLastBeat() > IP_DELETE_TIMEOUT) {
                            // 超过 30 秒未收到心跳,删除实例
                            distroConsistencyService.remove(service.getName(), instance);
                        }
                    }
                }
            }
        } catch (Exception e) {
            log.error("健康检查失败", e);
        }
    }
}                        }`
`#// naming/src/main/java/com/alibaba/nacos/naming/healthcheck/ClientBeatCheckTask.java

public class ClientBeatCheckTask implements Runnable {
    
    @Override
    public void run() {
        try {
            // 1. 获取所有服务实例
            Collection<Service> services = serviceManager.getAllServices();
            
            for (Service service : services) {
                // 2. 获取服务的所有实例
                List<Instance> instances = service.allIPs();
                
                for (Instance instance : instances) {
                    // 3. 检查实例是否健康
                    if (instance.isEphemeral()) { // 临时实例需要健康检查
                        if (System.currentTimeMillis() - instance.getLastBeat() > HEARTBEAT_TIMEOUT) {
                            // 超过 20 秒未收到心跳,标记为不健康
                            instance.setHealthy(false);
                            
                            // 通知客户端
                            distroConsistencyService.put(service.getName(), instance);
                        }
                        
                        if (System.currentTimeMillis() - instance.getLastBeat() > IP_DELETE_TIMEOUT) {
                            // 超过 30 秒未收到心跳,删除实例
                            distroConsistencyService.remove(service.getName(), instance);
                        }
                    }
                }
            }
        } catch (Exception e) {
            log.error("健康检查失败", e);
        }
    }
}                    }`
`#// naming/src/main/java/com/alibaba/nacos/naming/healthcheck/ClientBeatCheckTask.java

public class ClientBeatCheckTask implements Runnable {
    
    @Override
    public void run() {
        try {
            // 1. 获取所有服务实例
            Collection<Service> services = serviceManager.getAllServices();
            
            for (Service service : services) {
                // 2. 获取服务的所有实例
                List<Instance> instances = service.allIPs();
                
                for (Instance instance : instances) {
                    // 3. 检查实例是否健康
                    if (instance.isEphemeral()) { // 临时实例需要健康检查
                        if (System.currentTimeMillis() - instance.getLastBeat() > HEARTBEAT_TIMEOUT) {
                            // 超过 20 秒未收到心跳,标记为不健康
                            instance.setHealthy(false);
                            
                            // 通知客户端
                            distroConsistencyService.put(service.getName(), instance);
                        }
                        
                        if (System.currentTimeMillis() - instance.getLastBeat() > IP_DELETE_TIMEOUT) {
                            // 超过 30 秒未收到心跳,删除实例
                            distroConsistencyService.remove(service.getName(), instance);
                        }
                    }
                }
            }
        } catch (Exception e) {
            log.error("健康检查失败", e);
        }
    }
}                }`
`#// naming/src/main/java/com/alibaba/nacos/naming/healthcheck/ClientBeatCheckTask.java

public class ClientBeatCheckTask implements Runnable {
    
    @Override
    public void run() {
        try {
            // 1. 获取所有服务实例
            Collection<Service> services = serviceManager.getAllServices();
            
            for (Service service : services) {
                // 2. 获取服务的所有实例
                List<Instance> instances = service.allIPs();
                
                for (Instance instance : instances) {
                    // 3. 检查实例是否健康
                    if (instance.isEphemeral()) { // 临时实例需要健康检查
                        if (System.currentTimeMillis() - instance.getLastBeat() > HEARTBEAT_TIMEOUT) {
                            // 超过 20 秒未收到心跳,标记为不健康
                            instance.setHealthy(false);
                            
                            // 通知客户端
                            distroConsistencyService.put(service.getName(), instance);
                        }
                        
                        if (System.currentTimeMillis() - instance.getLastBeat() > IP_DELETE_TIMEOUT) {
                            // 超过 30 秒未收到心跳,删除实例
                            distroConsistencyService.remove(service.getName(), instance);
                        }
                    }
                }
            }
        } catch (Exception e) {
            log.error("健康检查失败", e);
        }
    }
}            }`
`#// naming/src/main/java/com/alibaba/nacos/naming/healthcheck/ClientBeatCheckTask.java

public class ClientBeatCheckTask implements Runnable {
    
    @Override
    public void run() {
        try {
            // 1. 获取所有服务实例
            Collection<Service> services = serviceManager.getAllServices();
            
            for (Service service : services) {
                // 2. 获取服务的所有实例
                List<Instance> instances = service.allIPs();
                
                for (Instance instance : instances) {
                    // 3. 检查实例是否健康
                    if (instance.isEphemeral()) { // 临时实例需要健康检查
                        if (System.currentTimeMillis() - instance.getLastBeat() > HEARTBEAT_TIMEOUT) {
                            // 超过 20 秒未收到心跳,标记为不健康
                            instance.setHealthy(false);
                            
                            // 通知客户端
                            distroConsistencyService.put(service.getName(), instance);
                        }
                        
                        if (System.currentTimeMillis() - instance.getLastBeat() > IP_DELETE_TIMEOUT) {
                            // 超过 30 秒未收到心跳,删除实例
                            distroConsistencyService.remove(service.getName(), instance);
                        }
                    }
                }
            }
        } catch (Exception e) {
            log.error("健康检查失败", e);
        }
    }
}        } catch (Exception e) {`
`#// naming/src/main/java/com/alibaba/nacos/naming/healthcheck/ClientBeatCheckTask.java

public class ClientBeatCheckTask implements Runnable {
    
    @Override
    public void run() {
        try {
            // 1. 获取所有服务实例
            Collection<Service> services = serviceManager.getAllServices();
            
            for (Service service : services) {
                // 2. 获取服务的所有实例
                List<Instance> instances = service.allIPs();
                
                for (Instance instance : instances) {
                    // 3. 检查实例是否健康
                    if (instance.isEphemeral()) { // 临时实例需要健康检查
                        if (System.currentTimeMillis() - instance.getLastBeat() > HEARTBEAT_TIMEOUT) {
                            // 超过 20 秒未收到心跳,标记为不健康
                            instance.setHealthy(false);
                            
                            // 通知客户端
                            distroConsistencyService.put(service.getName(), instance);
                        }
                        
                        if (System.currentTimeMillis() - instance.getLastBeat() > IP_DELETE_TIMEOUT) {
                            // 超过 30 秒未收到心跳,删除实例
                            distroConsistencyService.remove(service.getName(), instance);
                        }
                    }
                }
            }
        } catch (Exception e) {
            log.error("健康检查失败", e);
        }
    }
}            log.error("健康检查失败", e);`
`#// naming/src/main/java/com/alibaba/nacos/naming/healthcheck/ClientBeatCheckTask.java

public class ClientBeatCheckTask implements Runnable {
    
    @Override
    public void run() {
        try {
            // 1. 获取所有服务实例
            Collection<Service> services = serviceManager.getAllServices();
            
            for (Service service : services) {
                // 2. 获取服务的所有实例
                List<Instance> instances = service.allIPs();
                
                for (Instance instance : instances) {
                    // 3. 检查实例是否健康
                    if (instance.isEphemeral()) { // 临时实例需要健康检查
                        if (System.currentTimeMillis() - instance.getLastBeat() > HEARTBEAT_TIMEOUT) {
                            // 超过 20 秒未收到心跳,标记为不健康
                            instance.setHealthy(false);
                            
                            // 通知客户端
                            distroConsistencyService.put(service.getName(), instance);
                        }
                        
                        if (System.currentTimeMillis() - instance.getLastBeat() > IP_DELETE_TIMEOUT) {
                            // 超过 30 秒未收到心跳,删除实例
                            distroConsistencyService.remove(service.getName(), instance);
                        }
                    }
                }
            }
        } catch (Exception e) {
            log.error("健康检查失败", e);
        }
    }
}        }`
`#// naming/src/main/java/com/alibaba/nacos/naming/healthcheck/ClientBeatCheckTask.java

public class ClientBeatCheckTask implements Runnable {
    
    @Override
    public void run() {
        try {
            // 1. 获取所有服务实例
            Collection<Service> services = serviceManager.getAllServices();
            
            for (Service service : services) {
                // 2. 获取服务的所有实例
                List<Instance> instances = service.allIPs();
                
                for (Instance instance : instances) {
                    // 3. 检查实例是否健康
                    if (instance.isEphemeral()) { // 临时实例需要健康检查
                        if (System.currentTimeMillis() - instance.getLastBeat() > HEARTBEAT_TIMEOUT) {
                            // 超过 20 秒未收到心跳,标记为不健康
                            instance.setHealthy(false);
                            
                            // 通知客户端
                            distroConsistencyService.put(service.getName(), instance);
                        }
                        
                        if (System.currentTimeMillis() - instance.getLastBeat() > IP_DELETE_TIMEOUT) {
                            // 超过 30 秒未收到心跳,删除实例
                            distroConsistencyService.remove(service.getName(), instance);
                        }
                    }
                }
            }
        } catch (Exception e) {
            log.error("健康检查失败", e);
        }
    }
}    }`
`#// naming/src/main/java/com/alibaba/nacos/naming/healthcheck/ClientBeatCheckTask.java

public class ClientBeatCheckTask implements Runnable {
    
    @Override
    public void run() {
        try {
            // 1. 获取所有服务实例
            Collection<Service> services = serviceManager.getAllServices();
            
            for (Service service : services) {
                // 2. 获取服务的所有实例
                List<Instance> instances = service.allIPs();
                
                for (Instance instance : instances) {
                    // 3. 检查实例是否健康
                    if (instance.isEphemeral()) { // 临时实例需要健康检查
                        if (System.currentTimeMillis() - instance.getLastBeat() > HEARTBEAT_TIMEOUT) {
                            // 超过 20 秒未收到心跳,标记为不健康
                            instance.setHealthy(false);
                            
                            // 通知客户端
                            distroConsistencyService.put(service.getName(), instance);
                        }
                        
                        if (System.currentTimeMillis() - instance.getLastBeat() > IP_DELETE_TIMEOUT) {
                            // 超过 30 秒未收到心跳,删除实例
                            distroConsistencyService.remove(service.getName(), instance);
                        }
                    }
                }
            }
        } catch (Exception e) {
            log.error("健康检查失败", e);
        }
    }
}}

4.3 故障自愈机制

复制代码
graph TB
    A[Nacos 节点故障/重启] --> B{节点恢复}
    B --> C[启动 Distro 协议]
    C --> D[向其他节点请求数据]
    D --> E{数据版本校验}
    E -->|需要更新| F[拉取最新数据]
    E -->|已是最新| G[跳过]
    F --> H[写入本地内存]
    H --> I[开始正常提供服务]
    G --> I
java 复制代码
#// naming/src/main/java/com/alibaba/nacos/naming/core/DistroProtocol.java

public void loadDatumFromRemote() {
    // 1. 遍历所有其他节点
    for (Member member : memberManager.allMembersWithoutSelf()) {
        try {
            // 2. 请求全量数据
            String url = "http://" + member.getAddress() + "/v1/ns/distro/datums";
            RestResult<Map<String, Datum>> result = restTemplate.get(url);
            
            if (result.ok()) {
                Map<String, Datum> datums = result.getData();
                
                // 3. 写入本地内存
                for (Datum datum : datums.values()) {
                    distroConsistencyService.onDatum(datum);
                }
                
                log.info("从节点 {} 恢复数据成功", member.getAddress());
                break;
            }
        } catch (Exception e) {
            log.error("从节点 {} 恢复数据失败", member.getAddress(), e);
        }
    }
}// naming/src/main/java/com/alibaba/nacos/naming/core/DistroProtocol.java`
`#// naming/src/main/java/com/alibaba/nacos/naming/core/DistroProtocol.java

public void loadDatumFromRemote() {
    // 1. 遍历所有其他节点
    for (Member member : memberManager.allMembersWithoutSelf()) {
        try {
            // 2. 请求全量数据
            String url = "http://" + member.getAddress() + "/v1/ns/distro/datums";
            RestResult<Map<String, Datum>> result = restTemplate.get(url);
            
            if (result.ok()) {
                Map<String, Datum> datums = result.getData();
                
                // 3. 写入本地内存
                for (Datum datum : datums.values()) {
                    distroConsistencyService.onDatum(datum);
                }
                
                log.info("从节点 {} 恢复数据成功", member.getAddress());
                break;
            }
        } catch (Exception e) {
            log.error("从节点 {} 恢复数据失败", member.getAddress(), e);
        }
    }
}`
`#// naming/src/main/java/com/alibaba/nacos/naming/core/DistroProtocol.java

public void loadDatumFromRemote() {
    // 1. 遍历所有其他节点
    for (Member member : memberManager.allMembersWithoutSelf()) {
        try {
            // 2. 请求全量数据
            String url = "http://" + member.getAddress() + "/v1/ns/distro/datums";
            RestResult<Map<String, Datum>> result = restTemplate.get(url);
            
            if (result.ok()) {
                Map<String, Datum> datums = result.getData();
                
                // 3. 写入本地内存
                for (Datum datum : datums.values()) {
                    distroConsistencyService.onDatum(datum);
                }
                
                log.info("从节点 {} 恢复数据成功", member.getAddress());
                break;
            }
        } catch (Exception e) {
            log.error("从节点 {} 恢复数据失败", member.getAddress(), e);
        }
    }
}public void loadDatumFromRemote() {`
`#// naming/src/main/java/com/alibaba/nacos/naming/core/DistroProtocol.java

public void loadDatumFromRemote() {
    // 1. 遍历所有其他节点
    for (Member member : memberManager.allMembersWithoutSelf()) {
        try {
            // 2. 请求全量数据
            String url = "http://" + member.getAddress() + "/v1/ns/distro/datums";
            RestResult<Map<String, Datum>> result = restTemplate.get(url);
            
            if (result.ok()) {
                Map<String, Datum> datums = result.getData();
                
                // 3. 写入本地内存
                for (Datum datum : datums.values()) {
                    distroConsistencyService.onDatum(datum);
                }
                
                log.info("从节点 {} 恢复数据成功", member.getAddress());
                break;
            }
        } catch (Exception e) {
            log.error("从节点 {} 恢复数据失败", member.getAddress(), e);
        }
    }
}    // 1. 遍历所有其他节点`
`#// naming/src/main/java/com/alibaba/nacos/naming/core/DistroProtocol.java

public void loadDatumFromRemote() {
    // 1. 遍历所有其他节点
    for (Member member : memberManager.allMembersWithoutSelf()) {
        try {
            // 2. 请求全量数据
            String url = "http://" + member.getAddress() + "/v1/ns/distro/datums";
            RestResult<Map<String, Datum>> result = restTemplate.get(url);
            
            if (result.ok()) {
                Map<String, Datum> datums = result.getData();
                
                // 3. 写入本地内存
                for (Datum datum : datums.values()) {
                    distroConsistencyService.onDatum(datum);
                }
                
                log.info("从节点 {} 恢复数据成功", member.getAddress());
                break;
            }
        } catch (Exception e) {
            log.error("从节点 {} 恢复数据失败", member.getAddress(), e);
        }
    }
}    for (Member member : memberManager.allMembersWithoutSelf()) {`
`#// naming/src/main/java/com/alibaba/nacos/naming/core/DistroProtocol.java

public void loadDatumFromRemote() {
    // 1. 遍历所有其他节点
    for (Member member : memberManager.allMembersWithoutSelf()) {
        try {
            // 2. 请求全量数据
            String url = "http://" + member.getAddress() + "/v1/ns/distro/datums";
            RestResult<Map<String, Datum>> result = restTemplate.get(url);
            
            if (result.ok()) {
                Map<String, Datum> datums = result.getData();
                
                // 3. 写入本地内存
                for (Datum datum : datums.values()) {
                    distroConsistencyService.onDatum(datum);
                }
                
                log.info("从节点 {} 恢复数据成功", member.getAddress());
                break;
            }
        } catch (Exception e) {
            log.error("从节点 {} 恢复数据失败", member.getAddress(), e);
        }
    }
}        try {`
`#// naming/src/main/java/com/alibaba/nacos/naming/core/DistroProtocol.java

public void loadDatumFromRemote() {
    // 1. 遍历所有其他节点
    for (Member member : memberManager.allMembersWithoutSelf()) {
        try {
            // 2. 请求全量数据
            String url = "http://" + member.getAddress() + "/v1/ns/distro/datums";
            RestResult<Map<String, Datum>> result = restTemplate.get(url);
            
            if (result.ok()) {
                Map<String, Datum> datums = result.getData();
                
                // 3. 写入本地内存
                for (Datum datum : datums.values()) {
                    distroConsistencyService.onDatum(datum);
                }
                
                log.info("从节点 {} 恢复数据成功", member.getAddress());
                break;
            }
        } catch (Exception e) {
            log.error("从节点 {} 恢复数据失败", member.getAddress(), e);
        }
    }
}            // 2. 请求全量数据`
`#// naming/src/main/java/com/alibaba/nacos/naming/core/DistroProtocol.java

public void loadDatumFromRemote() {
    // 1. 遍历所有其他节点
    for (Member member : memberManager.allMembersWithoutSelf()) {
        try {
            // 2. 请求全量数据
            String url = "http://" + member.getAddress() + "/v1/ns/distro/datums";
            RestResult<Map<String, Datum>> result = restTemplate.get(url);
            
            if (result.ok()) {
                Map<String, Datum> datums = result.getData();
                
                // 3. 写入本地内存
                for (Datum datum : datums.values()) {
                    distroConsistencyService.onDatum(datum);
                }
                
                log.info("从节点 {} 恢复数据成功", member.getAddress());
                break;
            }
        } catch (Exception e) {
            log.error("从节点 {} 恢复数据失败", member.getAddress(), e);
        }
    }
}            String url = "http://" + member.getAddress() + "/v1/ns/distro/datums";`
`#// naming/src/main/java/com/alibaba/nacos/naming/core/DistroProtocol.java

public void loadDatumFromRemote() {
    // 1. 遍历所有其他节点
    for (Member member : memberManager.allMembersWithoutSelf()) {
        try {
            // 2. 请求全量数据
            String url = "http://" + member.getAddress() + "/v1/ns/distro/datums";
            RestResult<Map<String, Datum>> result = restTemplate.get(url);
            
            if (result.ok()) {
                Map<String, Datum> datums = result.getData();
                
                // 3. 写入本地内存
                for (Datum datum : datums.values()) {
                    distroConsistencyService.onDatum(datum);
                }
                
                log.info("从节点 {} 恢复数据成功", member.getAddress());
                break;
            }
        } catch (Exception e) {
            log.error("从节点 {} 恢复数据失败", member.getAddress(), e);
        }
    }
}            RestResult<Map<String, Datum>> result = restTemplate.get(url);`
`#// naming/src/main/java/com/alibaba/nacos/naming/core/DistroProtocol.java

public void loadDatumFromRemote() {
    // 1. 遍历所有其他节点
    for (Member member : memberManager.allMembersWithoutSelf()) {
        try {
            // 2. 请求全量数据
            String url = "http://" + member.getAddress() + "/v1/ns/distro/datums";
            RestResult<Map<String, Datum>> result = restTemplate.get(url);
            
            if (result.ok()) {
                Map<String, Datum> datums = result.getData();
                
                // 3. 写入本地内存
                for (Datum datum : datums.values()) {
                    distroConsistencyService.onDatum(datum);
                }
                
                log.info("从节点 {} 恢复数据成功", member.getAddress());
                break;
            }
        } catch (Exception e) {
            log.error("从节点 {} 恢复数据失败", member.getAddress(), e);
        }
    }
}            `
`#// naming/src/main/java/com/alibaba/nacos/naming/core/DistroProtocol.java

public void loadDatumFromRemote() {
    // 1. 遍历所有其他节点
    for (Member member : memberManager.allMembersWithoutSelf()) {
        try {
            // 2. 请求全量数据
            String url = "http://" + member.getAddress() + "/v1/ns/distro/datums";
            RestResult<Map<String, Datum>> result = restTemplate.get(url);
            
            if (result.ok()) {
                Map<String, Datum> datums = result.getData();
                
                // 3. 写入本地内存
                for (Datum datum : datums.values()) {
                    distroConsistencyService.onDatum(datum);
                }
                
                log.info("从节点 {} 恢复数据成功", member.getAddress());
                break;
            }
        } catch (Exception e) {
            log.error("从节点 {} 恢复数据失败", member.getAddress(), e);
        }
    }
}            if (result.ok()) {`
`#// naming/src/main/java/com/alibaba/nacos/naming/core/DistroProtocol.java

public void loadDatumFromRemote() {
    // 1. 遍历所有其他节点
    for (Member member : memberManager.allMembersWithoutSelf()) {
        try {
            // 2. 请求全量数据
            String url = "http://" + member.getAddress() + "/v1/ns/distro/datums";
            RestResult<Map<String, Datum>> result = restTemplate.get(url);
            
            if (result.ok()) {
                Map<String, Datum> datums = result.getData();
                
                // 3. 写入本地内存
                for (Datum datum : datums.values()) {
                    distroConsistencyService.onDatum(datum);
                }
                
                log.info("从节点 {} 恢复数据成功", member.getAddress());
                break;
            }
        } catch (Exception e) {
            log.error("从节点 {} 恢复数据失败", member.getAddress(), e);
        }
    }
}                Map<String, Datum> datums = result.getData();`
`#// naming/src/main/java/com/alibaba/nacos/naming/core/DistroProtocol.java

public void loadDatumFromRemote() {
    // 1. 遍历所有其他节点
    for (Member member : memberManager.allMembersWithoutSelf()) {
        try {
            // 2. 请求全量数据
            String url = "http://" + member.getAddress() + "/v1/ns/distro/datums";
            RestResult<Map<String, Datum>> result = restTemplate.get(url);
            
            if (result.ok()) {
                Map<String, Datum> datums = result.getData();
                
                // 3. 写入本地内存
                for (Datum datum : datums.values()) {
                    distroConsistencyService.onDatum(datum);
                }
                
                log.info("从节点 {} 恢复数据成功", member.getAddress());
                break;
            }
        } catch (Exception e) {
            log.error("从节点 {} 恢复数据失败", member.getAddress(), e);
        }
    }
}                `
`#// naming/src/main/java/com/alibaba/nacos/naming/core/DistroProtocol.java

public void loadDatumFromRemote() {
    // 1. 遍历所有其他节点
    for (Member member : memberManager.allMembersWithoutSelf()) {
        try {
            // 2. 请求全量数据
            String url = "http://" + member.getAddress() + "/v1/ns/distro/datums";
            RestResult<Map<String, Datum>> result = restTemplate.get(url);
            
            if (result.ok()) {
                Map<String, Datum> datums = result.getData();
                
                // 3. 写入本地内存
                for (Datum datum : datums.values()) {
                    distroConsistencyService.onDatum(datum);
                }
                
                log.info("从节点 {} 恢复数据成功", member.getAddress());
                break;
            }
        } catch (Exception e) {
            log.error("从节点 {} 恢复数据失败", member.getAddress(), e);
        }
    }
}                // 3. 写入本地内存`
`#// naming/src/main/java/com/alibaba/nacos/naming/core/DistroProtocol.java

public void loadDatumFromRemote() {
    // 1. 遍历所有其他节点
    for (Member member : memberManager.allMembersWithoutSelf()) {
        try {
            // 2. 请求全量数据
            String url = "http://" + member.getAddress() + "/v1/ns/distro/datums";
            RestResult<Map<String, Datum>> result = restTemplate.get(url);
            
            if (result.ok()) {
                Map<String, Datum> datums = result.getData();
                
                // 3. 写入本地内存
                for (Datum datum : datums.values()) {
                    distroConsistencyService.onDatum(datum);
                }
                
                log.info("从节点 {} 恢复数据成功", member.getAddress());
                break;
            }
        } catch (Exception e) {
            log.error("从节点 {} 恢复数据失败", member.getAddress(), e);
        }
    }
}                for (Datum datum : datums.values()) {`
`#// naming/src/main/java/com/alibaba/nacos/naming/core/DistroProtocol.java

public void loadDatumFromRemote() {
    // 1. 遍历所有其他节点
    for (Member member : memberManager.allMembersWithoutSelf()) {
        try {
            // 2. 请求全量数据
            String url = "http://" + member.getAddress() + "/v1/ns/distro/datums";
            RestResult<Map<String, Datum>> result = restTemplate.get(url);
            
            if (result.ok()) {
                Map<String, Datum> datums = result.getData();
                
                // 3. 写入本地内存
                for (Datum datum : datums.values()) {
                    distroConsistencyService.onDatum(datum);
                }
                
                log.info("从节点 {} 恢复数据成功", member.getAddress());
                break;
            }
        } catch (Exception e) {
            log.error("从节点 {} 恢复数据失败", member.getAddress(), e);
        }
    }
}                    distroConsistencyService.onDatum(datum);`
`#// naming/src/main/java/com/alibaba/nacos/naming/core/DistroProtocol.java

public void loadDatumFromRemote() {
    // 1. 遍历所有其他节点
    for (Member member : memberManager.allMembersWithoutSelf()) {
        try {
            // 2. 请求全量数据
            String url = "http://" + member.getAddress() + "/v1/ns/distro/datums";
            RestResult<Map<String, Datum>> result = restTemplate.get(url);
            
            if (result.ok()) {
                Map<String, Datum> datums = result.getData();
                
                // 3. 写入本地内存
                for (Datum datum : datums.values()) {
                    distroConsistencyService.onDatum(datum);
                }
                
                log.info("从节点 {} 恢复数据成功", member.getAddress());
                break;
            }
        } catch (Exception e) {
            log.error("从节点 {} 恢复数据失败", member.getAddress(), e);
        }
    }
}                }`
`#// naming/src/main/java/com/alibaba/nacos/naming/core/DistroProtocol.java

public void loadDatumFromRemote() {
    // 1. 遍历所有其他节点
    for (Member member : memberManager.allMembersWithoutSelf()) {
        try {
            // 2. 请求全量数据
            String url = "http://" + member.getAddress() + "/v1/ns/distro/datums";
            RestResult<Map<String, Datum>> result = restTemplate.get(url);
            
            if (result.ok()) {
                Map<String, Datum> datums = result.getData();
                
                // 3. 写入本地内存
                for (Datum datum : datums.values()) {
                    distroConsistencyService.onDatum(datum);
                }
                
                log.info("从节点 {} 恢复数据成功", member.getAddress());
                break;
            }
        } catch (Exception e) {
            log.error("从节点 {} 恢复数据失败", member.getAddress(), e);
        }
    }
}                `
`#// naming/src/main/java/com/alibaba/nacos/naming/core/DistroProtocol.java

public void loadDatumFromRemote() {
    // 1. 遍历所有其他节点
    for (Member member : memberManager.allMembersWithoutSelf()) {
        try {
            // 2. 请求全量数据
            String url = "http://" + member.getAddress() + "/v1/ns/distro/datums";
            RestResult<Map<String, Datum>> result = restTemplate.get(url);
            
            if (result.ok()) {
                Map<String, Datum> datums = result.getData();
                
                // 3. 写入本地内存
                for (Datum datum : datums.values()) {
                    distroConsistencyService.onDatum(datum);
                }
                
                log.info("从节点 {} 恢复数据成功", member.getAddress());
                break;
            }
        } catch (Exception e) {
            log.error("从节点 {} 恢复数据失败", member.getAddress(), e);
        }
    }
}                log.info("从节点 {} 恢复数据成功", member.getAddress());`
`#// naming/src/main/java/com/alibaba/nacos/naming/core/DistroProtocol.java

public void loadDatumFromRemote() {
    // 1. 遍历所有其他节点
    for (Member member : memberManager.allMembersWithoutSelf()) {
        try {
            // 2. 请求全量数据
            String url = "http://" + member.getAddress() + "/v1/ns/distro/datums";
            RestResult<Map<String, Datum>> result = restTemplate.get(url);
            
            if (result.ok()) {
                Map<String, Datum> datums = result.getData();
                
                // 3. 写入本地内存
                for (Datum datum : datums.values()) {
                    distroConsistencyService.onDatum(datum);
                }
                
                log.info("从节点 {} 恢复数据成功", member.getAddress());
                break;
            }
        } catch (Exception e) {
            log.error("从节点 {} 恢复数据失败", member.getAddress(), e);
        }
    }
}                break;`
`#// naming/src/main/java/com/alibaba/nacos/naming/core/DistroProtocol.java

public void loadDatumFromRemote() {
    // 1. 遍历所有其他节点
    for (Member member : memberManager.allMembersWithoutSelf()) {
        try {
            // 2. 请求全量数据
            String url = "http://" + member.getAddress() + "/v1/ns/distro/datums";
            RestResult<Map<String, Datum>> result = restTemplate.get(url);
            
            if (result.ok()) {
                Map<String, Datum> datums = result.getData();
                
                // 3. 写入本地内存
                for (Datum datum : datums.values()) {
                    distroConsistencyService.onDatum(datum);
                }
                
                log.info("从节点 {} 恢复数据成功", member.getAddress());
                break;
            }
        } catch (Exception e) {
            log.error("从节点 {} 恢复数据失败", member.getAddress(), e);
        }
    }
}            }`
`#// naming/src/main/java/com/alibaba/nacos/naming/core/DistroProtocol.java

public void loadDatumFromRemote() {
    // 1. 遍历所有其他节点
    for (Member member : memberManager.allMembersWithoutSelf()) {
        try {
            // 2. 请求全量数据
            String url = "http://" + member.getAddress() + "/v1/ns/distro/datums";
            RestResult<Map<String, Datum>> result = restTemplate.get(url);
            
            if (result.ok()) {
                Map<String, Datum> datums = result.getData();
                
                // 3. 写入本地内存
                for (Datum datum : datums.values()) {
                    distroConsistencyService.onDatum(datum);
                }
                
                log.info("从节点 {} 恢复数据成功", member.getAddress());
                break;
            }
        } catch (Exception e) {
            log.error("从节点 {} 恢复数据失败", member.getAddress(), e);
        }
    }
}        } catch (Exception e) {`
`#// naming/src/main/java/com/alibaba/nacos/naming/core/DistroProtocol.java

public void loadDatumFromRemote() {
    // 1. 遍历所有其他节点
    for (Member member : memberManager.allMembersWithoutSelf()) {
        try {
            // 2. 请求全量数据
            String url = "http://" + member.getAddress() + "/v1/ns/distro/datums";
            RestResult<Map<String, Datum>> result = restTemplate.get(url);
            
            if (result.ok()) {
                Map<String, Datum> datums = result.getData();
                
                // 3. 写入本地内存
                for (Datum datum : datums.values()) {
                    distroConsistencyService.onDatum(datum);
                }
                
                log.info("从节点 {} 恢复数据成功", member.getAddress());
                break;
            }
        } catch (Exception e) {
            log.error("从节点 {} 恢复数据失败", member.getAddress(), e);
        }
    }
}            log.error("从节点 {} 恢复数据失败", member.getAddress(), e);`
`#// naming/src/main/java/com/alibaba/nacos/naming/core/DistroProtocol.java

public void loadDatumFromRemote() {
    // 1. 遍历所有其他节点
    for (Member member : memberManager.allMembersWithoutSelf()) {
        try {
            // 2. 请求全量数据
            String url = "http://" + member.getAddress() + "/v1/ns/distro/datums";
            RestResult<Map<String, Datum>> result = restTemplate.get(url);
            
            if (result.ok()) {
                Map<String, Datum> datums = result.getData();
                
                // 3. 写入本地内存
                for (Datum datum : datums.values()) {
                    distroConsistencyService.onDatum(datum);
                }
                
                log.info("从节点 {} 恢复数据成功", member.getAddress());
                break;
            }
        } catch (Exception e) {
            log.error("从节点 {} 恢复数据失败", member.getAddress(), e);
        }
    }
}        }`
`#// naming/src/main/java/com/alibaba/nacos/naming/core/DistroProtocol.java

public void loadDatumFromRemote() {
    // 1. 遍历所有其他节点
    for (Member member : memberManager.allMembersWithoutSelf()) {
        try {
            // 2. 请求全量数据
            String url = "http://" + member.getAddress() + "/v1/ns/distro/datums";
            RestResult<Map<String, Datum>> result = restTemplate.get(url);
            
            if (result.ok()) {
                Map<String, Datum> datums = result.getData();
                
                // 3. 写入本地内存
                for (Datum datum : datums.values()) {
                    distroConsistencyService.onDatum(datum);
                }
                
                log.info("从节点 {} 恢复数据成功", member.getAddress());
                break;
            }
        } catch (Exception e) {
            log.error("从节点 {} 恢复数据失败", member.getAddress(), e);
        }
    }
}    }`
`#// naming/src/main/java/com/alibaba/nacos/naming/core/DistroProtocol.java

public void loadDatumFromRemote() {
    // 1. 遍历所有其他节点
    for (Member member : memberManager.allMembersWithoutSelf()) {
        try {
            // 2. 请求全量数据
            String url = "http://" + member.getAddress() + "/v1/ns/distro/datums";
            RestResult<Map<String, Datum>> result = restTemplate.get(url);
            
            if (result.ok()) {
                Map<String, Datum> datums = result.getData();
                
                // 3. 写入本地内存
                for (Datum datum : datums.values()) {
                    distroConsistencyService.onDatum(datum);
                }
                
                log.info("从节点 {} 恢复数据成功", member.getAddress());
                break;
            }
        } catch (Exception e) {
            log.error("从节点 {} 恢复数据失败", member.getAddress(), e);
        }
    }
}}

五、配置中心原理

5.1 配置推送流程

复制代码
sequenceDiagram
    participant Client as 客户端
    participant Server as Nacos Server
    participant DB as 持久化存储
    
    Client->>Server: 发布配置 (dataId, group, content)
    Server->>DB: 写入配置(持久化)
    DB-->>Server: 写入成功
    Server->>Server: 生成配置 MD5
    Server->>Server: 查询订阅该配置的客户端
    Server->>Client: 推送配置变更(长轮询)
    Client->>Client: 更新本地缓存
    Client->>Client: @RefreshScope 触发 Bean 刷新

5.2 长轮询机制

java 复制代码
#// 客户端长轮询代码(Spring Cloud Alibaba Nacos Config)

public class ConfigRpcTransportClient implements TransportClient {
    
    public String getConfig(String dataId, String group, long timeoutMs) throws NacosException {
        // 1. 检查本地缓存
        String cacheKey = GroupKey.getKey(dataId, group);
        CacheItem cacheItem = cacheMap.get(cacheKey);
        
        if (cacheItem != null) {
            // 2. 检查本地 MD5
            String localMd5 = MD5Utils.md5Hex(cacheItem.content);
            
            // 3. 向服务端发起长轮询
            ConfigQueryResponse response = server.queryConfig(dataId, group, localMd5, timeoutMs);
            
            if (response.isChanged()) {
                // 配置变更,更新本地缓存
                cacheItem.content = response.getContent();
                cacheItem.md5 = response.getMd5();
                
                // 通知监听器
                notifyListener(dataId, group, response.getContent());
                
                return response.getContent();
            }
        }
        
        return cacheItem.content;
    }
}// 客户端长轮询代码(Spring Cloud Alibaba Nacos Config)`
`#// 客户端长轮询代码(Spring Cloud Alibaba Nacos Config)

public class ConfigRpcTransportClient implements TransportClient {
    
    public String getConfig(String dataId, String group, long timeoutMs) throws NacosException {
        // 1. 检查本地缓存
        String cacheKey = GroupKey.getKey(dataId, group);
        CacheItem cacheItem = cacheMap.get(cacheKey);
        
        if (cacheItem != null) {
            // 2. 检查本地 MD5
            String localMd5 = MD5Utils.md5Hex(cacheItem.content);
            
            // 3. 向服务端发起长轮询
            ConfigQueryResponse response = server.queryConfig(dataId, group, localMd5, timeoutMs);
            
            if (response.isChanged()) {
                // 配置变更,更新本地缓存
                cacheItem.content = response.getContent();
                cacheItem.md5 = response.getMd5();
                
                // 通知监听器
                notifyListener(dataId, group, response.getContent());
                
                return response.getContent();
            }
        }
        
        return cacheItem.content;
    }
}`
`#// 客户端长轮询代码(Spring Cloud Alibaba Nacos Config)

public class ConfigRpcTransportClient implements TransportClient {
    
    public String getConfig(String dataId, String group, long timeoutMs) throws NacosException {
        // 1. 检查本地缓存
        String cacheKey = GroupKey.getKey(dataId, group);
        CacheItem cacheItem = cacheMap.get(cacheKey);
        
        if (cacheItem != null) {
            // 2. 检查本地 MD5
            String localMd5 = MD5Utils.md5Hex(cacheItem.content);
            
            // 3. 向服务端发起长轮询
            ConfigQueryResponse response = server.queryConfig(dataId, group, localMd5, timeoutMs);
            
            if (response.isChanged()) {
                // 配置变更,更新本地缓存
                cacheItem.content = response.getContent();
                cacheItem.md5 = response.getMd5();
                
                // 通知监听器
                notifyListener(dataId, group, response.getContent());
                
                return response.getContent();
            }
        }
        
        return cacheItem.content;
    }
}public class ConfigRpcTransportClient implements TransportClient {`
`#// 客户端长轮询代码(Spring Cloud Alibaba Nacos Config)

public class ConfigRpcTransportClient implements TransportClient {
    
    public String getConfig(String dataId, String group, long timeoutMs) throws NacosException {
        // 1. 检查本地缓存
        String cacheKey = GroupKey.getKey(dataId, group);
        CacheItem cacheItem = cacheMap.get(cacheKey);
        
        if (cacheItem != null) {
            // 2. 检查本地 MD5
            String localMd5 = MD5Utils.md5Hex(cacheItem.content);
            
            // 3. 向服务端发起长轮询
            ConfigQueryResponse response = server.queryConfig(dataId, group, localMd5, timeoutMs);
            
            if (response.isChanged()) {
                // 配置变更,更新本地缓存
                cacheItem.content = response.getContent();
                cacheItem.md5 = response.getMd5();
                
                // 通知监听器
                notifyListener(dataId, group, response.getContent());
                
                return response.getContent();
            }
        }
        
        return cacheItem.content;
    }
}    `
`#// 客户端长轮询代码(Spring Cloud Alibaba Nacos Config)

public class ConfigRpcTransportClient implements TransportClient {
    
    public String getConfig(String dataId, String group, long timeoutMs) throws NacosException {
        // 1. 检查本地缓存
        String cacheKey = GroupKey.getKey(dataId, group);
        CacheItem cacheItem = cacheMap.get(cacheKey);
        
        if (cacheItem != null) {
            // 2. 检查本地 MD5
            String localMd5 = MD5Utils.md5Hex(cacheItem.content);
            
            // 3. 向服务端发起长轮询
            ConfigQueryResponse response = server.queryConfig(dataId, group, localMd5, timeoutMs);
            
            if (response.isChanged()) {
                // 配置变更,更新本地缓存
                cacheItem.content = response.getContent();
                cacheItem.md5 = response.getMd5();
                
                // 通知监听器
                notifyListener(dataId, group, response.getContent());
                
                return response.getContent();
            }
        }
        
        return cacheItem.content;
    }
}    public String getConfig(String dataId, String group, long timeoutMs) throws NacosException {`
`#// 客户端长轮询代码(Spring Cloud Alibaba Nacos Config)

public class ConfigRpcTransportClient implements TransportClient {
    
    public String getConfig(String dataId, String group, long timeoutMs) throws NacosException {
        // 1. 检查本地缓存
        String cacheKey = GroupKey.getKey(dataId, group);
        CacheItem cacheItem = cacheMap.get(cacheKey);
        
        if (cacheItem != null) {
            // 2. 检查本地 MD5
            String localMd5 = MD5Utils.md5Hex(cacheItem.content);
            
            // 3. 向服务端发起长轮询
            ConfigQueryResponse response = server.queryConfig(dataId, group, localMd5, timeoutMs);
            
            if (response.isChanged()) {
                // 配置变更,更新本地缓存
                cacheItem.content = response.getContent();
                cacheItem.md5 = response.getMd5();
                
                // 通知监听器
                notifyListener(dataId, group, response.getContent());
                
                return response.getContent();
            }
        }
        
        return cacheItem.content;
    }
}        // 1. 检查本地缓存`
`#// 客户端长轮询代码(Spring Cloud Alibaba Nacos Config)

public class ConfigRpcTransportClient implements TransportClient {
    
    public String getConfig(String dataId, String group, long timeoutMs) throws NacosException {
        // 1. 检查本地缓存
        String cacheKey = GroupKey.getKey(dataId, group);
        CacheItem cacheItem = cacheMap.get(cacheKey);
        
        if (cacheItem != null) {
            // 2. 检查本地 MD5
            String localMd5 = MD5Utils.md5Hex(cacheItem.content);
            
            // 3. 向服务端发起长轮询
            ConfigQueryResponse response = server.queryConfig(dataId, group, localMd5, timeoutMs);
            
            if (response.isChanged()) {
                // 配置变更,更新本地缓存
                cacheItem.content = response.getContent();
                cacheItem.md5 = response.getMd5();
                
                // 通知监听器
                notifyListener(dataId, group, response.getContent());
                
                return response.getContent();
            }
        }
        
        return cacheItem.content;
    }
}        String cacheKey = GroupKey.getKey(dataId, group);`
`#// 客户端长轮询代码(Spring Cloud Alibaba Nacos Config)

public class ConfigRpcTransportClient implements TransportClient {
    
    public String getConfig(String dataId, String group, long timeoutMs) throws NacosException {
        // 1. 检查本地缓存
        String cacheKey = GroupKey.getKey(dataId, group);
        CacheItem cacheItem = cacheMap.get(cacheKey);
        
        if (cacheItem != null) {
            // 2. 检查本地 MD5
            String localMd5 = MD5Utils.md5Hex(cacheItem.content);
            
            // 3. 向服务端发起长轮询
            ConfigQueryResponse response = server.queryConfig(dataId, group, localMd5, timeoutMs);
            
            if (response.isChanged()) {
                // 配置变更,更新本地缓存
                cacheItem.content = response.getContent();
                cacheItem.md5 = response.getMd5();
                
                // 通知监听器
                notifyListener(dataId, group, response.getContent());
                
                return response.getContent();
            }
        }
        
        return cacheItem.content;
    }
}        CacheItem cacheItem = cacheMap.get(cacheKey);`
`#// 客户端长轮询代码(Spring Cloud Alibaba Nacos Config)

public class ConfigRpcTransportClient implements TransportClient {
    
    public String getConfig(String dataId, String group, long timeoutMs) throws NacosException {
        // 1. 检查本地缓存
        String cacheKey = GroupKey.getKey(dataId, group);
        CacheItem cacheItem = cacheMap.get(cacheKey);
        
        if (cacheItem != null) {
            // 2. 检查本地 MD5
            String localMd5 = MD5Utils.md5Hex(cacheItem.content);
            
            // 3. 向服务端发起长轮询
            ConfigQueryResponse response = server.queryConfig(dataId, group, localMd5, timeoutMs);
            
            if (response.isChanged()) {
                // 配置变更,更新本地缓存
                cacheItem.content = response.getContent();
                cacheItem.md5 = response.getMd5();
                
                // 通知监听器
                notifyListener(dataId, group, response.getContent());
                
                return response.getContent();
            }
        }
        
        return cacheItem.content;
    }
}        `
`#// 客户端长轮询代码(Spring Cloud Alibaba Nacos Config)

public class ConfigRpcTransportClient implements TransportClient {
    
    public String getConfig(String dataId, String group, long timeoutMs) throws NacosException {
        // 1. 检查本地缓存
        String cacheKey = GroupKey.getKey(dataId, group);
        CacheItem cacheItem = cacheMap.get(cacheKey);
        
        if (cacheItem != null) {
            // 2. 检查本地 MD5
            String localMd5 = MD5Utils.md5Hex(cacheItem.content);
            
            // 3. 向服务端发起长轮询
            ConfigQueryResponse response = server.queryConfig(dataId, group, localMd5, timeoutMs);
            
            if (response.isChanged()) {
                // 配置变更,更新本地缓存
                cacheItem.content = response.getContent();
                cacheItem.md5 = response.getMd5();
                
                // 通知监听器
                notifyListener(dataId, group, response.getContent());
                
                return response.getContent();
            }
        }
        
        return cacheItem.content;
    }
}        if (cacheItem != null) {`
`#// 客户端长轮询代码(Spring Cloud Alibaba Nacos Config)

public class ConfigRpcTransportClient implements TransportClient {
    
    public String getConfig(String dataId, String group, long timeoutMs) throws NacosException {
        // 1. 检查本地缓存
        String cacheKey = GroupKey.getKey(dataId, group);
        CacheItem cacheItem = cacheMap.get(cacheKey);
        
        if (cacheItem != null) {
            // 2. 检查本地 MD5
            String localMd5 = MD5Utils.md5Hex(cacheItem.content);
            
            // 3. 向服务端发起长轮询
            ConfigQueryResponse response = server.queryConfig(dataId, group, localMd5, timeoutMs);
            
            if (response.isChanged()) {
                // 配置变更,更新本地缓存
                cacheItem.content = response.getContent();
                cacheItem.md5 = response.getMd5();
                
                // 通知监听器
                notifyListener(dataId, group, response.getContent());
                
                return response.getContent();
            }
        }
        
        return cacheItem.content;
    }
}            // 2. 检查本地 MD5`
`#// 客户端长轮询代码(Spring Cloud Alibaba Nacos Config)

public class ConfigRpcTransportClient implements TransportClient {
    
    public String getConfig(String dataId, String group, long timeoutMs) throws NacosException {
        // 1. 检查本地缓存
        String cacheKey = GroupKey.getKey(dataId, group);
        CacheItem cacheItem = cacheMap.get(cacheKey);
        
        if (cacheItem != null) {
            // 2. 检查本地 MD5
            String localMd5 = MD5Utils.md5Hex(cacheItem.content);
            
            // 3. 向服务端发起长轮询
            ConfigQueryResponse response = server.queryConfig(dataId, group, localMd5, timeoutMs);
            
            if (response.isChanged()) {
                // 配置变更,更新本地缓存
                cacheItem.content = response.getContent();
                cacheItem.md5 = response.getMd5();
                
                // 通知监听器
                notifyListener(dataId, group, response.getContent());
                
                return response.getContent();
            }
        }
        
        return cacheItem.content;
    }
}            String localMd5 = MD5Utils.md5Hex(cacheItem.content);`
`#// 客户端长轮询代码(Spring Cloud Alibaba Nacos Config)

public class ConfigRpcTransportClient implements TransportClient {
    
    public String getConfig(String dataId, String group, long timeoutMs) throws NacosException {
        // 1. 检查本地缓存
        String cacheKey = GroupKey.getKey(dataId, group);
        CacheItem cacheItem = cacheMap.get(cacheKey);
        
        if (cacheItem != null) {
            // 2. 检查本地 MD5
            String localMd5 = MD5Utils.md5Hex(cacheItem.content);
            
            // 3. 向服务端发起长轮询
            ConfigQueryResponse response = server.queryConfig(dataId, group, localMd5, timeoutMs);
            
            if (response.isChanged()) {
                // 配置变更,更新本地缓存
                cacheItem.content = response.getContent();
                cacheItem.md5 = response.getMd5();
                
                // 通知监听器
                notifyListener(dataId, group, response.getContent());
                
                return response.getContent();
            }
        }
        
        return cacheItem.content;
    }
}            `
`#// 客户端长轮询代码(Spring Cloud Alibaba Nacos Config)

public class ConfigRpcTransportClient implements TransportClient {
    
    public String getConfig(String dataId, String group, long timeoutMs) throws NacosException {
        // 1. 检查本地缓存
        String cacheKey = GroupKey.getKey(dataId, group);
        CacheItem cacheItem = cacheMap.get(cacheKey);
        
        if (cacheItem != null) {
            // 2. 检查本地 MD5
            String localMd5 = MD5Utils.md5Hex(cacheItem.content);
            
            // 3. 向服务端发起长轮询
            ConfigQueryResponse response = server.queryConfig(dataId, group, localMd5, timeoutMs);
            
            if (response.isChanged()) {
                // 配置变更,更新本地缓存
                cacheItem.content = response.getContent();
                cacheItem.md5 = response.getMd5();
                
                // 通知监听器
                notifyListener(dataId, group, response.getContent());
                
                return response.getContent();
            }
        }
        
        return cacheItem.content;
    }
}            // 3. 向服务端发起长轮询`
`#// 客户端长轮询代码(Spring Cloud Alibaba Nacos Config)

public class ConfigRpcTransportClient implements TransportClient {
    
    public String getConfig(String dataId, String group, long timeoutMs) throws NacosException {
        // 1. 检查本地缓存
        String cacheKey = GroupKey.getKey(dataId, group);
        CacheItem cacheItem = cacheMap.get(cacheKey);
        
        if (cacheItem != null) {
            // 2. 检查本地 MD5
            String localMd5 = MD5Utils.md5Hex(cacheItem.content);
            
            // 3. 向服务端发起长轮询
            ConfigQueryResponse response = server.queryConfig(dataId, group, localMd5, timeoutMs);
            
            if (response.isChanged()) {
                // 配置变更,更新本地缓存
                cacheItem.content = response.getContent();
                cacheItem.md5 = response.getMd5();
                
                // 通知监听器
                notifyListener(dataId, group, response.getContent());
                
                return response.getContent();
            }
        }
        
        return cacheItem.content;
    }
}            ConfigQueryResponse response = server.queryConfig(dataId, group, localMd5, timeoutMs);`
`#// 客户端长轮询代码(Spring Cloud Alibaba Nacos Config)

public class ConfigRpcTransportClient implements TransportClient {
    
    public String getConfig(String dataId, String group, long timeoutMs) throws NacosException {
        // 1. 检查本地缓存
        String cacheKey = GroupKey.getKey(dataId, group);
        CacheItem cacheItem = cacheMap.get(cacheKey);
        
        if (cacheItem != null) {
            // 2. 检查本地 MD5
            String localMd5 = MD5Utils.md5Hex(cacheItem.content);
            
            // 3. 向服务端发起长轮询
            ConfigQueryResponse response = server.queryConfig(dataId, group, localMd5, timeoutMs);
            
            if (response.isChanged()) {
                // 配置变更,更新本地缓存
                cacheItem.content = response.getContent();
                cacheItem.md5 = response.getMd5();
                
                // 通知监听器
                notifyListener(dataId, group, response.getContent());
                
                return response.getContent();
            }
        }
        
        return cacheItem.content;
    }
}            `
`#// 客户端长轮询代码(Spring Cloud Alibaba Nacos Config)

public class ConfigRpcTransportClient implements TransportClient {
    
    public String getConfig(String dataId, String group, long timeoutMs) throws NacosException {
        // 1. 检查本地缓存
        String cacheKey = GroupKey.getKey(dataId, group);
        CacheItem cacheItem = cacheMap.get(cacheKey);
        
        if (cacheItem != null) {
            // 2. 检查本地 MD5
            String localMd5 = MD5Utils.md5Hex(cacheItem.content);
            
            // 3. 向服务端发起长轮询
            ConfigQueryResponse response = server.queryConfig(dataId, group, localMd5, timeoutMs);
            
            if (response.isChanged()) {
                // 配置变更,更新本地缓存
                cacheItem.content = response.getContent();
                cacheItem.md5 = response.getMd5();
                
                // 通知监听器
                notifyListener(dataId, group, response.getContent());
                
                return response.getContent();
            }
        }
        
        return cacheItem.content;
    }
}            if (response.isChanged()) {`
`#// 客户端长轮询代码(Spring Cloud Alibaba Nacos Config)

public class ConfigRpcTransportClient implements TransportClient {
    
    public String getConfig(String dataId, String group, long timeoutMs) throws NacosException {
        // 1. 检查本地缓存
        String cacheKey = GroupKey.getKey(dataId, group);
        CacheItem cacheItem = cacheMap.get(cacheKey);
        
        if (cacheItem != null) {
            // 2. 检查本地 MD5
            String localMd5 = MD5Utils.md5Hex(cacheItem.content);
            
            // 3. 向服务端发起长轮询
            ConfigQueryResponse response = server.queryConfig(dataId, group, localMd5, timeoutMs);
            
            if (response.isChanged()) {
                // 配置变更,更新本地缓存
                cacheItem.content = response.getContent();
                cacheItem.md5 = response.getMd5();
                
                // 通知监听器
                notifyListener(dataId, group, response.getContent());
                
                return response.getContent();
            }
        }
        
        return cacheItem.content;
    }
}                // 配置变更,更新本地缓存`
`#// 客户端长轮询代码(Spring Cloud Alibaba Nacos Config)

public class ConfigRpcTransportClient implements TransportClient {
    
    public String getConfig(String dataId, String group, long timeoutMs) throws NacosException {
        // 1. 检查本地缓存
        String cacheKey = GroupKey.getKey(dataId, group);
        CacheItem cacheItem = cacheMap.get(cacheKey);
        
        if (cacheItem != null) {
            // 2. 检查本地 MD5
            String localMd5 = MD5Utils.md5Hex(cacheItem.content);
            
            // 3. 向服务端发起长轮询
            ConfigQueryResponse response = server.queryConfig(dataId, group, localMd5, timeoutMs);
            
            if (response.isChanged()) {
                // 配置变更,更新本地缓存
                cacheItem.content = response.getContent();
                cacheItem.md5 = response.getMd5();
                
                // 通知监听器
                notifyListener(dataId, group, response.getContent());
                
                return response.getContent();
            }
        }
        
        return cacheItem.content;
    }
}                cacheItem.content = response.getContent();`
`#// 客户端长轮询代码(Spring Cloud Alibaba Nacos Config)

public class ConfigRpcTransportClient implements TransportClient {
    
    public String getConfig(String dataId, String group, long timeoutMs) throws NacosException {
        // 1. 检查本地缓存
        String cacheKey = GroupKey.getKey(dataId, group);
        CacheItem cacheItem = cacheMap.get(cacheKey);
        
        if (cacheItem != null) {
            // 2. 检查本地 MD5
            String localMd5 = MD5Utils.md5Hex(cacheItem.content);
            
            // 3. 向服务端发起长轮询
            ConfigQueryResponse response = server.queryConfig(dataId, group, localMd5, timeoutMs);
            
            if (response.isChanged()) {
                // 配置变更,更新本地缓存
                cacheItem.content = response.getContent();
                cacheItem.md5 = response.getMd5();
                
                // 通知监听器
                notifyListener(dataId, group, response.getContent());
                
                return response.getContent();
            }
        }
        
        return cacheItem.content;
    }
}                cacheItem.md5 = response.getMd5();`
`#// 客户端长轮询代码(Spring Cloud Alibaba Nacos Config)

public class ConfigRpcTransportClient implements TransportClient {
    
    public String getConfig(String dataId, String group, long timeoutMs) throws NacosException {
        // 1. 检查本地缓存
        String cacheKey = GroupKey.getKey(dataId, group);
        CacheItem cacheItem = cacheMap.get(cacheKey);
        
        if (cacheItem != null) {
            // 2. 检查本地 MD5
            String localMd5 = MD5Utils.md5Hex(cacheItem.content);
            
            // 3. 向服务端发起长轮询
            ConfigQueryResponse response = server.queryConfig(dataId, group, localMd5, timeoutMs);
            
            if (response.isChanged()) {
                // 配置变更,更新本地缓存
                cacheItem.content = response.getContent();
                cacheItem.md5 = response.getMd5();
                
                // 通知监听器
                notifyListener(dataId, group, response.getContent());
                
                return response.getContent();
            }
        }
        
        return cacheItem.content;
    }
}                `
`#// 客户端长轮询代码(Spring Cloud Alibaba Nacos Config)

public class ConfigRpcTransportClient implements TransportClient {
    
    public String getConfig(String dataId, String group, long timeoutMs) throws NacosException {
        // 1. 检查本地缓存
        String cacheKey = GroupKey.getKey(dataId, group);
        CacheItem cacheItem = cacheMap.get(cacheKey);
        
        if (cacheItem != null) {
            // 2. 检查本地 MD5
            String localMd5 = MD5Utils.md5Hex(cacheItem.content);
            
            // 3. 向服务端发起长轮询
            ConfigQueryResponse response = server.queryConfig(dataId, group, localMd5, timeoutMs);
            
            if (response.isChanged()) {
                // 配置变更,更新本地缓存
                cacheItem.content = response.getContent();
                cacheItem.md5 = response.getMd5();
                
                // 通知监听器
                notifyListener(dataId, group, response.getContent());
                
                return response.getContent();
            }
        }
        
        return cacheItem.content;
    }
}                // 通知监听器`
`#// 客户端长轮询代码(Spring Cloud Alibaba Nacos Config)

public class ConfigRpcTransportClient implements TransportClient {
    
    public String getConfig(String dataId, String group, long timeoutMs) throws NacosException {
        // 1. 检查本地缓存
        String cacheKey = GroupKey.getKey(dataId, group);
        CacheItem cacheItem = cacheMap.get(cacheKey);
        
        if (cacheItem != null) {
            // 2. 检查本地 MD5
            String localMd5 = MD5Utils.md5Hex(cacheItem.content);
            
            // 3. 向服务端发起长轮询
            ConfigQueryResponse response = server.queryConfig(dataId, group, localMd5, timeoutMs);
            
            if (response.isChanged()) {
                // 配置变更,更新本地缓存
                cacheItem.content = response.getContent();
                cacheItem.md5 = response.getMd5();
                
                // 通知监听器
                notifyListener(dataId, group, response.getContent());
                
                return response.getContent();
            }
        }
        
        return cacheItem.content;
    }
}                notifyListener(dataId, group, response.getContent());`
`#// 客户端长轮询代码(Spring Cloud Alibaba Nacos Config)

public class ConfigRpcTransportClient implements TransportClient {
    
    public String getConfig(String dataId, String group, long timeoutMs) throws NacosException {
        // 1. 检查本地缓存
        String cacheKey = GroupKey.getKey(dataId, group);
        CacheItem cacheItem = cacheMap.get(cacheKey);
        
        if (cacheItem != null) {
            // 2. 检查本地 MD5
            String localMd5 = MD5Utils.md5Hex(cacheItem.content);
            
            // 3. 向服务端发起长轮询
            ConfigQueryResponse response = server.queryConfig(dataId, group, localMd5, timeoutMs);
            
            if (response.isChanged()) {
                // 配置变更,更新本地缓存
                cacheItem.content = response.getContent();
                cacheItem.md5 = response.getMd5();
                
                // 通知监听器
                notifyListener(dataId, group, response.getContent());
                
                return response.getContent();
            }
        }
        
        return cacheItem.content;
    }
}                `
`#// 客户端长轮询代码(Spring Cloud Alibaba Nacos Config)

public class ConfigRpcTransportClient implements TransportClient {
    
    public String getConfig(String dataId, String group, long timeoutMs) throws NacosException {
        // 1. 检查本地缓存
        String cacheKey = GroupKey.getKey(dataId, group);
        CacheItem cacheItem = cacheMap.get(cacheKey);
        
        if (cacheItem != null) {
            // 2. 检查本地 MD5
            String localMd5 = MD5Utils.md5Hex(cacheItem.content);
            
            // 3. 向服务端发起长轮询
            ConfigQueryResponse response = server.queryConfig(dataId, group, localMd5, timeoutMs);
            
            if (response.isChanged()) {
                // 配置变更,更新本地缓存
                cacheItem.content = response.getContent();
                cacheItem.md5 = response.getMd5();
                
                // 通知监听器
                notifyListener(dataId, group, response.getContent());
                
                return response.getContent();
            }
        }
        
        return cacheItem.content;
    }
}                return response.getContent();`
`#// 客户端长轮询代码(Spring Cloud Alibaba Nacos Config)

public class ConfigRpcTransportClient implements TransportClient {
    
    public String getConfig(String dataId, String group, long timeoutMs) throws NacosException {
        // 1. 检查本地缓存
        String cacheKey = GroupKey.getKey(dataId, group);
        CacheItem cacheItem = cacheMap.get(cacheKey);
        
        if (cacheItem != null) {
            // 2. 检查本地 MD5
            String localMd5 = MD5Utils.md5Hex(cacheItem.content);
            
            // 3. 向服务端发起长轮询
            ConfigQueryResponse response = server.queryConfig(dataId, group, localMd5, timeoutMs);
            
            if (response.isChanged()) {
                // 配置变更,更新本地缓存
                cacheItem.content = response.getContent();
                cacheItem.md5 = response.getMd5();
                
                // 通知监听器
                notifyListener(dataId, group, response.getContent());
                
                return response.getContent();
            }
        }
        
        return cacheItem.content;
    }
}            }`
`#// 客户端长轮询代码(Spring Cloud Alibaba Nacos Config)

public class ConfigRpcTransportClient implements TransportClient {
    
    public String getConfig(String dataId, String group, long timeoutMs) throws NacosException {
        // 1. 检查本地缓存
        String cacheKey = GroupKey.getKey(dataId, group);
        CacheItem cacheItem = cacheMap.get(cacheKey);
        
        if (cacheItem != null) {
            // 2. 检查本地 MD5
            String localMd5 = MD5Utils.md5Hex(cacheItem.content);
            
            // 3. 向服务端发起长轮询
            ConfigQueryResponse response = server.queryConfig(dataId, group, localMd5, timeoutMs);
            
            if (response.isChanged()) {
                // 配置变更,更新本地缓存
                cacheItem.content = response.getContent();
                cacheItem.md5 = response.getMd5();
                
                // 通知监听器
                notifyListener(dataId, group, response.getContent());
                
                return response.getContent();
            }
        }
        
        return cacheItem.content;
    }
}        }`
`#// 客户端长轮询代码(Spring Cloud Alibaba Nacos Config)

public class ConfigRpcTransportClient implements TransportClient {
    
    public String getConfig(String dataId, String group, long timeoutMs) throws NacosException {
        // 1. 检查本地缓存
        String cacheKey = GroupKey.getKey(dataId, group);
        CacheItem cacheItem = cacheMap.get(cacheKey);
        
        if (cacheItem != null) {
            // 2. 检查本地 MD5
            String localMd5 = MD5Utils.md5Hex(cacheItem.content);
            
            // 3. 向服务端发起长轮询
            ConfigQueryResponse response = server.queryConfig(dataId, group, localMd5, timeoutMs);
            
            if (response.isChanged()) {
                // 配置变更,更新本地缓存
                cacheItem.content = response.getContent();
                cacheItem.md5 = response.getMd5();
                
                // 通知监听器
                notifyListener(dataId, group, response.getContent());
                
                return response.getContent();
            }
        }
        
        return cacheItem.content;
    }
}        `
`#// 客户端长轮询代码(Spring Cloud Alibaba Nacos Config)

public class ConfigRpcTransportClient implements TransportClient {
    
    public String getConfig(String dataId, String group, long timeoutMs) throws NacosException {
        // 1. 检查本地缓存
        String cacheKey = GroupKey.getKey(dataId, group);
        CacheItem cacheItem = cacheMap.get(cacheKey);
        
        if (cacheItem != null) {
            // 2. 检查本地 MD5
            String localMd5 = MD5Utils.md5Hex(cacheItem.content);
            
            // 3. 向服务端发起长轮询
            ConfigQueryResponse response = server.queryConfig(dataId, group, localMd5, timeoutMs);
            
            if (response.isChanged()) {
                // 配置变更,更新本地缓存
                cacheItem.content = response.getContent();
                cacheItem.md5 = response.getMd5();
                
                // 通知监听器
                notifyListener(dataId, group, response.getContent());
                
                return response.getContent();
            }
        }
        
        return cacheItem.content;
    }
}        return cacheItem.content;`
`#// 客户端长轮询代码(Spring Cloud Alibaba Nacos Config)

public class ConfigRpcTransportClient implements TransportClient {
    
    public String getConfig(String dataId, String group, long timeoutMs) throws NacosException {
        // 1. 检查本地缓存
        String cacheKey = GroupKey.getKey(dataId, group);
        CacheItem cacheItem = cacheMap.get(cacheKey);
        
        if (cacheItem != null) {
            // 2. 检查本地 MD5
            String localMd5 = MD5Utils.md5Hex(cacheItem.content);
            
            // 3. 向服务端发起长轮询
            ConfigQueryResponse response = server.queryConfig(dataId, group, localMd5, timeoutMs);
            
            if (response.isChanged()) {
                // 配置变更,更新本地缓存
                cacheItem.content = response.getContent();
                cacheItem.md5 = response.getMd5();
                
                // 通知监听器
                notifyListener(dataId, group, response.getContent());
                
                return response.getContent();
            }
        }
        
        return cacheItem.content;
    }
}    }`
`#// 客户端长轮询代码(Spring Cloud Alibaba Nacos Config)

public class ConfigRpcTransportClient implements TransportClient {
    
    public String getConfig(String dataId, String group, long timeoutMs) throws NacosException {
        // 1. 检查本地缓存
        String cacheKey = GroupKey.getKey(dataId, group);
        CacheItem cacheItem = cacheMap.get(cacheKey);
        
        if (cacheItem != null) {
            // 2. 检查本地 MD5
            String localMd5 = MD5Utils.md5Hex(cacheItem.content);
            
            // 3. 向服务端发起长轮询
            ConfigQueryResponse response = server.queryConfig(dataId, group, localMd5, timeoutMs);
            
            if (response.isChanged()) {
                // 配置变更,更新本地缓存
                cacheItem.content = response.getContent();
                cacheItem.md5 = response.getMd5();
                
                // 通知监听器
                notifyListener(dataId, group, response.getContent());
                
                return response.getContent();
            }
        }
        
        return cacheItem.content;
    }
}}

5.3 配置存储结构

sql 复制代码
#-- Nacos 配置表
CREATE TABLE `config_info` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `data_id` varchar(255) NOT NULL COMMENT '配置ID',
  `group_id` varchar(128) DEFAULT NULL COMMENT '分组ID',
  `content` longtext NOT NULL COMMENT '配置内容',
  `md5` varchar(32) DEFAULT NULL COMMENT 'MD5值',
  `gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  `src_user` varchar(128) DEFAULT NULL,
  `src_ip` varchar(50) DEFAULT NULL,
  `app_name` varchar(128) DEFAULT NULL,
  `tenant_id` varchar(128) DEFAULT '' COMMENT '租户字段(对应命名空间ID)',
  `c_desc` varchar(256) DEFAULT NULL,
  `c_use` varchar(64) DEFAULT NULL,
  `effect` varchar(64) DEFAULT NULL,
  `type` varchar(64) DEFAULT NULL,
  `c_schema` text,
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_configinfo_datagrouptenant` (`data_id`,`group_id`,`tenant_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

-- 配置历史表
CREATE TABLE `his_config_info` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `nid` bigint(20) NOT NULL AUTO_INCREMENT,
  `data_id` varchar(255) NOT NULL,
  `group_id` varchar(128) NOT NULL,
  `app_name` varchar(128) DEFAULT NULL,
  `content` longtext NOT NULL,
  `md5` varchar(32) DEFAULT NULL,
  `gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  `src_user` varchar(128) DEFAULT NULL,
  `src_ip` varchar(50) DEFAULT NULL,
  `op_type` char(10) DEFAULT NULL,
  `tenant_id` varchar(128) DEFAULT '' COMMENT '租户字段',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_configinfo_datagrouptenant` (`data_id`,`group_id`,`tenant_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;-- Nacos 配置表`
`#-- Nacos 配置表
CREATE TABLE `config_info` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `data_id` varchar(255) NOT NULL COMMENT '配置ID',
  `group_id` varchar(128) DEFAULT NULL COMMENT '分组ID',
  `content` longtext NOT NULL COMMENT '配置内容',
  `md5` varchar(32) DEFAULT NULL COMMENT 'MD5值',
  `gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  `src_user` varchar(128) DEFAULT NULL,
  `src_ip` varchar(50) DEFAULT NULL,
  `app_name` varchar(128) DEFAULT NULL,
  `tenant_id` varchar(128) DEFAULT '' COMMENT '租户字段(对应命名空间ID)',
  `c_desc` varchar(256) DEFAULT NULL,
  `c_use` varchar(64) DEFAULT NULL,
  `effect` varchar(64) DEFAULT NULL,
  `type` varchar(64) DEFAULT NULL,
  `c_schema` text,
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_configinfo_datagrouptenant` (`data_id`,`group_id`,`tenant_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

-- 配置历史表
CREATE TABLE `his_config_info` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `nid` bigint(20) NOT NULL AUTO_INCREMENT,
  `data_id` varchar(255) NOT NULL,
  `group_id` varchar(128) NOT NULL,
  `app_name` varchar(128) DEFAULT NULL,
  `content` longtext NOT NULL,
  `md5` varchar(32) DEFAULT NULL,
  `gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  `src_user` varchar(128) DEFAULT NULL,
  `src_ip` varchar(50) DEFAULT NULL,
  `op_type` char(10) DEFAULT NULL,
  `tenant_id` varchar(128) DEFAULT '' COMMENT '租户字段',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_configinfo_datagrouptenant` (`data_id`,`group_id`,`tenant_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;CREATE TABLE `config_info` (`
`#-- Nacos 配置表
CREATE TABLE `config_info` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `data_id` varchar(255) NOT NULL COMMENT '配置ID',
  `group_id` varchar(128) DEFAULT NULL COMMENT '分组ID',
  `content` longtext NOT NULL COMMENT '配置内容',
  `md5` varchar(32) DEFAULT NULL COMMENT 'MD5值',
  `gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  `src_user` varchar(128) DEFAULT NULL,
  `src_ip` varchar(50) DEFAULT NULL,
  `app_name` varchar(128) DEFAULT NULL,
  `tenant_id` varchar(128) DEFAULT '' COMMENT '租户字段(对应命名空间ID)',
  `c_desc` varchar(256) DEFAULT NULL,
  `c_use` varchar(64) DEFAULT NULL,
  `effect` varchar(64) DEFAULT NULL,
  `type` varchar(64) DEFAULT NULL,
  `c_schema` text,
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_configinfo_datagrouptenant` (`data_id`,`group_id`,`tenant_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

-- 配置历史表
CREATE TABLE `his_config_info` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `nid` bigint(20) NOT NULL AUTO_INCREMENT,
  `data_id` varchar(255) NOT NULL,
  `group_id` varchar(128) NOT NULL,
  `app_name` varchar(128) DEFAULT NULL,
  `content` longtext NOT NULL,
  `md5` varchar(32) DEFAULT NULL,
  `gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  `src_user` varchar(128) DEFAULT NULL,
  `src_ip` varchar(50) DEFAULT NULL,
  `op_type` char(10) DEFAULT NULL,
  `tenant_id` varchar(128) DEFAULT '' COMMENT '租户字段',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_configinfo_datagrouptenant` (`data_id`,`group_id`,`tenant_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;  `id` bigint(20) NOT NULL AUTO_INCREMENT,`
`#-- Nacos 配置表
CREATE TABLE `config_info` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `data_id` varchar(255) NOT NULL COMMENT '配置ID',
  `group_id` varchar(128) DEFAULT NULL COMMENT '分组ID',
  `content` longtext NOT NULL COMMENT '配置内容',
  `md5` varchar(32) DEFAULT NULL COMMENT 'MD5值',
  `gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  `src_user` varchar(128) DEFAULT NULL,
  `src_ip` varchar(50) DEFAULT NULL,
  `app_name` varchar(128) DEFAULT NULL,
  `tenant_id` varchar(128) DEFAULT '' COMMENT '租户字段(对应命名空间ID)',
  `c_desc` varchar(256) DEFAULT NULL,
  `c_use` varchar(64) DEFAULT NULL,
  `effect` varchar(64) DEFAULT NULL,
  `type` varchar(64) DEFAULT NULL,
  `c_schema` text,
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_configinfo_datagrouptenant` (`data_id`,`group_id`,`tenant_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

-- 配置历史表
CREATE TABLE `his_config_info` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `nid` bigint(20) NOT NULL AUTO_INCREMENT,
  `data_id` varchar(255) NOT NULL,
  `group_id` varchar(128) NOT NULL,
  `app_name` varchar(128) DEFAULT NULL,
  `content` longtext NOT NULL,
  `md5` varchar(32) DEFAULT NULL,
  `gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  `src_user` varchar(128) DEFAULT NULL,
  `src_ip` varchar(50) DEFAULT NULL,
  `op_type` char(10) DEFAULT NULL,
  `tenant_id` varchar(128) DEFAULT '' COMMENT '租户字段',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_configinfo_datagrouptenant` (`data_id`,`group_id`,`tenant_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;  `data_id` varchar(255) NOT NULL COMMENT '配置ID',`
`#-- Nacos 配置表
CREATE TABLE `config_info` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `data_id` varchar(255) NOT NULL COMMENT '配置ID',
  `group_id` varchar(128) DEFAULT NULL COMMENT '分组ID',
  `content` longtext NOT NULL COMMENT '配置内容',
  `md5` varchar(32) DEFAULT NULL COMMENT 'MD5值',
  `gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  `src_user` varchar(128) DEFAULT NULL,
  `src_ip` varchar(50) DEFAULT NULL,
  `app_name` varchar(128) DEFAULT NULL,
  `tenant_id` varchar(128) DEFAULT '' COMMENT '租户字段(对应命名空间ID)',
  `c_desc` varchar(256) DEFAULT NULL,
  `c_use` varchar(64) DEFAULT NULL,
  `effect` varchar(64) DEFAULT NULL,
  `type` varchar(64) DEFAULT NULL,
  `c_schema` text,
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_configinfo_datagrouptenant` (`data_id`,`group_id`,`tenant_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

-- 配置历史表
CREATE TABLE `his_config_info` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `nid` bigint(20) NOT NULL AUTO_INCREMENT,
  `data_id` varchar(255) NOT NULL,
  `group_id` varchar(128) NOT NULL,
  `app_name` varchar(128) DEFAULT NULL,
  `content` longtext NOT NULL,
  `md5` varchar(32) DEFAULT NULL,
  `gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  `src_user` varchar(128) DEFAULT NULL,
  `src_ip` varchar(50) DEFAULT NULL,
  `op_type` char(10) DEFAULT NULL,
  `tenant_id` varchar(128) DEFAULT '' COMMENT '租户字段',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_configinfo_datagrouptenant` (`data_id`,`group_id`,`tenant_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;  `group_id` varchar(128) DEFAULT NULL COMMENT '分组ID',`
`#-- Nacos 配置表
CREATE TABLE `config_info` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `data_id` varchar(255) NOT NULL COMMENT '配置ID',
  `group_id` varchar(128) DEFAULT NULL COMMENT '分组ID',
  `content` longtext NOT NULL COMMENT '配置内容',
  `md5` varchar(32) DEFAULT NULL COMMENT 'MD5值',
  `gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  `src_user` varchar(128) DEFAULT NULL,
  `src_ip` varchar(50) DEFAULT NULL,
  `app_name` varchar(128) DEFAULT NULL,
  `tenant_id` varchar(128) DEFAULT '' COMMENT '租户字段(对应命名空间ID)',
  `c_desc` varchar(256) DEFAULT NULL,
  `c_use` varchar(64) DEFAULT NULL,
  `effect` varchar(64) DEFAULT NULL,
  `type` varchar(64) DEFAULT NULL,
  `c_schema` text,
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_configinfo_datagrouptenant` (`data_id`,`group_id`,`tenant_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

-- 配置历史表
CREATE TABLE `his_config_info` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `nid` bigint(20) NOT NULL AUTO_INCREMENT,
  `data_id` varchar(255) NOT NULL,
  `group_id` varchar(128) NOT NULL,
  `app_name` varchar(128) DEFAULT NULL,
  `content` longtext NOT NULL,
  `md5` varchar(32) DEFAULT NULL,
  `gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  `src_user` varchar(128) DEFAULT NULL,
  `src_ip` varchar(50) DEFAULT NULL,
  `op_type` char(10) DEFAULT NULL,
  `tenant_id` varchar(128) DEFAULT '' COMMENT '租户字段',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_configinfo_datagrouptenant` (`data_id`,`group_id`,`tenant_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;  `content` longtext NOT NULL COMMENT '配置内容',`
`#-- Nacos 配置表
CREATE TABLE `config_info` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `data_id` varchar(255) NOT NULL COMMENT '配置ID',
  `group_id` varchar(128) DEFAULT NULL COMMENT '分组ID',
  `content` longtext NOT NULL COMMENT '配置内容',
  `md5` varchar(32) DEFAULT NULL COMMENT 'MD5值',
  `gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  `src_user` varchar(128) DEFAULT NULL,
  `src_ip` varchar(50) DEFAULT NULL,
  `app_name` varchar(128) DEFAULT NULL,
  `tenant_id` varchar(128) DEFAULT '' COMMENT '租户字段(对应命名空间ID)',
  `c_desc` varchar(256) DEFAULT NULL,
  `c_use` varchar(64) DEFAULT NULL,
  `effect` varchar(64) DEFAULT NULL,
  `type` varchar(64) DEFAULT NULL,
  `c_schema` text,
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_configinfo_datagrouptenant` (`data_id`,`group_id`,`tenant_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

-- 配置历史表
CREATE TABLE `his_config_info` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `nid` bigint(20) NOT NULL AUTO_INCREMENT,
  `data_id` varchar(255) NOT NULL,
  `group_id` varchar(128) NOT NULL,
  `app_name` varchar(128) DEFAULT NULL,
  `content` longtext NOT NULL,
  `md5` varchar(32) DEFAULT NULL,
  `gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  `src_user` varchar(128) DEFAULT NULL,
  `src_ip` varchar(50) DEFAULT NULL,
  `op_type` char(10) DEFAULT NULL,
  `tenant_id` varchar(128) DEFAULT '' COMMENT '租户字段',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_configinfo_datagrouptenant` (`data_id`,`group_id`,`tenant_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;  `md5` varchar(32) DEFAULT NULL COMMENT 'MD5值',`
`#-- Nacos 配置表
CREATE TABLE `config_info` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `data_id` varchar(255) NOT NULL COMMENT '配置ID',
  `group_id` varchar(128) DEFAULT NULL COMMENT '分组ID',
  `content` longtext NOT NULL COMMENT '配置内容',
  `md5` varchar(32) DEFAULT NULL COMMENT 'MD5值',
  `gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  `src_user` varchar(128) DEFAULT NULL,
  `src_ip` varchar(50) DEFAULT NULL,
  `app_name` varchar(128) DEFAULT NULL,
  `tenant_id` varchar(128) DEFAULT '' COMMENT '租户字段(对应命名空间ID)',
  `c_desc` varchar(256) DEFAULT NULL,
  `c_use` varchar(64) DEFAULT NULL,
  `effect` varchar(64) DEFAULT NULL,
  `type` varchar(64) DEFAULT NULL,
  `c_schema` text,
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_configinfo_datagrouptenant` (`data_id`,`group_id`,`tenant_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

-- 配置历史表
CREATE TABLE `his_config_info` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `nid` bigint(20) NOT NULL AUTO_INCREMENT,
  `data_id` varchar(255) NOT NULL,
  `group_id` varchar(128) NOT NULL,
  `app_name` varchar(128) DEFAULT NULL,
  `content` longtext NOT NULL,
  `md5` varchar(32) DEFAULT NULL,
  `gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  `src_user` varchar(128) DEFAULT NULL,
  `src_ip` varchar(50) DEFAULT NULL,
  `op_type` char(10) DEFAULT NULL,
  `tenant_id` varchar(128) DEFAULT '' COMMENT '租户字段',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_configinfo_datagrouptenant` (`data_id`,`group_id`,`tenant_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;  `gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,`
`#-- Nacos 配置表
CREATE TABLE `config_info` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `data_id` varchar(255) NOT NULL COMMENT '配置ID',
  `group_id` varchar(128) DEFAULT NULL COMMENT '分组ID',
  `content` longtext NOT NULL COMMENT '配置内容',
  `md5` varchar(32) DEFAULT NULL COMMENT 'MD5值',
  `gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  `src_user` varchar(128) DEFAULT NULL,
  `src_ip` varchar(50) DEFAULT NULL,
  `app_name` varchar(128) DEFAULT NULL,
  `tenant_id` varchar(128) DEFAULT '' COMMENT '租户字段(对应命名空间ID)',
  `c_desc` varchar(256) DEFAULT NULL,
  `c_use` varchar(64) DEFAULT NULL,
  `effect` varchar(64) DEFAULT NULL,
  `type` varchar(64) DEFAULT NULL,
  `c_schema` text,
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_configinfo_datagrouptenant` (`data_id`,`group_id`,`tenant_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

-- 配置历史表
CREATE TABLE `his_config_info` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `nid` bigint(20) NOT NULL AUTO_INCREMENT,
  `data_id` varchar(255) NOT NULL,
  `group_id` varchar(128) NOT NULL,
  `app_name` varchar(128) DEFAULT NULL,
  `content` longtext NOT NULL,
  `md5` varchar(32) DEFAULT NULL,
  `gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  `src_user` varchar(128) DEFAULT NULL,
  `src_ip` varchar(50) DEFAULT NULL,
  `op_type` char(10) DEFAULT NULL,
  `tenant_id` varchar(128) DEFAULT '' COMMENT '租户字段',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_configinfo_datagrouptenant` (`data_id`,`group_id`,`tenant_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;  `gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,`
`#-- Nacos 配置表
CREATE TABLE `config_info` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `data_id` varchar(255) NOT NULL COMMENT '配置ID',
  `group_id` varchar(128) DEFAULT NULL COMMENT '分组ID',
  `content` longtext NOT NULL COMMENT '配置内容',
  `md5` varchar(32) DEFAULT NULL COMMENT 'MD5值',
  `gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  `src_user` varchar(128) DEFAULT NULL,
  `src_ip` varchar(50) DEFAULT NULL,
  `app_name` varchar(128) DEFAULT NULL,
  `tenant_id` varchar(128) DEFAULT '' COMMENT '租户字段(对应命名空间ID)',
  `c_desc` varchar(256) DEFAULT NULL,
  `c_use` varchar(64) DEFAULT NULL,
  `effect` varchar(64) DEFAULT NULL,
  `type` varchar(64) DEFAULT NULL,
  `c_schema` text,
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_configinfo_datagrouptenant` (`data_id`,`group_id`,`tenant_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

-- 配置历史表
CREATE TABLE `his_config_info` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `nid` bigint(20) NOT NULL AUTO_INCREMENT,
  `data_id` varchar(255) NOT NULL,
  `group_id` varchar(128) NOT NULL,
  `app_name` varchar(128) DEFAULT NULL,
  `content` longtext NOT NULL,
  `md5` varchar(32) DEFAULT NULL,
  `gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  `src_user` varchar(128) DEFAULT NULL,
  `src_ip` varchar(50) DEFAULT NULL,
  `op_type` char(10) DEFAULT NULL,
  `tenant_id` varchar(128) DEFAULT '' COMMENT '租户字段',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_configinfo_datagrouptenant` (`data_id`,`group_id`,`tenant_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;  `src_user` varchar(128) DEFAULT NULL,`
`#-- Nacos 配置表
CREATE TABLE `config_info` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `data_id` varchar(255) NOT NULL COMMENT '配置ID',
  `group_id` varchar(128) DEFAULT NULL COMMENT '分组ID',
  `content` longtext NOT NULL COMMENT '配置内容',
  `md5` varchar(32) DEFAULT NULL COMMENT 'MD5值',
  `gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  `src_user` varchar(128) DEFAULT NULL,
  `src_ip` varchar(50) DEFAULT NULL,
  `app_name` varchar(128) DEFAULT NULL,
  `tenant_id` varchar(128) DEFAULT '' COMMENT '租户字段(对应命名空间ID)',
  `c_desc` varchar(256) DEFAULT NULL,
  `c_use` varchar(64) DEFAULT NULL,
  `effect` varchar(64) DEFAULT NULL,
  `type` varchar(64) DEFAULT NULL,
  `c_schema` text,
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_configinfo_datagrouptenant` (`data_id`,`group_id`,`tenant_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

-- 配置历史表
CREATE TABLE `his_config_info` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `nid` bigint(20) NOT NULL AUTO_INCREMENT,
  `data_id` varchar(255) NOT NULL,
  `group_id` varchar(128) NOT NULL,
  `app_name` varchar(128) DEFAULT NULL,
  `content` longtext NOT NULL,
  `md5` varchar(32) DEFAULT NULL,
  `gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  `src_user` varchar(128) DEFAULT NULL,
  `src_ip` varchar(50) DEFAULT NULL,
  `op_type` char(10) DEFAULT NULL,
  `tenant_id` varchar(128) DEFAULT '' COMMENT '租户字段',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_configinfo_datagrouptenant` (`data_id`,`group_id`,`tenant_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;  `src_ip` varchar(50) DEFAULT NULL,`
`#-- Nacos 配置表
CREATE TABLE `config_info` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `data_id` varchar(255) NOT NULL COMMENT '配置ID',
  `group_id` varchar(128) DEFAULT NULL COMMENT '分组ID',
  `content` longtext NOT NULL COMMENT '配置内容',
  `md5` varchar(32) DEFAULT NULL COMMENT 'MD5值',
  `gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  `src_user` varchar(128) DEFAULT NULL,
  `src_ip` varchar(50) DEFAULT NULL,
  `app_name` varchar(128) DEFAULT NULL,
  `tenant_id` varchar(128) DEFAULT '' COMMENT '租户字段(对应命名空间ID)',
  `c_desc` varchar(256) DEFAULT NULL,
  `c_use` varchar(64) DEFAULT NULL,
  `effect` varchar(64) DEFAULT NULL,
  `type` varchar(64) DEFAULT NULL,
  `c_schema` text,
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_configinfo_datagrouptenant` (`data_id`,`group_id`,`tenant_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

-- 配置历史表
CREATE TABLE `his_config_info` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `nid` bigint(20) NOT NULL AUTO_INCREMENT,
  `data_id` varchar(255) NOT NULL,
  `group_id` varchar(128) NOT NULL,
  `app_name` varchar(128) DEFAULT NULL,
  `content` longtext NOT NULL,
  `md5` varchar(32) DEFAULT NULL,
  `gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  `src_user` varchar(128) DEFAULT NULL,
  `src_ip` varchar(50) DEFAULT NULL,
  `op_type` char(10) DEFAULT NULL,
  `tenant_id` varchar(128) DEFAULT '' COMMENT '租户字段',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_configinfo_datagrouptenant` (`data_id`,`group_id`,`tenant_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;  `app_name` varchar(128) DEFAULT NULL,`
`#-- Nacos 配置表
CREATE TABLE `config_info` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `data_id` varchar(255) NOT NULL COMMENT '配置ID',
  `group_id` varchar(128) DEFAULT NULL COMMENT '分组ID',
  `content` longtext NOT NULL COMMENT '配置内容',
  `md5` varchar(32) DEFAULT NULL COMMENT 'MD5值',
  `gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  `src_user` varchar(128) DEFAULT NULL,
  `src_ip` varchar(50) DEFAULT NULL,
  `app_name` varchar(128) DEFAULT NULL,
  `tenant_id` varchar(128) DEFAULT '' COMMENT '租户字段(对应命名空间ID)',
  `c_desc` varchar(256) DEFAULT NULL,
  `c_use` varchar(64) DEFAULT NULL,
  `effect` varchar(64) DEFAULT NULL,
  `type` varchar(64) DEFAULT NULL,
  `c_schema` text,
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_configinfo_datagrouptenant` (`data_id`,`group_id`,`tenant_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

-- 配置历史表
CREATE TABLE `his_config_info` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `nid` bigint(20) NOT NULL AUTO_INCREMENT,
  `data_id` varchar(255) NOT NULL,
  `group_id` varchar(128) NOT NULL,
  `app_name` varchar(128) DEFAULT NULL,
  `content` longtext NOT NULL,
  `md5` varchar(32) DEFAULT NULL,
  `gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  `src_user` varchar(128) DEFAULT NULL,
  `src_ip` varchar(50) DEFAULT NULL,
  `op_type` char(10) DEFAULT NULL,
  `tenant_id` varchar(128) DEFAULT '' COMMENT '租户字段',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_configinfo_datagrouptenant` (`data_id`,`group_id`,`tenant_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;  `tenant_id` varchar(128) DEFAULT '' COMMENT '租户字段(对应命名空间ID)',`
`#-- Nacos 配置表
CREATE TABLE `config_info` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `data_id` varchar(255) NOT NULL COMMENT '配置ID',
  `group_id` varchar(128) DEFAULT NULL COMMENT '分组ID',
  `content` longtext NOT NULL COMMENT '配置内容',
  `md5` varchar(32) DEFAULT NULL COMMENT 'MD5值',
  `gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  `src_user` varchar(128) DEFAULT NULL,
  `src_ip` varchar(50) DEFAULT NULL,
  `app_name` varchar(128) DEFAULT NULL,
  `tenant_id` varchar(128) DEFAULT '' COMMENT '租户字段(对应命名空间ID)',
  `c_desc` varchar(256) DEFAULT NULL,
  `c_use` varchar(64) DEFAULT NULL,
  `effect` varchar(64) DEFAULT NULL,
  `type` varchar(64) DEFAULT NULL,
  `c_schema` text,
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_configinfo_datagrouptenant` (`data_id`,`group_id`,`tenant_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

-- 配置历史表
CREATE TABLE `his_config_info` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `nid` bigint(20) NOT NULL AUTO_INCREMENT,
  `data_id` varchar(255) NOT NULL,
  `group_id` varchar(128) NOT NULL,
  `app_name` varchar(128) DEFAULT NULL,
  `content` longtext NOT NULL,
  `md5` varchar(32) DEFAULT NULL,
  `gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  `src_user` varchar(128) DEFAULT NULL,
  `src_ip` varchar(50) DEFAULT NULL,
  `op_type` char(10) DEFAULT NULL,
  `tenant_id` varchar(128) DEFAULT '' COMMENT '租户字段',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_configinfo_datagrouptenant` (`data_id`,`group_id`,`tenant_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;  `c_desc` varchar(256) DEFAULT NULL,`
`#-- Nacos 配置表
CREATE TABLE `config_info` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `data_id` varchar(255) NOT NULL COMMENT '配置ID',
  `group_id` varchar(128) DEFAULT NULL COMMENT '分组ID',
  `content` longtext NOT NULL COMMENT '配置内容',
  `md5` varchar(32) DEFAULT NULL COMMENT 'MD5值',
  `gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  `src_user` varchar(128) DEFAULT NULL,
  `src_ip` varchar(50) DEFAULT NULL,
  `app_name` varchar(128) DEFAULT NULL,
  `tenant_id` varchar(128) DEFAULT '' COMMENT '租户字段(对应命名空间ID)',
  `c_desc` varchar(256) DEFAULT NULL,
  `c_use` varchar(64) DEFAULT NULL,
  `effect` varchar(64) DEFAULT NULL,
  `type` varchar(64) DEFAULT NULL,
  `c_schema` text,
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_configinfo_datagrouptenant` (`data_id`,`group_id`,`tenant_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

-- 配置历史表
CREATE TABLE `his_config_info` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `nid` bigint(20) NOT NULL AUTO_INCREMENT,
  `data_id` varchar(255) NOT NULL,
  `group_id` varchar(128) NOT NULL,
  `app_name` varchar(128) DEFAULT NULL,
  `content` longtext NOT NULL,
  `md5` varchar(32) DEFAULT NULL,
  `gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  `src_user` varchar(128) DEFAULT NULL,
  `src_ip` varchar(50) DEFAULT NULL,
  `op_type` char(10) DEFAULT NULL,
  `tenant_id` varchar(128) DEFAULT '' COMMENT '租户字段',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_configinfo_datagrouptenant` (`data_id`,`group_id`,`tenant_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;  `c_use` varchar(64) DEFAULT NULL,`
`#-- Nacos 配置表
CREATE TABLE `config_info` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `data_id` varchar(255) NOT NULL COMMENT '配置ID',
  `group_id` varchar(128) DEFAULT NULL COMMENT '分组ID',
  `content` longtext NOT NULL COMMENT '配置内容',
  `md5` varchar(32) DEFAULT NULL COMMENT 'MD5值',
  `gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  `src_user` varchar(128) DEFAULT NULL,
  `src_ip` varchar(50) DEFAULT NULL,
  `app_name` varchar(128) DEFAULT NULL,
  `tenant_id` varchar(128) DEFAULT '' COMMENT '租户字段(对应命名空间ID)',
  `c_desc` varchar(256) DEFAULT NULL,
  `c_use` varchar(64) DEFAULT NULL,
  `effect` varchar(64) DEFAULT NULL,
  `type` varchar(64) DEFAULT NULL,
  `c_schema` text,
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_configinfo_datagrouptenant` (`data_id`,`group_id`,`tenant_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

-- 配置历史表
CREATE TABLE `his_config_info` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `nid` bigint(20) NOT NULL AUTO_INCREMENT,
  `data_id` varchar(255) NOT NULL,
  `group_id` varchar(128) NOT NULL,
  `app_name` varchar(128) DEFAULT NULL,
  `content` longtext NOT NULL,
  `md5` varchar(32) DEFAULT NULL,
  `gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  `src_user` varchar(128) DEFAULT NULL,
  `src_ip` varchar(50) DEFAULT NULL,
  `op_type` char(10) DEFAULT NULL,
  `tenant_id` varchar(128) DEFAULT '' COMMENT '租户字段',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_configinfo_datagrouptenant` (`data_id`,`group_id`,`tenant_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;  `effect` varchar(64) DEFAULT NULL,`
`#-- Nacos 配置表
CREATE TABLE `config_info` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `data_id` varchar(255) NOT NULL COMMENT '配置ID',
  `group_id` varchar(128) DEFAULT NULL COMMENT '分组ID',
  `content` longtext NOT NULL COMMENT '配置内容',
  `md5` varchar(32) DEFAULT NULL COMMENT 'MD5值',
  `gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  `src_user` varchar(128) DEFAULT NULL,
  `src_ip` varchar(50) DEFAULT NULL,
  `app_name` varchar(128) DEFAULT NULL,
  `tenant_id` varchar(128) DEFAULT '' COMMENT '租户字段(对应命名空间ID)',
  `c_desc` varchar(256) DEFAULT NULL,
  `c_use` varchar(64) DEFAULT NULL,
  `effect` varchar(64) DEFAULT NULL,
  `type` varchar(64) DEFAULT NULL,
  `c_schema` text,
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_configinfo_datagrouptenant` (`data_id`,`group_id`,`tenant_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

-- 配置历史表
CREATE TABLE `his_config_info` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `nid` bigint(20) NOT NULL AUTO_INCREMENT,
  `data_id` varchar(255) NOT NULL,
  `group_id` varchar(128) NOT NULL,
  `app_name` varchar(128) DEFAULT NULL,
  `content` longtext NOT NULL,
  `md5` varchar(32) DEFAULT NULL,
  `gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  `src_user` varchar(128) DEFAULT NULL,
  `src_ip` varchar(50) DEFAULT NULL,
  `op_type` char(10) DEFAULT NULL,
  `tenant_id` varchar(128) DEFAULT '' COMMENT '租户字段',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_configinfo_datagrouptenant` (`data_id`,`group_id`,`tenant_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;  `type` varchar(64) DEFAULT NULL,`
`#-- Nacos 配置表
CREATE TABLE `config_info` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `data_id` varchar(255) NOT NULL COMMENT '配置ID',
  `group_id` varchar(128) DEFAULT NULL COMMENT '分组ID',
  `content` longtext NOT NULL COMMENT '配置内容',
  `md5` varchar(32) DEFAULT NULL COMMENT 'MD5值',
  `gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  `src_user` varchar(128) DEFAULT NULL,
  `src_ip` varchar(50) DEFAULT NULL,
  `app_name` varchar(128) DEFAULT NULL,
  `tenant_id` varchar(128) DEFAULT '' COMMENT '租户字段(对应命名空间ID)',
  `c_desc` varchar(256) DEFAULT NULL,
  `c_use` varchar(64) DEFAULT NULL,
  `effect` varchar(64) DEFAULT NULL,
  `type` varchar(64) DEFAULT NULL,
  `c_schema` text,
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_configinfo_datagrouptenant` (`data_id`,`group_id`,`tenant_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

-- 配置历史表
CREATE TABLE `his_config_info` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `nid` bigint(20) NOT NULL AUTO_INCREMENT,
  `data_id` varchar(255) NOT NULL,
  `group_id` varchar(128) NOT NULL,
  `app_name` varchar(128) DEFAULT NULL,
  `content` longtext NOT NULL,
  `md5` varchar(32) DEFAULT NULL,
  `gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  `src_user` varchar(128) DEFAULT NULL,
  `src_ip` varchar(50) DEFAULT NULL,
  `op_type` char(10) DEFAULT NULL,
  `tenant_id` varchar(128) DEFAULT '' COMMENT '租户字段',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_configinfo_datagrouptenant` (`data_id`,`group_id`,`tenant_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;  `c_schema` text,`
`#-- Nacos 配置表
CREATE TABLE `config_info` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `data_id` varchar(255) NOT NULL COMMENT '配置ID',
  `group_id` varchar(128) DEFAULT NULL COMMENT '分组ID',
  `content` longtext NOT NULL COMMENT '配置内容',
  `md5` varchar(32) DEFAULT NULL COMMENT 'MD5值',
  `gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  `src_user` varchar(128) DEFAULT NULL,
  `src_ip` varchar(50) DEFAULT NULL,
  `app_name` varchar(128) DEFAULT NULL,
  `tenant_id` varchar(128) DEFAULT '' COMMENT '租户字段(对应命名空间ID)',
  `c_desc` varchar(256) DEFAULT NULL,
  `c_use` varchar(64) DEFAULT NULL,
  `effect` varchar(64) DEFAULT NULL,
  `type` varchar(64) DEFAULT NULL,
  `c_schema` text,
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_configinfo_datagrouptenant` (`data_id`,`group_id`,`tenant_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

-- 配置历史表
CREATE TABLE `his_config_info` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `nid` bigint(20) NOT NULL AUTO_INCREMENT,
  `data_id` varchar(255) NOT NULL,
  `group_id` varchar(128) NOT NULL,
  `app_name` varchar(128) DEFAULT NULL,
  `content` longtext NOT NULL,
  `md5` varchar(32) DEFAULT NULL,
  `gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  `src_user` varchar(128) DEFAULT NULL,
  `src_ip` varchar(50) DEFAULT NULL,
  `op_type` char(10) DEFAULT NULL,
  `tenant_id` varchar(128) DEFAULT '' COMMENT '租户字段',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_configinfo_datagrouptenant` (`data_id`,`group_id`,`tenant_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;  PRIMARY KEY (`id`),`
`#-- Nacos 配置表
CREATE TABLE `config_info` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `data_id` varchar(255) NOT NULL COMMENT '配置ID',
  `group_id` varchar(128) DEFAULT NULL COMMENT '分组ID',
  `content` longtext NOT NULL COMMENT '配置内容',
  `md5` varchar(32) DEFAULT NULL COMMENT 'MD5值',
  `gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  `src_user` varchar(128) DEFAULT NULL,
  `src_ip` varchar(50) DEFAULT NULL,
  `app_name` varchar(128) DEFAULT NULL,
  `tenant_id` varchar(128) DEFAULT '' COMMENT '租户字段(对应命名空间ID)',
  `c_desc` varchar(256) DEFAULT NULL,
  `c_use` varchar(64) DEFAULT NULL,
  `effect` varchar(64) DEFAULT NULL,
  `type` varchar(64) DEFAULT NULL,
  `c_schema` text,
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_configinfo_datagrouptenant` (`data_id`,`group_id`,`tenant_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

-- 配置历史表
CREATE TABLE `his_config_info` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `nid` bigint(20) NOT NULL AUTO_INCREMENT,
  `data_id` varchar(255) NOT NULL,
  `group_id` varchar(128) NOT NULL,
  `app_name` varchar(128) DEFAULT NULL,
  `content` longtext NOT NULL,
  `md5` varchar(32) DEFAULT NULL,
  `gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  `src_user` varchar(128) DEFAULT NULL,
  `src_ip` varchar(50) DEFAULT NULL,
  `op_type` char(10) DEFAULT NULL,
  `tenant_id` varchar(128) DEFAULT '' COMMENT '租户字段',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_configinfo_datagrouptenant` (`data_id`,`group_id`,`tenant_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;  UNIQUE KEY `uk_configinfo_datagrouptenant` (`data_id`,`group_id`,`tenant_id`)`
`#-- Nacos 配置表
CREATE TABLE `config_info` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `data_id` varchar(255) NOT NULL COMMENT '配置ID',
  `group_id` varchar(128) DEFAULT NULL COMMENT '分组ID',
  `content` longtext NOT NULL COMMENT '配置内容',
  `md5` varchar(32) DEFAULT NULL COMMENT 'MD5值',
  `gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  `src_user` varchar(128) DEFAULT NULL,
  `src_ip` varchar(50) DEFAULT NULL,
  `app_name` varchar(128) DEFAULT NULL,
  `tenant_id` varchar(128) DEFAULT '' COMMENT '租户字段(对应命名空间ID)',
  `c_desc` varchar(256) DEFAULT NULL,
  `c_use` varchar(64) DEFAULT NULL,
  `effect` varchar(64) DEFAULT NULL,
  `type` varchar(64) DEFAULT NULL,
  `c_schema` text,
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_configinfo_datagrouptenant` (`data_id`,`group_id`,`tenant_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

-- 配置历史表
CREATE TABLE `his_config_info` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `nid` bigint(20) NOT NULL AUTO_INCREMENT,
  `data_id` varchar(255) NOT NULL,
  `group_id` varchar(128) NOT NULL,
  `app_name` varchar(128) DEFAULT NULL,
  `content` longtext NOT NULL,
  `md5` varchar(32) DEFAULT NULL,
  `gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  `src_user` varchar(128) DEFAULT NULL,
  `src_ip` varchar(50) DEFAULT NULL,
  `op_type` char(10) DEFAULT NULL,
  `tenant_id` varchar(128) DEFAULT '' COMMENT '租户字段',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_configinfo_datagrouptenant` (`data_id`,`group_id`,`tenant_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;`
`#-- Nacos 配置表
CREATE TABLE `config_info` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `data_id` varchar(255) NOT NULL COMMENT '配置ID',
  `group_id` varchar(128) DEFAULT NULL COMMENT '分组ID',
  `content` longtext NOT NULL COMMENT '配置内容',
  `md5` varchar(32) DEFAULT NULL COMMENT 'MD5值',
  `gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  `src_user` varchar(128) DEFAULT NULL,
  `src_ip` varchar(50) DEFAULT NULL,
  `app_name` varchar(128) DEFAULT NULL,
  `tenant_id` varchar(128) DEFAULT '' COMMENT '租户字段(对应命名空间ID)',
  `c_desc` varchar(256) DEFAULT NULL,
  `c_use` varchar(64) DEFAULT NULL,
  `effect` varchar(64) DEFAULT NULL,
  `type` varchar(64) DEFAULT NULL,
  `c_schema` text,
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_configinfo_datagrouptenant` (`data_id`,`group_id`,`tenant_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

-- 配置历史表
CREATE TABLE `his_config_info` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `nid` bigint(20) NOT NULL AUTO_INCREMENT,
  `data_id` varchar(255) NOT NULL,
  `group_id` varchar(128) NOT NULL,
  `app_name` varchar(128) DEFAULT NULL,
  `content` longtext NOT NULL,
  `md5` varchar(32) DEFAULT NULL,
  `gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  `src_user` varchar(128) DEFAULT NULL,
  `src_ip` varchar(50) DEFAULT NULL,
  `op_type` char(10) DEFAULT NULL,
  `tenant_id` varchar(128) DEFAULT '' COMMENT '租户字段',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_configinfo_datagrouptenant` (`data_id`,`group_id`,`tenant_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;`
`#-- Nacos 配置表
CREATE TABLE `config_info` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `data_id` varchar(255) NOT NULL COMMENT '配置ID',
  `group_id` varchar(128) DEFAULT NULL COMMENT '分组ID',
  `content` longtext NOT NULL COMMENT '配置内容',
  `md5` varchar(32) DEFAULT NULL COMMENT 'MD5值',
  `gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  `src_user` varchar(128) DEFAULT NULL,
  `src_ip` varchar(50) DEFAULT NULL,
  `app_name` varchar(128) DEFAULT NULL,
  `tenant_id` varchar(128) DEFAULT '' COMMENT '租户字段(对应命名空间ID)',
  `c_desc` varchar(256) DEFAULT NULL,
  `c_use` varchar(64) DEFAULT NULL,
  `effect` varchar(64) DEFAULT NULL,
  `type` varchar(64) DEFAULT NULL,
  `c_schema` text,
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_configinfo_datagrouptenant` (`data_id`,`group_id`,`tenant_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

-- 配置历史表
CREATE TABLE `his_config_info` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `nid` bigint(20) NOT NULL AUTO_INCREMENT,
  `data_id` varchar(255) NOT NULL,
  `group_id` varchar(128) NOT NULL,
  `app_name` varchar(128) DEFAULT NULL,
  `content` longtext NOT NULL,
  `md5` varchar(32) DEFAULT NULL,
  `gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  `src_user` varchar(128) DEFAULT NULL,
  `src_ip` varchar(50) DEFAULT NULL,
  `op_type` char(10) DEFAULT NULL,
  `tenant_id` varchar(128) DEFAULT '' COMMENT '租户字段',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_configinfo_datagrouptenant` (`data_id`,`group_id`,`tenant_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;-- 配置历史表`
`#-- Nacos 配置表
CREATE TABLE `config_info` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `data_id` varchar(255) NOT NULL COMMENT '配置ID',
  `group_id` varchar(128) DEFAULT NULL COMMENT '分组ID',
  `content` longtext NOT NULL COMMENT '配置内容',
  `md5` varchar(32) DEFAULT NULL COMMENT 'MD5值',
  `gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  `src_user` varchar(128) DEFAULT NULL,
  `src_ip` varchar(50) DEFAULT NULL,
  `app_name` varchar(128) DEFAULT NULL,
  `tenant_id` varchar(128) DEFAULT '' COMMENT '租户字段(对应命名空间ID)',
  `c_desc` varchar(256) DEFAULT NULL,
  `c_use` varchar(64) DEFAULT NULL,
  `effect` varchar(64) DEFAULT NULL,
  `type` varchar(64) DEFAULT NULL,
  `c_schema` text,
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_configinfo_datagrouptenant` (`data_id`,`group_id`,`tenant_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

-- 配置历史表
CREATE TABLE `his_config_info` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `nid` bigint(20) NOT NULL AUTO_INCREMENT,
  `data_id` varchar(255) NOT NULL,
  `group_id` varchar(128) NOT NULL,
  `app_name` varchar(128) DEFAULT NULL,
  `content` longtext NOT NULL,
  `md5` varchar(32) DEFAULT NULL,
  `gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  `src_user` varchar(128) DEFAULT NULL,
  `src_ip` varchar(50) DEFAULT NULL,
  `op_type` char(10) DEFAULT NULL,
  `tenant_id` varchar(128) DEFAULT '' COMMENT '租户字段',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_configinfo_datagrouptenant` (`data_id`,`group_id`,`tenant_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;CREATE TABLE `his_config_info` (`
`#-- Nacos 配置表
CREATE TABLE `config_info` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `data_id` varchar(255) NOT NULL COMMENT '配置ID',
  `group_id` varchar(128) DEFAULT NULL COMMENT '分组ID',
  `content` longtext NOT NULL COMMENT '配置内容',
  `md5` varchar(32) DEFAULT NULL COMMENT 'MD5值',
  `gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  `src_user` varchar(128) DEFAULT NULL,
  `src_ip` varchar(50) DEFAULT NULL,
  `app_name` varchar(128) DEFAULT NULL,
  `tenant_id` varchar(128) DEFAULT '' COMMENT '租户字段(对应命名空间ID)',
  `c_desc` varchar(256) DEFAULT NULL,
  `c_use` varchar(64) DEFAULT NULL,
  `effect` varchar(64) DEFAULT NULL,
  `type` varchar(64) DEFAULT NULL,
  `c_schema` text,
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_configinfo_datagrouptenant` (`data_id`,`group_id`,`tenant_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

-- 配置历史表
CREATE TABLE `his_config_info` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `nid` bigint(20) NOT NULL AUTO_INCREMENT,
  `data_id` varchar(255) NOT NULL,
  `group_id` varchar(128) NOT NULL,
  `app_name` varchar(128) DEFAULT NULL,
  `content` longtext NOT NULL,
  `md5` varchar(32) DEFAULT NULL,
  `gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  `src_user` varchar(128) DEFAULT NULL,
  `src_ip` varchar(50) DEFAULT NULL,
  `op_type` char(10) DEFAULT NULL,
  `tenant_id` varchar(128) DEFAULT '' COMMENT '租户字段',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_configinfo_datagrouptenant` (`data_id`,`group_id`,`tenant_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;  `id` bigint(20) NOT NULL AUTO_INCREMENT,`
`#-- Nacos 配置表
CREATE TABLE `config_info` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `data_id` varchar(255) NOT NULL COMMENT '配置ID',
  `group_id` varchar(128) DEFAULT NULL COMMENT '分组ID',
  `content` longtext NOT NULL COMMENT '配置内容',
  `md5` varchar(32) DEFAULT NULL COMMENT 'MD5值',
  `gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  `src_user` varchar(128) DEFAULT NULL,
  `src_ip` varchar(50) DEFAULT NULL,
  `app_name` varchar(128) DEFAULT NULL,
  `tenant_id` varchar(128) DEFAULT '' COMMENT '租户字段(对应命名空间ID)',
  `c_desc` varchar(256) DEFAULT NULL,
  `c_use` varchar(64) DEFAULT NULL,
  `effect` varchar(64) DEFAULT NULL,
  `type` varchar(64) DEFAULT NULL,
  `c_schema` text,
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_configinfo_datagrouptenant` (`data_id`,`group_id`,`tenant_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

-- 配置历史表
CREATE TABLE `his_config_info` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `nid` bigint(20) NOT NULL AUTO_INCREMENT,
  `data_id` varchar(255) NOT NULL,
  `group_id` varchar(128) NOT NULL,
  `app_name` varchar(128) DEFAULT NULL,
  `content` longtext NOT NULL,
  `md5` varchar(32) DEFAULT NULL,
  `gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  `src_user` varchar(128) DEFAULT NULL,
  `src_ip` varchar(50) DEFAULT NULL,
  `op_type` char(10) DEFAULT NULL,
  `tenant_id` varchar(128) DEFAULT '' COMMENT '租户字段',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_configinfo_datagrouptenant` (`data_id`,`group_id`,`tenant_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;  `nid` bigint(20) NOT NULL AUTO_INCREMENT,`
`#-- Nacos 配置表
CREATE TABLE `config_info` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `data_id` varchar(255) NOT NULL COMMENT '配置ID',
  `group_id` varchar(128) DEFAULT NULL COMMENT '分组ID',
  `content` longtext NOT NULL COMMENT '配置内容',
  `md5` varchar(32) DEFAULT NULL COMMENT 'MD5值',
  `gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  `src_user` varchar(128) DEFAULT NULL,
  `src_ip` varchar(50) DEFAULT NULL,
  `app_name` varchar(128) DEFAULT NULL,
  `tenant_id` varchar(128) DEFAULT '' COMMENT '租户字段(对应命名空间ID)',
  `c_desc` varchar(256) DEFAULT NULL,
  `c_use` varchar(64) DEFAULT NULL,
  `effect` varchar(64) DEFAULT NULL,
  `type` varchar(64) DEFAULT NULL,
  `c_schema` text,
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_configinfo_datagrouptenant` (`data_id`,`group_id`,`tenant_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

-- 配置历史表
CREATE TABLE `his_config_info` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `nid` bigint(20) NOT NULL AUTO_INCREMENT,
  `data_id` varchar(255) NOT NULL,
  `group_id` varchar(128) NOT NULL,
  `app_name` varchar(128) DEFAULT NULL,
  `content` longtext NOT NULL,
  `md5` varchar(32) DEFAULT NULL,
  `gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  `src_user` varchar(128) DEFAULT NULL,
  `src_ip` varchar(50) DEFAULT NULL,
  `op_type` char(10) DEFAULT NULL,
  `tenant_id` varchar(128) DEFAULT '' COMMENT '租户字段',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_configinfo_datagrouptenant` (`data_id`,`group_id`,`tenant_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;  `data_id` varchar(255) NOT NULL,`
`#-- Nacos 配置表
CREATE TABLE `config_info` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `data_id` varchar(255) NOT NULL COMMENT '配置ID',
  `group_id` varchar(128) DEFAULT NULL COMMENT '分组ID',
  `content` longtext NOT NULL COMMENT '配置内容',
  `md5` varchar(32) DEFAULT NULL COMMENT 'MD5值',
  `gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  `src_user` varchar(128) DEFAULT NULL,
  `src_ip` varchar(50) DEFAULT NULL,
  `app_name` varchar(128) DEFAULT NULL,
  `tenant_id` varchar(128) DEFAULT '' COMMENT '租户字段(对应命名空间ID)',
  `c_desc` varchar(256) DEFAULT NULL,
  `c_use` varchar(64) DEFAULT NULL,
  `effect` varchar(64) DEFAULT NULL,
  `type` varchar(64) DEFAULT NULL,
  `c_schema` text,
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_configinfo_datagrouptenant` (`data_id`,`group_id`,`tenant_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

-- 配置历史表
CREATE TABLE `his_config_info` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `nid` bigint(20) NOT NULL AUTO_INCREMENT,
  `data_id` varchar(255) NOT NULL,
  `group_id` varchar(128) NOT NULL,
  `app_name` varchar(128) DEFAULT NULL,
  `content` longtext NOT NULL,
  `md5` varchar(32) DEFAULT NULL,
  `gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  `src_user` varchar(128) DEFAULT NULL,
  `src_ip` varchar(50) DEFAULT NULL,
  `op_type` char(10) DEFAULT NULL,
  `tenant_id` varchar(128) DEFAULT '' COMMENT '租户字段',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_configinfo_datagrouptenant` (`data_id`,`group_id`,`tenant_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;  `group_id` varchar(128) NOT NULL,`
`#-- Nacos 配置表
CREATE TABLE `config_info` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `data_id` varchar(255) NOT NULL COMMENT '配置ID',
  `group_id` varchar(128) DEFAULT NULL COMMENT '分组ID',
  `content` longtext NOT NULL COMMENT '配置内容',
  `md5` varchar(32) DEFAULT NULL COMMENT 'MD5值',
  `gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  `src_user` varchar(128) DEFAULT NULL,
  `src_ip` varchar(50) DEFAULT NULL,
  `app_name` varchar(128) DEFAULT NULL,
  `tenant_id` varchar(128) DEFAULT '' COMMENT '租户字段(对应命名空间ID)',
  `c_desc` varchar(256) DEFAULT NULL,
  `c_use` varchar(64) DEFAULT NULL,
  `effect` varchar(64) DEFAULT NULL,
  `type` varchar(64) DEFAULT NULL,
  `c_schema` text,
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_configinfo_datagrouptenant` (`data_id`,`group_id`,`tenant_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

-- 配置历史表
CREATE TABLE `his_config_info` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `nid` bigint(20) NOT NULL AUTO_INCREMENT,
  `data_id` varchar(255) NOT NULL,
  `group_id` varchar(128) NOT NULL,
  `app_name` varchar(128) DEFAULT NULL,
  `content` longtext NOT NULL,
  `md5` varchar(32) DEFAULT NULL,
  `gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  `src_user` varchar(128) DEFAULT NULL,
  `src_ip` varchar(50) DEFAULT NULL,
  `op_type` char(10) DEFAULT NULL,
  `tenant_id` varchar(128) DEFAULT '' COMMENT '租户字段',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_configinfo_datagrouptenant` (`data_id`,`group_id`,`tenant_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;  `app_name` varchar(128) DEFAULT NULL,`
`#-- Nacos 配置表
CREATE TABLE `config_info` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `data_id` varchar(255) NOT NULL COMMENT '配置ID',
  `group_id` varchar(128) DEFAULT NULL COMMENT '分组ID',
  `content` longtext NOT NULL COMMENT '配置内容',
  `md5` varchar(32) DEFAULT NULL COMMENT 'MD5值',
  `gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  `src_user` varchar(128) DEFAULT NULL,
  `src_ip` varchar(50) DEFAULT NULL,
  `app_name` varchar(128) DEFAULT NULL,
  `tenant_id` varchar(128) DEFAULT '' COMMENT '租户字段(对应命名空间ID)',
  `c_desc` varchar(256) DEFAULT NULL,
  `c_use` varchar(64) DEFAULT NULL,
  `effect` varchar(64) DEFAULT NULL,
  `type` varchar(64) DEFAULT NULL,
  `c_schema` text,
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_configinfo_datagrouptenant` (`data_id`,`group_id`,`tenant_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

-- 配置历史表
CREATE TABLE `his_config_info` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `nid` bigint(20) NOT NULL AUTO_INCREMENT,
  `data_id` varchar(255) NOT NULL,
  `group_id` varchar(128) NOT NULL,
  `app_name` varchar(128) DEFAULT NULL,
  `content` longtext NOT NULL,
  `md5` varchar(32) DEFAULT NULL,
  `gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  `src_user` varchar(128) DEFAULT NULL,
  `src_ip` varchar(50) DEFAULT NULL,
  `op_type` char(10) DEFAULT NULL,
  `tenant_id` varchar(128) DEFAULT '' COMMENT '租户字段',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_configinfo_datagrouptenant` (`data_id`,`group_id`,`tenant_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;  `content` longtext NOT NULL,`
`#-- Nacos 配置表
CREATE TABLE `config_info` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `data_id` varchar(255) NOT NULL COMMENT '配置ID',
  `group_id` varchar(128) DEFAULT NULL COMMENT '分组ID',
  `content` longtext NOT NULL COMMENT '配置内容',
  `md5` varchar(32) DEFAULT NULL COMMENT 'MD5值',
  `gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  `src_user` varchar(128) DEFAULT NULL,
  `src_ip` varchar(50) DEFAULT NULL,
  `app_name` varchar(128) DEFAULT NULL,
  `tenant_id` varchar(128) DEFAULT '' COMMENT '租户字段(对应命名空间ID)',
  `c_desc` varchar(256) DEFAULT NULL,
  `c_use` varchar(64) DEFAULT NULL,
  `effect` varchar(64) DEFAULT NULL,
  `type` varchar(64) DEFAULT NULL,
  `c_schema` text,
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_configinfo_datagrouptenant` (`data_id`,`group_id`,`tenant_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

-- 配置历史表
CREATE TABLE `his_config_info` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `nid` bigint(20) NOT NULL AUTO_INCREMENT,
  `data_id` varchar(255) NOT NULL,
  `group_id` varchar(128) NOT NULL,
  `app_name` varchar(128) DEFAULT NULL,
  `content` longtext NOT NULL,
  `md5` varchar(32) DEFAULT NULL,
  `gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  `src_user` varchar(128) DEFAULT NULL,
  `src_ip` varchar(50) DEFAULT NULL,
  `op_type` char(10) DEFAULT NULL,
  `tenant_id` varchar(128) DEFAULT '' COMMENT '租户字段',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_configinfo_datagrouptenant` (`data_id`,`group_id`,`tenant_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;  `md5` varchar(32) DEFAULT NULL,`
`#-- Nacos 配置表
CREATE TABLE `config_info` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `data_id` varchar(255) NOT NULL COMMENT '配置ID',
  `group_id` varchar(128) DEFAULT NULL COMMENT '分组ID',
  `content` longtext NOT NULL COMMENT '配置内容',
  `md5` varchar(32) DEFAULT NULL COMMENT 'MD5值',
  `gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  `src_user` varchar(128) DEFAULT NULL,
  `src_ip` varchar(50) DEFAULT NULL,
  `app_name` varchar(128) DEFAULT NULL,
  `tenant_id` varchar(128) DEFAULT '' COMMENT '租户字段(对应命名空间ID)',
  `c_desc` varchar(256) DEFAULT NULL,
  `c_use` varchar(64) DEFAULT NULL,
  `effect` varchar(64) DEFAULT NULL,
  `type` varchar(64) DEFAULT NULL,
  `c_schema` text,
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_configinfo_datagrouptenant` (`data_id`,`group_id`,`tenant_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

-- 配置历史表
CREATE TABLE `his_config_info` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `nid` bigint(20) NOT NULL AUTO_INCREMENT,
  `data_id` varchar(255) NOT NULL,
  `group_id` varchar(128) NOT NULL,
  `app_name` varchar(128) DEFAULT NULL,
  `content` longtext NOT NULL,
  `md5` varchar(32) DEFAULT NULL,
  `gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  `src_user` varchar(128) DEFAULT NULL,
  `src_ip` varchar(50) DEFAULT NULL,
  `op_type` char(10) DEFAULT NULL,
  `tenant_id` varchar(128) DEFAULT '' COMMENT '租户字段',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_configinfo_datagrouptenant` (`data_id`,`group_id`,`tenant_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;  `gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,`
`#-- Nacos 配置表
CREATE TABLE `config_info` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `data_id` varchar(255) NOT NULL COMMENT '配置ID',
  `group_id` varchar(128) DEFAULT NULL COMMENT '分组ID',
  `content` longtext NOT NULL COMMENT '配置内容',
  `md5` varchar(32) DEFAULT NULL COMMENT 'MD5值',
  `gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  `src_user` varchar(128) DEFAULT NULL,
  `src_ip` varchar(50) DEFAULT NULL,
  `app_name` varchar(128) DEFAULT NULL,
  `tenant_id` varchar(128) DEFAULT '' COMMENT '租户字段(对应命名空间ID)',
  `c_desc` varchar(256) DEFAULT NULL,
  `c_use` varchar(64) DEFAULT NULL,
  `effect` varchar(64) DEFAULT NULL,
  `type` varchar(64) DEFAULT NULL,
  `c_schema` text,
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_configinfo_datagrouptenant` (`data_id`,`group_id`,`tenant_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

-- 配置历史表
CREATE TABLE `his_config_info` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `nid` bigint(20) NOT NULL AUTO_INCREMENT,
  `data_id` varchar(255) NOT NULL,
  `group_id` varchar(128) NOT NULL,
  `app_name` varchar(128) DEFAULT NULL,
  `content` longtext NOT NULL,
  `md5` varchar(32) DEFAULT NULL,
  `gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  `src_user` varchar(128) DEFAULT NULL,
  `src_ip` varchar(50) DEFAULT NULL,
  `op_type` char(10) DEFAULT NULL,
  `tenant_id` varchar(128) DEFAULT '' COMMENT '租户字段',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_configinfo_datagrouptenant` (`data_id`,`group_id`,`tenant_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;  `gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,`
`#-- Nacos 配置表
CREATE TABLE `config_info` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `data_id` varchar(255) NOT NULL COMMENT '配置ID',
  `group_id` varchar(128) DEFAULT NULL COMMENT '分组ID',
  `content` longtext NOT NULL COMMENT '配置内容',
  `md5` varchar(32) DEFAULT NULL COMMENT 'MD5值',
  `gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  `src_user` varchar(128) DEFAULT NULL,
  `src_ip` varchar(50) DEFAULT NULL,
  `app_name` varchar(128) DEFAULT NULL,
  `tenant_id` varchar(128) DEFAULT '' COMMENT '租户字段(对应命名空间ID)',
  `c_desc` varchar(256) DEFAULT NULL,
  `c_use` varchar(64) DEFAULT NULL,
  `effect` varchar(64) DEFAULT NULL,
  `type` varchar(64) DEFAULT NULL,
  `c_schema` text,
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_configinfo_datagrouptenant` (`data_id`,`group_id`,`tenant_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

-- 配置历史表
CREATE TABLE `his_config_info` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `nid` bigint(20) NOT NULL AUTO_INCREMENT,
  `data_id` varchar(255) NOT NULL,
  `group_id` varchar(128) NOT NULL,
  `app_name` varchar(128) DEFAULT NULL,
  `content` longtext NOT NULL,
  `md5` varchar(32) DEFAULT NULL,
  `gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  `src_user` varchar(128) DEFAULT NULL,
  `src_ip` varchar(50) DEFAULT NULL,
  `op_type` char(10) DEFAULT NULL,
  `tenant_id` varchar(128) DEFAULT '' COMMENT '租户字段',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_configinfo_datagrouptenant` (`data_id`,`group_id`,`tenant_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;  `src_user` varchar(128) DEFAULT NULL,`
`#-- Nacos 配置表
CREATE TABLE `config_info` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `data_id` varchar(255) NOT NULL COMMENT '配置ID',
  `group_id` varchar(128) DEFAULT NULL COMMENT '分组ID',
  `content` longtext NOT NULL COMMENT '配置内容',
  `md5` varchar(32) DEFAULT NULL COMMENT 'MD5值',
  `gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  `src_user` varchar(128) DEFAULT NULL,
  `src_ip` varchar(50) DEFAULT NULL,
  `app_name` varchar(128) DEFAULT NULL,
  `tenant_id` varchar(128) DEFAULT '' COMMENT '租户字段(对应命名空间ID)',
  `c_desc` varchar(256) DEFAULT NULL,
  `c_use` varchar(64) DEFAULT NULL,
  `effect` varchar(64) DEFAULT NULL,
  `type` varchar(64) DEFAULT NULL,
  `c_schema` text,
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_configinfo_datagrouptenant` (`data_id`,`group_id`,`tenant_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

-- 配置历史表
CREATE TABLE `his_config_info` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `nid` bigint(20) NOT NULL AUTO_INCREMENT,
  `data_id` varchar(255) NOT NULL,
  `group_id` varchar(128) NOT NULL,
  `app_name` varchar(128) DEFAULT NULL,
  `content` longtext NOT NULL,
  `md5` varchar(32) DEFAULT NULL,
  `gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  `src_user` varchar(128) DEFAULT NULL,
  `src_ip` varchar(50) DEFAULT NULL,
  `op_type` char(10) DEFAULT NULL,
  `tenant_id` varchar(128) DEFAULT '' COMMENT '租户字段',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_configinfo_datagrouptenant` (`data_id`,`group_id`,`tenant_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;  `src_ip` varchar(50) DEFAULT NULL,`
`#-- Nacos 配置表
CREATE TABLE `config_info` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `data_id` varchar(255) NOT NULL COMMENT '配置ID',
  `group_id` varchar(128) DEFAULT NULL COMMENT '分组ID',
  `content` longtext NOT NULL COMMENT '配置内容',
  `md5` varchar(32) DEFAULT NULL COMMENT 'MD5值',
  `gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  `src_user` varchar(128) DEFAULT NULL,
  `src_ip` varchar(50) DEFAULT NULL,
  `app_name` varchar(128) DEFAULT NULL,
  `tenant_id` varchar(128) DEFAULT '' COMMENT '租户字段(对应命名空间ID)',
  `c_desc` varchar(256) DEFAULT NULL,
  `c_use` varchar(64) DEFAULT NULL,
  `effect` varchar(64) DEFAULT NULL,
  `type` varchar(64) DEFAULT NULL,
  `c_schema` text,
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_configinfo_datagrouptenant` (`data_id`,`group_id`,`tenant_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

-- 配置历史表
CREATE TABLE `his_config_info` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `nid` bigint(20) NOT NULL AUTO_INCREMENT,
  `data_id` varchar(255) NOT NULL,
  `group_id` varchar(128) NOT NULL,
  `app_name` varchar(128) DEFAULT NULL,
  `content` longtext NOT NULL,
  `md5` varchar(32) DEFAULT NULL,
  `gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  `src_user` varchar(128) DEFAULT NULL,
  `src_ip` varchar(50) DEFAULT NULL,
  `op_type` char(10) DEFAULT NULL,
  `tenant_id` varchar(128) DEFAULT '' COMMENT '租户字段',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_configinfo_datagrouptenant` (`data_id`,`group_id`,`tenant_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;  `op_type` char(10) DEFAULT NULL,`
`#-- Nacos 配置表
CREATE TABLE `config_info` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `data_id` varchar(255) NOT NULL COMMENT '配置ID',
  `group_id` varchar(128) DEFAULT NULL COMMENT '分组ID',
  `content` longtext NOT NULL COMMENT '配置内容',
  `md5` varchar(32) DEFAULT NULL COMMENT 'MD5值',
  `gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  `src_user` varchar(128) DEFAULT NULL,
  `src_ip` varchar(50) DEFAULT NULL,
  `app_name` varchar(128) DEFAULT NULL,
  `tenant_id` varchar(128) DEFAULT '' COMMENT '租户字段(对应命名空间ID)',
  `c_desc` varchar(256) DEFAULT NULL,
  `c_use` varchar(64) DEFAULT NULL,
  `effect` varchar(64) DEFAULT NULL,
  `type` varchar(64) DEFAULT NULL,
  `c_schema` text,
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_configinfo_datagrouptenant` (`data_id`,`group_id`,`tenant_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

-- 配置历史表
CREATE TABLE `his_config_info` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `nid` bigint(20) NOT NULL AUTO_INCREMENT,
  `data_id` varchar(255) NOT NULL,
  `group_id` varchar(128) NOT NULL,
  `app_name` varchar(128) DEFAULT NULL,
  `content` longtext NOT NULL,
  `md5` varchar(32) DEFAULT NULL,
  `gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  `src_user` varchar(128) DEFAULT NULL,
  `src_ip` varchar(50) DEFAULT NULL,
  `op_type` char(10) DEFAULT NULL,
  `tenant_id` varchar(128) DEFAULT '' COMMENT '租户字段',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_configinfo_datagrouptenant` (`data_id`,`group_id`,`tenant_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;  `tenant_id` varchar(128) DEFAULT '' COMMENT '租户字段',`
`#-- Nacos 配置表
CREATE TABLE `config_info` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `data_id` varchar(255) NOT NULL COMMENT '配置ID',
  `group_id` varchar(128) DEFAULT NULL COMMENT '分组ID',
  `content` longtext NOT NULL COMMENT '配置内容',
  `md5` varchar(32) DEFAULT NULL COMMENT 'MD5值',
  `gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  `src_user` varchar(128) DEFAULT NULL,
  `src_ip` varchar(50) DEFAULT NULL,
  `app_name` varchar(128) DEFAULT NULL,
  `tenant_id` varchar(128) DEFAULT '' COMMENT '租户字段(对应命名空间ID)',
  `c_desc` varchar(256) DEFAULT NULL,
  `c_use` varchar(64) DEFAULT NULL,
  `effect` varchar(64) DEFAULT NULL,
  `type` varchar(64) DEFAULT NULL,
  `c_schema` text,
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_configinfo_datagrouptenant` (`data_id`,`group_id`,`tenant_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

-- 配置历史表
CREATE TABLE `his_config_info` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `nid` bigint(20) NOT NULL AUTO_INCREMENT,
  `data_id` varchar(255) NOT NULL,
  `group_id` varchar(128) NOT NULL,
  `app_name` varchar(128) DEFAULT NULL,
  `content` longtext NOT NULL,
  `md5` varchar(32) DEFAULT NULL,
  `gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  `src_user` varchar(128) DEFAULT NULL,
  `src_ip` varchar(50) DEFAULT NULL,
  `op_type` char(10) DEFAULT NULL,
  `tenant_id` varchar(128) DEFAULT '' COMMENT '租户字段',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_configinfo_datagrouptenant` (`data_id`,`group_id`,`tenant_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;  PRIMARY KEY (`id`),`
`#-- Nacos 配置表
CREATE TABLE `config_info` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `data_id` varchar(255) NOT NULL COMMENT '配置ID',
  `group_id` varchar(128) DEFAULT NULL COMMENT '分组ID',
  `content` longtext NOT NULL COMMENT '配置内容',
  `md5` varchar(32) DEFAULT NULL COMMENT 'MD5值',
  `gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  `src_user` varchar(128) DEFAULT NULL,
  `src_ip` varchar(50) DEFAULT NULL,
  `app_name` varchar(128) DEFAULT NULL,
  `tenant_id` varchar(128) DEFAULT '' COMMENT '租户字段(对应命名空间ID)',
  `c_desc` varchar(256) DEFAULT NULL,
  `c_use` varchar(64) DEFAULT NULL,
  `effect` varchar(64) DEFAULT NULL,
  `type` varchar(64) DEFAULT NULL,
  `c_schema` text,
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_configinfo_datagrouptenant` (`data_id`,`group_id`,`tenant_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

-- 配置历史表
CREATE TABLE `his_config_info` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `nid` bigint(20) NOT NULL AUTO_INCREMENT,
  `data_id` varchar(255) NOT NULL,
  `group_id` varchar(128) NOT NULL,
  `app_name` varchar(128) DEFAULT NULL,
  `content` longtext NOT NULL,
  `md5` varchar(32) DEFAULT NULL,
  `gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  `src_user` varchar(128) DEFAULT NULL,
  `src_ip` varchar(50) DEFAULT NULL,
  `op_type` char(10) DEFAULT NULL,
  `tenant_id` varchar(128) DEFAULT '' COMMENT '租户字段',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_configinfo_datagrouptenant` (`data_id`,`group_id`,`tenant_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;  UNIQUE KEY `uk_configinfo_datagrouptenant` (`data_id`,`group_id`,`tenant_id`)`
`#-- Nacos 配置表
CREATE TABLE `config_info` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `data_id` varchar(255) NOT NULL COMMENT '配置ID',
  `group_id` varchar(128) DEFAULT NULL COMMENT '分组ID',
  `content` longtext NOT NULL COMMENT '配置内容',
  `md5` varchar(32) DEFAULT NULL COMMENT 'MD5值',
  `gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  `src_user` varchar(128) DEFAULT NULL,
  `src_ip` varchar(50) DEFAULT NULL,
  `app_name` varchar(128) DEFAULT NULL,
  `tenant_id` varchar(128) DEFAULT '' COMMENT '租户字段(对应命名空间ID)',
  `c_desc` varchar(256) DEFAULT NULL,
  `c_use` varchar(64) DEFAULT NULL,
  `effect` varchar(64) DEFAULT NULL,
  `type` varchar(64) DEFAULT NULL,
  `c_schema` text,
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_configinfo_datagrouptenant` (`data_id`,`group_id`,`tenant_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

-- 配置历史表
CREATE TABLE `his_config_info` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `nid` bigint(20) NOT NULL AUTO_INCREMENT,
  `data_id` varchar(255) NOT NULL,
  `group_id` varchar(128) NOT NULL,
  `app_name` varchar(128) DEFAULT NULL,
  `content` longtext NOT NULL,
  `md5` varchar(32) DEFAULT NULL,
  `gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  `src_user` varchar(128) DEFAULT NULL,
  `src_ip` varchar(50) DEFAULT NULL,
  `op_type` char(10) DEFAULT NULL,
  `tenant_id` varchar(128) DEFAULT '' COMMENT '租户字段',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_configinfo_datagrouptenant` (`data_id`,`group_id`,`tenant_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

六、实战:Spring Cloud Alibaba Nacos

6.1 服务提供者配置

复制代码
# application.yml
spring:
  application:
    name: user-service
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848
        namespace: public
        group: DEFAULT_GROUP
        register-enabled: true
        ephemeral: true  # 临时实例(AP 模式)
        heart-beat-interval: 5000  # 心跳间隔
        heart-beat-timeout: 15000  # 心跳超时
        ip-delete-timeout: 30000   # 删除超时
        metadata:
          version: 1.0.0
          region: beijing# application.yml
# application.yml
spring:
  application:
    name: user-service
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848
        namespace: public
        group: DEFAULT_GROUP
        register-enabled: true
        ephemeral: true  # 临时实例(AP 模式)
        heart-beat-interval: 5000  # 心跳间隔
        heart-beat-timeout: 15000  # 心跳超时
        ip-delete-timeout: 30000   # 删除超时
        metadata:
          version: 1.0.0
          region: beijingspring:
# application.yml
spring:
  application:
    name: user-service
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848
        namespace: public
        group: DEFAULT_GROUP
        register-enabled: true
        ephemeral: true  # 临时实例(AP 模式)
        heart-beat-interval: 5000  # 心跳间隔
        heart-beat-timeout: 15000  # 心跳超时
        ip-delete-timeout: 30000   # 删除超时
        metadata:
          version: 1.0.0
          region: beijing  application:
# application.yml
spring:
  application:
    name: user-service
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848
        namespace: public
        group: DEFAULT_GROUP
        register-enabled: true
        ephemeral: true  # 临时实例(AP 模式)
        heart-beat-interval: 5000  # 心跳间隔
        heart-beat-timeout: 15000  # 心跳超时
        ip-delete-timeout: 30000   # 删除超时
        metadata:
          version: 1.0.0
          region: beijing    name: user-service
# application.yml
spring:
  application:
    name: user-service
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848
        namespace: public
        group: DEFAULT_GROUP
        register-enabled: true
        ephemeral: true  # 临时实例(AP 模式)
        heart-beat-interval: 5000  # 心跳间隔
        heart-beat-timeout: 15000  # 心跳超时
        ip-delete-timeout: 30000   # 删除超时
        metadata:
          version: 1.0.0
          region: beijing  cloud:
# application.yml
spring:
  application:
    name: user-service
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848
        namespace: public
        group: DEFAULT_GROUP
        register-enabled: true
        ephemeral: true  # 临时实例(AP 模式)
        heart-beat-interval: 5000  # 心跳间隔
        heart-beat-timeout: 15000  # 心跳超时
        ip-delete-timeout: 30000   # 删除超时
        metadata:
          version: 1.0.0
          region: beijing    nacos:
# application.yml
spring:
  application:
    name: user-service
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848
        namespace: public
        group: DEFAULT_GROUP
        register-enabled: true
        ephemeral: true  # 临时实例(AP 模式)
        heart-beat-interval: 5000  # 心跳间隔
        heart-beat-timeout: 15000  # 心跳超时
        ip-delete-timeout: 30000   # 删除超时
        metadata:
          version: 1.0.0
          region: beijing      discovery:
# application.yml
spring:
  application:
    name: user-service
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848
        namespace: public
        group: DEFAULT_GROUP
        register-enabled: true
        ephemeral: true  # 临时实例(AP 模式)
        heart-beat-interval: 5000  # 心跳间隔
        heart-beat-timeout: 15000  # 心跳超时
        ip-delete-timeout: 30000   # 删除超时
        metadata:
          version: 1.0.0
          region: beijing        server-addr: 127.0.0.1:8848
# application.yml
spring:
  application:
    name: user-service
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848
        namespace: public
        group: DEFAULT_GROUP
        register-enabled: true
        ephemeral: true  # 临时实例(AP 模式)
        heart-beat-interval: 5000  # 心跳间隔
        heart-beat-timeout: 15000  # 心跳超时
        ip-delete-timeout: 30000   # 删除超时
        metadata:
          version: 1.0.0
          region: beijing        namespace: public
# application.yml
spring:
  application:
    name: user-service
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848
        namespace: public
        group: DEFAULT_GROUP
        register-enabled: true
        ephemeral: true  # 临时实例(AP 模式)
        heart-beat-interval: 5000  # 心跳间隔
        heart-beat-timeout: 15000  # 心跳超时
        ip-delete-timeout: 30000   # 删除超时
        metadata:
          version: 1.0.0
          region: beijing        group: DEFAULT_GROUP
# application.yml
spring:
  application:
    name: user-service
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848
        namespace: public
        group: DEFAULT_GROUP
        register-enabled: true
        ephemeral: true  # 临时实例(AP 模式)
        heart-beat-interval: 5000  # 心跳间隔
        heart-beat-timeout: 15000  # 心跳超时
        ip-delete-timeout: 30000   # 删除超时
        metadata:
          version: 1.0.0
          region: beijing        register-enabled: true
# application.yml
spring:
  application:
    name: user-service
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848
        namespace: public
        group: DEFAULT_GROUP
        register-enabled: true
        ephemeral: true  # 临时实例(AP 模式)
        heart-beat-interval: 5000  # 心跳间隔
        heart-beat-timeout: 15000  # 心跳超时
        ip-delete-timeout: 30000   # 删除超时
        metadata:
          version: 1.0.0
          region: beijing        ephemeral: true  # 临时实例(AP 模式)
# application.yml
spring:
  application:
    name: user-service
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848
        namespace: public
        group: DEFAULT_GROUP
        register-enabled: true
        ephemeral: true  # 临时实例(AP 模式)
        heart-beat-interval: 5000  # 心跳间隔
        heart-beat-timeout: 15000  # 心跳超时
        ip-delete-timeout: 30000   # 删除超时
        metadata:
          version: 1.0.0
          region: beijing        heart-beat-interval: 5000  # 心跳间隔
# application.yml
spring:
  application:
    name: user-service
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848
        namespace: public
        group: DEFAULT_GROUP
        register-enabled: true
        ephemeral: true  # 临时实例(AP 模式)
        heart-beat-interval: 5000  # 心跳间隔
        heart-beat-timeout: 15000  # 心跳超时
        ip-delete-timeout: 30000   # 删除超时
        metadata:
          version: 1.0.0
          region: beijing        heart-beat-timeout: 15000  # 心跳超时
# application.yml
spring:
  application:
    name: user-service
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848
        namespace: public
        group: DEFAULT_GROUP
        register-enabled: true
        ephemeral: true  # 临时实例(AP 模式)
        heart-beat-interval: 5000  # 心跳间隔
        heart-beat-timeout: 15000  # 心跳超时
        ip-delete-timeout: 30000   # 删除超时
        metadata:
          version: 1.0.0
          region: beijing        ip-delete-timeout: 30000   # 删除超时
# application.yml
spring:
  application:
    name: user-service
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848
        namespace: public
        group: DEFAULT_GROUP
        register-enabled: true
        ephemeral: true  # 临时实例(AP 模式)
        heart-beat-interval: 5000  # 心跳间隔
        heart-beat-timeout: 15000  # 心跳超时
        ip-delete-timeout: 30000   # 删除超时
        metadata:
          version: 1.0.0
          region: beijing        metadata:
# application.yml
spring:
  application:
    name: user-service
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848
        namespace: public
        group: DEFAULT_GROUP
        register-enabled: true
        ephemeral: true  # 临时实例(AP 模式)
        heart-beat-interval: 5000  # 心跳间隔
        heart-beat-timeout: 15000  # 心跳超时
        ip-delete-timeout: 30000   # 删除超时
        metadata:
          version: 1.0.0
          region: beijing          version: 1.0.0
# application.yml
spring:
  application:
    name: user-service
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848
        namespace: public
        group: DEFAULT_GROUP
        register-enabled: true
        ephemeral: true  # 临时实例(AP 模式)
        heart-beat-interval: 5000  # 心跳间隔
        heart-beat-timeout: 15000  # 心跳超时
        ip-delete-timeout: 30000   # 删除超时
        metadata:
          version: 1.0.0
          region: beijing          region: beijing
java 复制代码
#// 启动类
@SpringBootApplication
@EnableDiscoveryClient
public class UserServiceApplication {
    public static void main(String[] args) {
        SpringApplication.run(UserServiceApplication.class, args);
    }
}// 启动类`
`#// 启动类
@SpringBootApplication
@EnableDiscoveryClient
public class UserServiceApplication {
    public static void main(String[] args) {
        SpringApplication.run(UserServiceApplication.class, args);
    }
}@SpringBootApplication`
`#// 启动类
@SpringBootApplication
@EnableDiscoveryClient
public class UserServiceApplication {
    public static void main(String[] args) {
        SpringApplication.run(UserServiceApplication.class, args);
    }
}@EnableDiscoveryClient`
`#// 启动类
@SpringBootApplication
@EnableDiscoveryClient
public class UserServiceApplication {
    public static void main(String[] args) {
        SpringApplication.run(UserServiceApplication.class, args);
    }
}public class UserServiceApplication {`
`#// 启动类
@SpringBootApplication
@EnableDiscoveryClient
public class UserServiceApplication {
    public static void main(String[] args) {
        SpringApplication.run(UserServiceApplication.class, args);
    }
}    public static void main(String[] args) {`
`#// 启动类
@SpringBootApplication
@EnableDiscoveryClient
public class UserServiceApplication {
    public static void main(String[] args) {
        SpringApplication.run(UserServiceApplication.class, args);
    }
}        SpringApplication.run(UserServiceApplication.class, args);`
`#// 启动类
@SpringBootApplication
@EnableDiscoveryClient
public class UserServiceApplication {
    public static void main(String[] args) {
        SpringApplication.run(UserServiceApplication.class, args);
    }
}    }`
`#// 启动类
@SpringBootApplication
@EnableDiscoveryClient
public class UserServiceApplication {
    public static void main(String[] args) {
        SpringApplication.run(UserServiceApplication.class, args);
    }
}}

6.2 服务消费者配置

复制代码
# application.yml
spring:
  application:
    name: order-service
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848
        namespace: public
        group: DEFAULT_GROUP# application.yml
# application.yml
spring:
  application:
    name: order-service
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848
        namespace: public
        group: DEFAULT_GROUPspring:
# application.yml
spring:
  application:
    name: order-service
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848
        namespace: public
        group: DEFAULT_GROUP  application:
# application.yml
spring:
  application:
    name: order-service
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848
        namespace: public
        group: DEFAULT_GROUP    name: order-service
# application.yml
spring:
  application:
    name: order-service
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848
        namespace: public
        group: DEFAULT_GROUP  cloud:
# application.yml
spring:
  application:
    name: order-service
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848
        namespace: public
        group: DEFAULT_GROUP    nacos:
# application.yml
spring:
  application:
    name: order-service
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848
        namespace: public
        group: DEFAULT_GROUP      discovery:
# application.yml
spring:
  application:
    name: order-service
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848
        namespace: public
        group: DEFAULT_GROUP        server-addr: 127.0.0.1:8848
# application.yml
spring:
  application:
    name: order-service
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848
        namespace: public
        group: DEFAULT_GROUP        namespace: public
# application.yml
spring:
  application:
    name: order-service
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848
        namespace: public
        group: DEFAULT_GROUP        group: DEFAULT_GROUP
java 复制代码
#// 服务调用
@RestController
public class OrderController {
    
    @Autowired
    private LoadBalancerClient loadBalancerClient;
    
    @GetMapping("/order/create")
    public String createOrder() {
        // 1. 从 Nacos 获取服务实例
        ServiceInstance instance = loadBalancerClient.choose("user-service");
        
        // 2. 发起 HTTP 调用
        String url = instance.getUri() + "/user/get";
        RestTemplate restTemplate = new RestTemplate();
        String result = restTemplate.getForObject(url, String.class);
        
        return "订单创建成功,用户信息:" + result;
    }
}// 服务调用`
`#// 服务调用
@RestController
public class OrderController {
    
    @Autowired
    private LoadBalancerClient loadBalancerClient;
    
    @GetMapping("/order/create")
    public String createOrder() {
        // 1. 从 Nacos 获取服务实例
        ServiceInstance instance = loadBalancerClient.choose("user-service");
        
        // 2. 发起 HTTP 调用
        String url = instance.getUri() + "/user/get";
        RestTemplate restTemplate = new RestTemplate();
        String result = restTemplate.getForObject(url, String.class);
        
        return "订单创建成功,用户信息:" + result;
    }
}@RestController`
`#// 服务调用
@RestController
public class OrderController {
    
    @Autowired
    private LoadBalancerClient loadBalancerClient;
    
    @GetMapping("/order/create")
    public String createOrder() {
        // 1. 从 Nacos 获取服务实例
        ServiceInstance instance = loadBalancerClient.choose("user-service");
        
        // 2. 发起 HTTP 调用
        String url = instance.getUri() + "/user/get";
        RestTemplate restTemplate = new RestTemplate();
        String result = restTemplate.getForObject(url, String.class);
        
        return "订单创建成功,用户信息:" + result;
    }
}public class OrderController {`
`#// 服务调用
@RestController
public class OrderController {
    
    @Autowired
    private LoadBalancerClient loadBalancerClient;
    
    @GetMapping("/order/create")
    public String createOrder() {
        // 1. 从 Nacos 获取服务实例
        ServiceInstance instance = loadBalancerClient.choose("user-service");
        
        // 2. 发起 HTTP 调用
        String url = instance.getUri() + "/user/get";
        RestTemplate restTemplate = new RestTemplate();
        String result = restTemplate.getForObject(url, String.class);
        
        return "订单创建成功,用户信息:" + result;
    }
}    `
`#// 服务调用
@RestController
public class OrderController {
    
    @Autowired
    private LoadBalancerClient loadBalancerClient;
    
    @GetMapping("/order/create")
    public String createOrder() {
        // 1. 从 Nacos 获取服务实例
        ServiceInstance instance = loadBalancerClient.choose("user-service");
        
        // 2. 发起 HTTP 调用
        String url = instance.getUri() + "/user/get";
        RestTemplate restTemplate = new RestTemplate();
        String result = restTemplate.getForObject(url, String.class);
        
        return "订单创建成功,用户信息:" + result;
    }
}    @Autowired`
`#// 服务调用
@RestController
public class OrderController {
    
    @Autowired
    private LoadBalancerClient loadBalancerClient;
    
    @GetMapping("/order/create")
    public String createOrder() {
        // 1. 从 Nacos 获取服务实例
        ServiceInstance instance = loadBalancerClient.choose("user-service");
        
        // 2. 发起 HTTP 调用
        String url = instance.getUri() + "/user/get";
        RestTemplate restTemplate = new RestTemplate();
        String result = restTemplate.getForObject(url, String.class);
        
        return "订单创建成功,用户信息:" + result;
    }
}    private LoadBalancerClient loadBalancerClient;`
`#// 服务调用
@RestController
public class OrderController {
    
    @Autowired
    private LoadBalancerClient loadBalancerClient;
    
    @GetMapping("/order/create")
    public String createOrder() {
        // 1. 从 Nacos 获取服务实例
        ServiceInstance instance = loadBalancerClient.choose("user-service");
        
        // 2. 发起 HTTP 调用
        String url = instance.getUri() + "/user/get";
        RestTemplate restTemplate = new RestTemplate();
        String result = restTemplate.getForObject(url, String.class);
        
        return "订单创建成功,用户信息:" + result;
    }
}    `
`#// 服务调用
@RestController
public class OrderController {
    
    @Autowired
    private LoadBalancerClient loadBalancerClient;
    
    @GetMapping("/order/create")
    public String createOrder() {
        // 1. 从 Nacos 获取服务实例
        ServiceInstance instance = loadBalancerClient.choose("user-service");
        
        // 2. 发起 HTTP 调用
        String url = instance.getUri() + "/user/get";
        RestTemplate restTemplate = new RestTemplate();
        String result = restTemplate.getForObject(url, String.class);
        
        return "订单创建成功,用户信息:" + result;
    }
}    @GetMapping("/order/create")`
`#// 服务调用
@RestController
public class OrderController {
    
    @Autowired
    private LoadBalancerClient loadBalancerClient;
    
    @GetMapping("/order/create")
    public String createOrder() {
        // 1. 从 Nacos 获取服务实例
        ServiceInstance instance = loadBalancerClient.choose("user-service");
        
        // 2. 发起 HTTP 调用
        String url = instance.getUri() + "/user/get";
        RestTemplate restTemplate = new RestTemplate();
        String result = restTemplate.getForObject(url, String.class);
        
        return "订单创建成功,用户信息:" + result;
    }
}    public String createOrder() {`
`#// 服务调用
@RestController
public class OrderController {
    
    @Autowired
    private LoadBalancerClient loadBalancerClient;
    
    @GetMapping("/order/create")
    public String createOrder() {
        // 1. 从 Nacos 获取服务实例
        ServiceInstance instance = loadBalancerClient.choose("user-service");
        
        // 2. 发起 HTTP 调用
        String url = instance.getUri() + "/user/get";
        RestTemplate restTemplate = new RestTemplate();
        String result = restTemplate.getForObject(url, String.class);
        
        return "订单创建成功,用户信息:" + result;
    }
}        // 1. 从 Nacos 获取服务实例`
`#// 服务调用
@RestController
public class OrderController {
    
    @Autowired
    private LoadBalancerClient loadBalancerClient;
    
    @GetMapping("/order/create")
    public String createOrder() {
        // 1. 从 Nacos 获取服务实例
        ServiceInstance instance = loadBalancerClient.choose("user-service");
        
        // 2. 发起 HTTP 调用
        String url = instance.getUri() + "/user/get";
        RestTemplate restTemplate = new RestTemplate();
        String result = restTemplate.getForObject(url, String.class);
        
        return "订单创建成功,用户信息:" + result;
    }
}        ServiceInstance instance = loadBalancerClient.choose("user-service");`
`#// 服务调用
@RestController
public class OrderController {
    
    @Autowired
    private LoadBalancerClient loadBalancerClient;
    
    @GetMapping("/order/create")
    public String createOrder() {
        // 1. 从 Nacos 获取服务实例
        ServiceInstance instance = loadBalancerClient.choose("user-service");
        
        // 2. 发起 HTTP 调用
        String url = instance.getUri() + "/user/get";
        RestTemplate restTemplate = new RestTemplate();
        String result = restTemplate.getForObject(url, String.class);
        
        return "订单创建成功,用户信息:" + result;
    }
}        `
`#// 服务调用
@RestController
public class OrderController {
    
    @Autowired
    private LoadBalancerClient loadBalancerClient;
    
    @GetMapping("/order/create")
    public String createOrder() {
        // 1. 从 Nacos 获取服务实例
        ServiceInstance instance = loadBalancerClient.choose("user-service");
        
        // 2. 发起 HTTP 调用
        String url = instance.getUri() + "/user/get";
        RestTemplate restTemplate = new RestTemplate();
        String result = restTemplate.getForObject(url, String.class);
        
        return "订单创建成功,用户信息:" + result;
    }
}        // 2. 发起 HTTP 调用`
`#// 服务调用
@RestController
public class OrderController {
    
    @Autowired
    private LoadBalancerClient loadBalancerClient;
    
    @GetMapping("/order/create")
    public String createOrder() {
        // 1. 从 Nacos 获取服务实例
        ServiceInstance instance = loadBalancerClient.choose("user-service");
        
        // 2. 发起 HTTP 调用
        String url = instance.getUri() + "/user/get";
        RestTemplate restTemplate = new RestTemplate();
        String result = restTemplate.getForObject(url, String.class);
        
        return "订单创建成功,用户信息:" + result;
    }
}        String url = instance.getUri() + "/user/get";`
`#// 服务调用
@RestController
public class OrderController {
    
    @Autowired
    private LoadBalancerClient loadBalancerClient;
    
    @GetMapping("/order/create")
    public String createOrder() {
        // 1. 从 Nacos 获取服务实例
        ServiceInstance instance = loadBalancerClient.choose("user-service");
        
        // 2. 发起 HTTP 调用
        String url = instance.getUri() + "/user/get";
        RestTemplate restTemplate = new RestTemplate();
        String result = restTemplate.getForObject(url, String.class);
        
        return "订单创建成功,用户信息:" + result;
    }
}        RestTemplate restTemplate = new RestTemplate();`
`#// 服务调用
@RestController
public class OrderController {
    
    @Autowired
    private LoadBalancerClient loadBalancerClient;
    
    @GetMapping("/order/create")
    public String createOrder() {
        // 1. 从 Nacos 获取服务实例
        ServiceInstance instance = loadBalancerClient.choose("user-service");
        
        // 2. 发起 HTTP 调用
        String url = instance.getUri() + "/user/get";
        RestTemplate restTemplate = new RestTemplate();
        String result = restTemplate.getForObject(url, String.class);
        
        return "订单创建成功,用户信息:" + result;
    }
}        String result = restTemplate.getForObject(url, String.class);`
`#// 服务调用
@RestController
public class OrderController {
    
    @Autowired
    private LoadBalancerClient loadBalancerClient;
    
    @GetMapping("/order/create")
    public String createOrder() {
        // 1. 从 Nacos 获取服务实例
        ServiceInstance instance = loadBalancerClient.choose("user-service");
        
        // 2. 发起 HTTP 调用
        String url = instance.getUri() + "/user/get";
        RestTemplate restTemplate = new RestTemplate();
        String result = restTemplate.getForObject(url, String.class);
        
        return "订单创建成功,用户信息:" + result;
    }
}        `
`#// 服务调用
@RestController
public class OrderController {
    
    @Autowired
    private LoadBalancerClient loadBalancerClient;
    
    @GetMapping("/order/create")
    public String createOrder() {
        // 1. 从 Nacos 获取服务实例
        ServiceInstance instance = loadBalancerClient.choose("user-service");
        
        // 2. 发起 HTTP 调用
        String url = instance.getUri() + "/user/get";
        RestTemplate restTemplate = new RestTemplate();
        String result = restTemplate.getForObject(url, String.class);
        
        return "订单创建成功,用户信息:" + result;
    }
}        return "订单创建成功,用户信息:" + result;`
`#// 服务调用
@RestController
public class OrderController {
    
    @Autowired
    private LoadBalancerClient loadBalancerClient;
    
    @GetMapping("/order/create")
    public String createOrder() {
        // 1. 从 Nacos 获取服务实例
        ServiceInstance instance = loadBalancerClient.choose("user-service");
        
        // 2. 发起 HTTP 调用
        String url = instance.getUri() + "/user/get";
        RestTemplate restTemplate = new RestTemplate();
        String result = restTemplate.getForObject(url, String.class);
        
        return "订单创建成功,用户信息:" + result;
    }
}    }`
`#// 服务调用
@RestController
public class OrderController {
    
    @Autowired
    private LoadBalancerClient loadBalancerClient;
    
    @GetMapping("/order/create")
    public String createOrder() {
        // 1. 从 Nacos 获取服务实例
        ServiceInstance instance = loadBalancerClient.choose("user-service");
        
        // 2. 发起 HTTP 调用
        String url = instance.getUri() + "/user/get";
        RestTemplate restTemplate = new RestTemplate();
        String result = restTemplate.getForObject(url, String.class);
        
        return "订单创建成功,用户信息:" + result;
    }
}}

6.3 配置中心集成

复制代码
# bootstrap.yml
spring:
  application:
    name: user-service
  cloud:
    nacos:
      config:
        server-addr: 127.0.0.1:8848
        namespace: public
        group: DEFAULT_GROUP
        file-extension: yaml  # 配置文件格式
        refresh-enabled: true # 启用自动刷新
        shared-configs:
          - dataId: common.yaml  # 共享配置
            group: DEFAULT_GROUP
            refresh: true# bootstrap.yml
# bootstrap.yml
spring:
  application:
    name: user-service
  cloud:
    nacos:
      config:
        server-addr: 127.0.0.1:8848
        namespace: public
        group: DEFAULT_GROUP
        file-extension: yaml  # 配置文件格式
        refresh-enabled: true # 启用自动刷新
        shared-configs:
          - dataId: common.yaml  # 共享配置
            group: DEFAULT_GROUP
            refresh: truespring:
# bootstrap.yml
spring:
  application:
    name: user-service
  cloud:
    nacos:
      config:
        server-addr: 127.0.0.1:8848
        namespace: public
        group: DEFAULT_GROUP
        file-extension: yaml  # 配置文件格式
        refresh-enabled: true # 启用自动刷新
        shared-configs:
          - dataId: common.yaml  # 共享配置
            group: DEFAULT_GROUP
            refresh: true  application:
# bootstrap.yml
spring:
  application:
    name: user-service
  cloud:
    nacos:
      config:
        server-addr: 127.0.0.1:8848
        namespace: public
        group: DEFAULT_GROUP
        file-extension: yaml  # 配置文件格式
        refresh-enabled: true # 启用自动刷新
        shared-configs:
          - dataId: common.yaml  # 共享配置
            group: DEFAULT_GROUP
            refresh: true    name: user-service
# bootstrap.yml
spring:
  application:
    name: user-service
  cloud:
    nacos:
      config:
        server-addr: 127.0.0.1:8848
        namespace: public
        group: DEFAULT_GROUP
        file-extension: yaml  # 配置文件格式
        refresh-enabled: true # 启用自动刷新
        shared-configs:
          - dataId: common.yaml  # 共享配置
            group: DEFAULT_GROUP
            refresh: true  cloud:
# bootstrap.yml
spring:
  application:
    name: user-service
  cloud:
    nacos:
      config:
        server-addr: 127.0.0.1:8848
        namespace: public
        group: DEFAULT_GROUP
        file-extension: yaml  # 配置文件格式
        refresh-enabled: true # 启用自动刷新
        shared-configs:
          - dataId: common.yaml  # 共享配置
            group: DEFAULT_GROUP
            refresh: true    nacos:
# bootstrap.yml
spring:
  application:
    name: user-service
  cloud:
    nacos:
      config:
        server-addr: 127.0.0.1:8848
        namespace: public
        group: DEFAULT_GROUP
        file-extension: yaml  # 配置文件格式
        refresh-enabled: true # 启用自动刷新
        shared-configs:
          - dataId: common.yaml  # 共享配置
            group: DEFAULT_GROUP
            refresh: true      config:
# bootstrap.yml
spring:
  application:
    name: user-service
  cloud:
    nacos:
      config:
        server-addr: 127.0.0.1:8848
        namespace: public
        group: DEFAULT_GROUP
        file-extension: yaml  # 配置文件格式
        refresh-enabled: true # 启用自动刷新
        shared-configs:
          - dataId: common.yaml  # 共享配置
            group: DEFAULT_GROUP
            refresh: true        server-addr: 127.0.0.1:8848
# bootstrap.yml
spring:
  application:
    name: user-service
  cloud:
    nacos:
      config:
        server-addr: 127.0.0.1:8848
        namespace: public
        group: DEFAULT_GROUP
        file-extension: yaml  # 配置文件格式
        refresh-enabled: true # 启用自动刷新
        shared-configs:
          - dataId: common.yaml  # 共享配置
            group: DEFAULT_GROUP
            refresh: true        namespace: public
# bootstrap.yml
spring:
  application:
    name: user-service
  cloud:
    nacos:
      config:
        server-addr: 127.0.0.1:8848
        namespace: public
        group: DEFAULT_GROUP
        file-extension: yaml  # 配置文件格式
        refresh-enabled: true # 启用自动刷新
        shared-configs:
          - dataId: common.yaml  # 共享配置
            group: DEFAULT_GROUP
            refresh: true        group: DEFAULT_GROUP
# bootstrap.yml
spring:
  application:
    name: user-service
  cloud:
    nacos:
      config:
        server-addr: 127.0.0.1:8848
        namespace: public
        group: DEFAULT_GROUP
        file-extension: yaml  # 配置文件格式
        refresh-enabled: true # 启用自动刷新
        shared-configs:
          - dataId: common.yaml  # 共享配置
            group: DEFAULT_GROUP
            refresh: true        file-extension: yaml  # 配置文件格式
# bootstrap.yml
spring:
  application:
    name: user-service
  cloud:
    nacos:
      config:
        server-addr: 127.0.0.1:8848
        namespace: public
        group: DEFAULT_GROUP
        file-extension: yaml  # 配置文件格式
        refresh-enabled: true # 启用自动刷新
        shared-configs:
          - dataId: common.yaml  # 共享配置
            group: DEFAULT_GROUP
            refresh: true        refresh-enabled: true # 启用自动刷新
# bootstrap.yml
spring:
  application:
    name: user-service
  cloud:
    nacos:
      config:
        server-addr: 127.0.0.1:8848
        namespace: public
        group: DEFAULT_GROUP
        file-extension: yaml  # 配置文件格式
        refresh-enabled: true # 启用自动刷新
        shared-configs:
          - dataId: common.yaml  # 共享配置
            group: DEFAULT_GROUP
            refresh: true        shared-configs:
# bootstrap.yml
spring:
  application:
    name: user-service
  cloud:
    nacos:
      config:
        server-addr: 127.0.0.1:8848
        namespace: public
        group: DEFAULT_GROUP
        file-extension: yaml  # 配置文件格式
        refresh-enabled: true # 启用自动刷新
        shared-configs:
          - dataId: common.yaml  # 共享配置
            group: DEFAULT_GROUP
            refresh: true          - dataId: common.yaml  # 共享配置
# bootstrap.yml
spring:
  application:
    name: user-service
  cloud:
    nacos:
      config:
        server-addr: 127.0.0.1:8848
        namespace: public
        group: DEFAULT_GROUP
        file-extension: yaml  # 配置文件格式
        refresh-enabled: true # 启用自动刷新
        shared-configs:
          - dataId: common.yaml  # 共享配置
            group: DEFAULT_GROUP
            refresh: true            group: DEFAULT_GROUP
# bootstrap.yml
spring:
  application:
    name: user-service
  cloud:
    nacos:
      config:
        server-addr: 127.0.0.1:8848
        namespace: public
        group: DEFAULT_GROUP
        file-extension: yaml  # 配置文件格式
        refresh-enabled: true # 启用自动刷新
        shared-configs:
          - dataId: common.yaml  # 共享配置
            group: DEFAULT_GROUP
            refresh: true            refresh: true
java 复制代码
#// 使用配置
@RestController
@RefreshScope  // 支持配置动态刷新
public class ConfigController {
    
    @Value("${user.title}")
    private String title;
    
    @GetMapping("/config")
    public String getConfig() {
        return "配置信息:" + title;
    }
}// 使用配置`
`#// 使用配置
@RestController
@RefreshScope  // 支持配置动态刷新
public class ConfigController {
    
    @Value("${user.title}")
    private String title;
    
    @GetMapping("/config")
    public String getConfig() {
        return "配置信息:" + title;
    }
}@RestController`
`#// 使用配置
@RestController
@RefreshScope  // 支持配置动态刷新
public class ConfigController {
    
    @Value("${user.title}")
    private String title;
    
    @GetMapping("/config")
    public String getConfig() {
        return "配置信息:" + title;
    }
}@RefreshScope  // 支持配置动态刷新`
`#// 使用配置
@RestController
@RefreshScope  // 支持配置动态刷新
public class ConfigController {
    
    @Value("${user.title}")
    private String title;
    
    @GetMapping("/config")
    public String getConfig() {
        return "配置信息:" + title;
    }
}public class ConfigController {`
`#// 使用配置
@RestController
@RefreshScope  // 支持配置动态刷新
public class ConfigController {
    
    @Value("${user.title}")
    private String title;
    
    @GetMapping("/config")
    public String getConfig() {
        return "配置信息:" + title;
    }
}    `
`#// 使用配置
@RestController
@RefreshScope  // 支持配置动态刷新
public class ConfigController {
    
    @Value("${user.title}")
    private String title;
    
    @GetMapping("/config")
    public String getConfig() {
        return "配置信息:" + title;
    }
}    @Value("${user.title}")`
`#// 使用配置
@RestController
@RefreshScope  // 支持配置动态刷新
public class ConfigController {
    
    @Value("${user.title}")
    private String title;
    
    @GetMapping("/config")
    public String getConfig() {
        return "配置信息:" + title;
    }
}    private String title;`
`#// 使用配置
@RestController
@RefreshScope  // 支持配置动态刷新
public class ConfigController {
    
    @Value("${user.title}")
    private String title;
    
    @GetMapping("/config")
    public String getConfig() {
        return "配置信息:" + title;
    }
}    `
`#// 使用配置
@RestController
@RefreshScope  // 支持配置动态刷新
public class ConfigController {
    
    @Value("${user.title}")
    private String title;
    
    @GetMapping("/config")
    public String getConfig() {
        return "配置信息:" + title;
    }
}    @GetMapping("/config")`
`#// 使用配置
@RestController
@RefreshScope  // 支持配置动态刷新
public class ConfigController {
    
    @Value("${user.title}")
    private String title;
    
    @GetMapping("/config")
    public String getConfig() {
        return "配置信息:" + title;
    }
}    public String getConfig() {`
`#// 使用配置
@RestController
@RefreshScope  // 支持配置动态刷新
public class ConfigController {
    
    @Value("${user.title}")
    private String title;
    
    @GetMapping("/config")
    public String getConfig() {
        return "配置信息:" + title;
    }
}        return "配置信息:" + title;`
`#// 使用配置
@RestController
@RefreshScope  // 支持配置动态刷新
public class ConfigController {
    
    @Value("${user.title}")
    private String title;
    
    @GetMapping("/config")
    public String getConfig() {
        return "配置信息:" + title;
    }
}    }`
`#// 使用配置
@RestController
@RefreshScope  // 支持配置动态刷新
public class ConfigController {
    
    @Value("${user.title}")
    private String title;
    
    @GetMapping("/config")
    public String getConfig() {
        return "配置信息:" + title;
    }
}}

七、性能优化与最佳实践

7.1 集群部署规划

节点数 推荐配置 说明
3 节点 2C4G 最小集群(允许 1 节点故障)
5 节点 4C8G 生产推荐(允许 2 节点故障)
7 节点+ 8C16G 大规模集群(允许 3 节点故障)

7.2 性能调优参数

复制代码
# application.properties
# 服务注册性能优化
nacos.naming.distro.taskDispatchPeriod=200  # 同步任务派发周期
nacos.naming.distro.taskRetryDelay=5000     # 任务重试延迟
nacos.naming.distro.batchSyncKeyCount=1000  # 批量同步数量

# 健康检查优化
nacos.naming.expireInstance.period=5000     # 过期实例扫描周期

# 配置中心优化
nacos.config.notify.connectTimeout=5000     # 配置推送超时# application.properties
# application.properties
# 服务注册性能优化
nacos.naming.distro.taskDispatchPeriod=200  # 同步任务派发周期
nacos.naming.distro.taskRetryDelay=5000     # 任务重试延迟
nacos.naming.distro.batchSyncKeyCount=1000  # 批量同步数量

# 健康检查优化
nacos.naming.expireInstance.period=5000     # 过期实例扫描周期

# 配置中心优化
nacos.config.notify.connectTimeout=5000     # 配置推送超时# 服务注册性能优化
# application.properties
# 服务注册性能优化
nacos.naming.distro.taskDispatchPeriod=200  # 同步任务派发周期
nacos.naming.distro.taskRetryDelay=5000     # 任务重试延迟
nacos.naming.distro.batchSyncKeyCount=1000  # 批量同步数量

# 健康检查优化
nacos.naming.expireInstance.period=5000     # 过期实例扫描周期

# 配置中心优化
nacos.config.notify.connectTimeout=5000     # 配置推送超时nacos.naming.distro.taskDispatchPeriod=200  # 同步任务派发周期
# application.properties
# 服务注册性能优化
nacos.naming.distro.taskDispatchPeriod=200  # 同步任务派发周期
nacos.naming.distro.taskRetryDelay=5000     # 任务重试延迟
nacos.naming.distro.batchSyncKeyCount=1000  # 批量同步数量

# 健康检查优化
nacos.naming.expireInstance.period=5000     # 过期实例扫描周期

# 配置中心优化
nacos.config.notify.connectTimeout=5000     # 配置推送超时nacos.naming.distro.taskRetryDelay=5000     # 任务重试延迟
# application.properties
# 服务注册性能优化
nacos.naming.distro.taskDispatchPeriod=200  # 同步任务派发周期
nacos.naming.distro.taskRetryDelay=5000     # 任务重试延迟
nacos.naming.distro.batchSyncKeyCount=1000  # 批量同步数量

# 健康检查优化
nacos.naming.expireInstance.period=5000     # 过期实例扫描周期

# 配置中心优化
nacos.config.notify.connectTimeout=5000     # 配置推送超时nacos.naming.distro.batchSyncKeyCount=1000  # 批量同步数量
# application.properties
# 服务注册性能优化
nacos.naming.distro.taskDispatchPeriod=200  # 同步任务派发周期
nacos.naming.distro.taskRetryDelay=5000     # 任务重试延迟
nacos.naming.distro.batchSyncKeyCount=1000  # 批量同步数量

# 健康检查优化
nacos.naming.expireInstance.period=5000     # 过期实例扫描周期

# 配置中心优化
nacos.config.notify.connectTimeout=5000     # 配置推送超时
# application.properties
# 服务注册性能优化
nacos.naming.distro.taskDispatchPeriod=200  # 同步任务派发周期
nacos.naming.distro.taskRetryDelay=5000     # 任务重试延迟
nacos.naming.distro.batchSyncKeyCount=1000  # 批量同步数量

# 健康检查优化
nacos.naming.expireInstance.period=5000     # 过期实例扫描周期

# 配置中心优化
nacos.config.notify.connectTimeout=5000     # 配置推送超时# 健康检查优化
# application.properties
# 服务注册性能优化
nacos.naming.distro.taskDispatchPeriod=200  # 同步任务派发周期
nacos.naming.distro.taskRetryDelay=5000     # 任务重试延迟
nacos.naming.distro.batchSyncKeyCount=1000  # 批量同步数量

# 健康检查优化
nacos.naming.expireInstance.period=5000     # 过期实例扫描周期

# 配置中心优化
nacos.config.notify.connectTimeout=5000     # 配置推送超时nacos.naming.expireInstance.period=5000     # 过期实例扫描周期
# application.properties
# 服务注册性能优化
nacos.naming.distro.taskDispatchPeriod=200  # 同步任务派发周期
nacos.naming.distro.taskRetryDelay=5000     # 任务重试延迟
nacos.naming.distro.batchSyncKeyCount=1000  # 批量同步数量

# 健康检查优化
nacos.naming.expireInstance.period=5000     # 过期实例扫描周期

# 配置中心优化
nacos.config.notify.connectTimeout=5000     # 配置推送超时
# application.properties
# 服务注册性能优化
nacos.naming.distro.taskDispatchPeriod=200  # 同步任务派发周期
nacos.naming.distro.taskRetryDelay=5000     # 任务重试延迟
nacos.naming.distro.batchSyncKeyCount=1000  # 批量同步数量

# 健康检查优化
nacos.naming.expireInstance.period=5000     # 过期实例扫描周期

# 配置中心优化
nacos.config.notify.connectTimeout=5000     # 配置推送超时# 配置中心优化
# application.properties
# 服务注册性能优化
nacos.naming.distro.taskDispatchPeriod=200  # 同步任务派发周期
nacos.naming.distro.taskRetryDelay=5000     # 任务重试延迟
nacos.naming.distro.batchSyncKeyCount=1000  # 批量同步数量

# 健康检查优化
nacos.naming.expireInstance.period=5000     # 过期实例扫描周期

# 配置中心优化
nacos.config.notify.connectTimeout=5000     # 配置推送超时nacos.config.notify.connectTimeout=5000     # 配置推送超时

7.3 避免雪崩效应

java 复制代码
#// ❌ 错误:同步调用导致雪崩
@FeignClient(name = "user-service")
public interface UserClient {
    @GetMapping("/user/{id}")
    User getUser(@PathVariable Long id);  // 同步调用
}

// ✅ 正确:使用异步 + 熔断
@FeignClient(name = "user-service", fallback = UserClientFallback.class)
public interface UserClient {
    @GetMapping("/user/{id}")
    CompletableFuture<User> getUserAsync(@PathVariable Long id);  // 异步调用
}

// 降级处理
public class UserClientFallback implements UserClient {
    @Override
    public CompletableFuture<User> getUserAsync(Long id) {
        return CompletableFuture.completedFuture(new User(id, "默认用户"));
    }
}// ❌ 错误:同步调用导致雪崩`
`#// ❌ 错误:同步调用导致雪崩
@FeignClient(name = "user-service")
public interface UserClient {
    @GetMapping("/user/{id}")
    User getUser(@PathVariable Long id);  // 同步调用
}

// ✅ 正确:使用异步 + 熔断
@FeignClient(name = "user-service", fallback = UserClientFallback.class)
public interface UserClient {
    @GetMapping("/user/{id}")
    CompletableFuture<User> getUserAsync(@PathVariable Long id);  // 异步调用
}

// 降级处理
public class UserClientFallback implements UserClient {
    @Override
    public CompletableFuture<User> getUserAsync(Long id) {
        return CompletableFuture.completedFuture(new User(id, "默认用户"));
    }
}@FeignClient(name = "user-service")`
`#// ❌ 错误:同步调用导致雪崩
@FeignClient(name = "user-service")
public interface UserClient {
    @GetMapping("/user/{id}")
    User getUser(@PathVariable Long id);  // 同步调用
}

// ✅ 正确:使用异步 + 熔断
@FeignClient(name = "user-service", fallback = UserClientFallback.class)
public interface UserClient {
    @GetMapping("/user/{id}")
    CompletableFuture<User> getUserAsync(@PathVariable Long id);  // 异步调用
}

// 降级处理
public class UserClientFallback implements UserClient {
    @Override
    public CompletableFuture<User> getUserAsync(Long id) {
        return CompletableFuture.completedFuture(new User(id, "默认用户"));
    }
}public interface UserClient {`
`#// ❌ 错误:同步调用导致雪崩
@FeignClient(name = "user-service")
public interface UserClient {
    @GetMapping("/user/{id}")
    User getUser(@PathVariable Long id);  // 同步调用
}

// ✅ 正确:使用异步 + 熔断
@FeignClient(name = "user-service", fallback = UserClientFallback.class)
public interface UserClient {
    @GetMapping("/user/{id}")
    CompletableFuture<User> getUserAsync(@PathVariable Long id);  // 异步调用
}

// 降级处理
public class UserClientFallback implements UserClient {
    @Override
    public CompletableFuture<User> getUserAsync(Long id) {
        return CompletableFuture.completedFuture(new User(id, "默认用户"));
    }
}    @GetMapping("/user/{id}")`
`#// ❌ 错误:同步调用导致雪崩
@FeignClient(name = "user-service")
public interface UserClient {
    @GetMapping("/user/{id}")
    User getUser(@PathVariable Long id);  // 同步调用
}

// ✅ 正确:使用异步 + 熔断
@FeignClient(name = "user-service", fallback = UserClientFallback.class)
public interface UserClient {
    @GetMapping("/user/{id}")
    CompletableFuture<User> getUserAsync(@PathVariable Long id);  // 异步调用
}

// 降级处理
public class UserClientFallback implements UserClient {
    @Override
    public CompletableFuture<User> getUserAsync(Long id) {
        return CompletableFuture.completedFuture(new User(id, "默认用户"));
    }
}    User getUser(@PathVariable Long id);  // 同步调用`
`#// ❌ 错误:同步调用导致雪崩
@FeignClient(name = "user-service")
public interface UserClient {
    @GetMapping("/user/{id}")
    User getUser(@PathVariable Long id);  // 同步调用
}

// ✅ 正确:使用异步 + 熔断
@FeignClient(name = "user-service", fallback = UserClientFallback.class)
public interface UserClient {
    @GetMapping("/user/{id}")
    CompletableFuture<User> getUserAsync(@PathVariable Long id);  // 异步调用
}

// 降级处理
public class UserClientFallback implements UserClient {
    @Override
    public CompletableFuture<User> getUserAsync(Long id) {
        return CompletableFuture.completedFuture(new User(id, "默认用户"));
    }
}}`
`#// ❌ 错误:同步调用导致雪崩
@FeignClient(name = "user-service")
public interface UserClient {
    @GetMapping("/user/{id}")
    User getUser(@PathVariable Long id);  // 同步调用
}

// ✅ 正确:使用异步 + 熔断
@FeignClient(name = "user-service", fallback = UserClientFallback.class)
public interface UserClient {
    @GetMapping("/user/{id}")
    CompletableFuture<User> getUserAsync(@PathVariable Long id);  // 异步调用
}

// 降级处理
public class UserClientFallback implements UserClient {
    @Override
    public CompletableFuture<User> getUserAsync(Long id) {
        return CompletableFuture.completedFuture(new User(id, "默认用户"));
    }
}`
`#// ❌ 错误:同步调用导致雪崩
@FeignClient(name = "user-service")
public interface UserClient {
    @GetMapping("/user/{id}")
    User getUser(@PathVariable Long id);  // 同步调用
}

// ✅ 正确:使用异步 + 熔断
@FeignClient(name = "user-service", fallback = UserClientFallback.class)
public interface UserClient {
    @GetMapping("/user/{id}")
    CompletableFuture<User> getUserAsync(@PathVariable Long id);  // 异步调用
}

// 降级处理
public class UserClientFallback implements UserClient {
    @Override
    public CompletableFuture<User> getUserAsync(Long id) {
        return CompletableFuture.completedFuture(new User(id, "默认用户"));
    }
}// ✅ 正确:使用异步 + 熔断`
`#// ❌ 错误:同步调用导致雪崩
@FeignClient(name = "user-service")
public interface UserClient {
    @GetMapping("/user/{id}")
    User getUser(@PathVariable Long id);  // 同步调用
}

// ✅ 正确:使用异步 + 熔断
@FeignClient(name = "user-service", fallback = UserClientFallback.class)
public interface UserClient {
    @GetMapping("/user/{id}")
    CompletableFuture<User> getUserAsync(@PathVariable Long id);  // 异步调用
}

// 降级处理
public class UserClientFallback implements UserClient {
    @Override
    public CompletableFuture<User> getUserAsync(Long id) {
        return CompletableFuture.completedFuture(new User(id, "默认用户"));
    }
}@FeignClient(name = "user-service", fallback = UserClientFallback.class)`
`#// ❌ 错误:同步调用导致雪崩
@FeignClient(name = "user-service")
public interface UserClient {
    @GetMapping("/user/{id}")
    User getUser(@PathVariable Long id);  // 同步调用
}

// ✅ 正确:使用异步 + 熔断
@FeignClient(name = "user-service", fallback = UserClientFallback.class)
public interface UserClient {
    @GetMapping("/user/{id}")
    CompletableFuture<User> getUserAsync(@PathVariable Long id);  // 异步调用
}

// 降级处理
public class UserClientFallback implements UserClient {
    @Override
    public CompletableFuture<User> getUserAsync(Long id) {
        return CompletableFuture.completedFuture(new User(id, "默认用户"));
    }
}public interface UserClient {`
`#// ❌ 错误:同步调用导致雪崩
@FeignClient(name = "user-service")
public interface UserClient {
    @GetMapping("/user/{id}")
    User getUser(@PathVariable Long id);  // 同步调用
}

// ✅ 正确:使用异步 + 熔断
@FeignClient(name = "user-service", fallback = UserClientFallback.class)
public interface UserClient {
    @GetMapping("/user/{id}")
    CompletableFuture<User> getUserAsync(@PathVariable Long id);  // 异步调用
}

// 降级处理
public class UserClientFallback implements UserClient {
    @Override
    public CompletableFuture<User> getUserAsync(Long id) {
        return CompletableFuture.completedFuture(new User(id, "默认用户"));
    }
}    @GetMapping("/user/{id}")`
`#// ❌ 错误:同步调用导致雪崩
@FeignClient(name = "user-service")
public interface UserClient {
    @GetMapping("/user/{id}")
    User getUser(@PathVariable Long id);  // 同步调用
}

// ✅ 正确:使用异步 + 熔断
@FeignClient(name = "user-service", fallback = UserClientFallback.class)
public interface UserClient {
    @GetMapping("/user/{id}")
    CompletableFuture<User> getUserAsync(@PathVariable Long id);  // 异步调用
}

// 降级处理
public class UserClientFallback implements UserClient {
    @Override
    public CompletableFuture<User> getUserAsync(Long id) {
        return CompletableFuture.completedFuture(new User(id, "默认用户"));
    }
}    CompletableFuture<User> getUserAsync(@PathVariable Long id);  // 异步调用`
`#// ❌ 错误:同步调用导致雪崩
@FeignClient(name = "user-service")
public interface UserClient {
    @GetMapping("/user/{id}")
    User getUser(@PathVariable Long id);  // 同步调用
}

// ✅ 正确:使用异步 + 熔断
@FeignClient(name = "user-service", fallback = UserClientFallback.class)
public interface UserClient {
    @GetMapping("/user/{id}")
    CompletableFuture<User> getUserAsync(@PathVariable Long id);  // 异步调用
}

// 降级处理
public class UserClientFallback implements UserClient {
    @Override
    public CompletableFuture<User> getUserAsync(Long id) {
        return CompletableFuture.completedFuture(new User(id, "默认用户"));
    }
}}`
`#// ❌ 错误:同步调用导致雪崩
@FeignClient(name = "user-service")
public interface UserClient {
    @GetMapping("/user/{id}")
    User getUser(@PathVariable Long id);  // 同步调用
}

// ✅ 正确:使用异步 + 熔断
@FeignClient(name = "user-service", fallback = UserClientFallback.class)
public interface UserClient {
    @GetMapping("/user/{id}")
    CompletableFuture<User> getUserAsync(@PathVariable Long id);  // 异步调用
}

// 降级处理
public class UserClientFallback implements UserClient {
    @Override
    public CompletableFuture<User> getUserAsync(Long id) {
        return CompletableFuture.completedFuture(new User(id, "默认用户"));
    }
}`
`#// ❌ 错误:同步调用导致雪崩
@FeignClient(name = "user-service")
public interface UserClient {
    @GetMapping("/user/{id}")
    User getUser(@PathVariable Long id);  // 同步调用
}

// ✅ 正确:使用异步 + 熔断
@FeignClient(name = "user-service", fallback = UserClientFallback.class)
public interface UserClient {
    @GetMapping("/user/{id}")
    CompletableFuture<User> getUserAsync(@PathVariable Long id);  // 异步调用
}

// 降级处理
public class UserClientFallback implements UserClient {
    @Override
    public CompletableFuture<User> getUserAsync(Long id) {
        return CompletableFuture.completedFuture(new User(id, "默认用户"));
    }
}// 降级处理`
`#// ❌ 错误:同步调用导致雪崩
@FeignClient(name = "user-service")
public interface UserClient {
    @GetMapping("/user/{id}")
    User getUser(@PathVariable Long id);  // 同步调用
}

// ✅ 正确:使用异步 + 熔断
@FeignClient(name = "user-service", fallback = UserClientFallback.class)
public interface UserClient {
    @GetMapping("/user/{id}")
    CompletableFuture<User> getUserAsync(@PathVariable Long id);  // 异步调用
}

// 降级处理
public class UserClientFallback implements UserClient {
    @Override
    public CompletableFuture<User> getUserAsync(Long id) {
        return CompletableFuture.completedFuture(new User(id, "默认用户"));
    }
}public class UserClientFallback implements UserClient {`
`#// ❌ 错误:同步调用导致雪崩
@FeignClient(name = "user-service")
public interface UserClient {
    @GetMapping("/user/{id}")
    User getUser(@PathVariable Long id);  // 同步调用
}

// ✅ 正确:使用异步 + 熔断
@FeignClient(name = "user-service", fallback = UserClientFallback.class)
public interface UserClient {
    @GetMapping("/user/{id}")
    CompletableFuture<User> getUserAsync(@PathVariable Long id);  // 异步调用
}

// 降级处理
public class UserClientFallback implements UserClient {
    @Override
    public CompletableFuture<User> getUserAsync(Long id) {
        return CompletableFuture.completedFuture(new User(id, "默认用户"));
    }
}    @Override`
`#// ❌ 错误:同步调用导致雪崩
@FeignClient(name = "user-service")
public interface UserClient {
    @GetMapping("/user/{id}")
    User getUser(@PathVariable Long id);  // 同步调用
}

// ✅ 正确:使用异步 + 熔断
@FeignClient(name = "user-service", fallback = UserClientFallback.class)
public interface UserClient {
    @GetMapping("/user/{id}")
    CompletableFuture<User> getUserAsync(@PathVariable Long id);  // 异步调用
}

// 降级处理
public class UserClientFallback implements UserClient {
    @Override
    public CompletableFuture<User> getUserAsync(Long id) {
        return CompletableFuture.completedFuture(new User(id, "默认用户"));
    }
}    public CompletableFuture<User> getUserAsync(Long id) {`
`#// ❌ 错误:同步调用导致雪崩
@FeignClient(name = "user-service")
public interface UserClient {
    @GetMapping("/user/{id}")
    User getUser(@PathVariable Long id);  // 同步调用
}

// ✅ 正确:使用异步 + 熔断
@FeignClient(name = "user-service", fallback = UserClientFallback.class)
public interface UserClient {
    @GetMapping("/user/{id}")
    CompletableFuture<User> getUserAsync(@PathVariable Long id);  // 异步调用
}

// 降级处理
public class UserClientFallback implements UserClient {
    @Override
    public CompletableFuture<User> getUserAsync(Long id) {
        return CompletableFuture.completedFuture(new User(id, "默认用户"));
    }
}        return CompletableFuture.completedFuture(new User(id, "默认用户"));`
`#// ❌ 错误:同步调用导致雪崩
@FeignClient(name = "user-service")
public interface UserClient {
    @GetMapping("/user/{id}")
    User getUser(@PathVariable Long id);  // 同步调用
}

// ✅ 正确:使用异步 + 熔断
@FeignClient(name = "user-service", fallback = UserClientFallback.class)
public interface UserClient {
    @GetMapping("/user/{id}")
    CompletableFuture<User> getUserAsync(@PathVariable Long id);  // 异步调用
}

// 降级处理
public class UserClientFallback implements UserClient {
    @Override
    public CompletableFuture<User> getUserAsync(Long id) {
        return CompletableFuture.completedFuture(new User(id, "默认用户"));
    }
}    }`
`#// ❌ 错误:同步调用导致雪崩
@FeignClient(name = "user-service")
public interface UserClient {
    @GetMapping("/user/{id}")
    User getUser(@PathVariable Long id);  // 同步调用
}

// ✅ 正确:使用异步 + 熔断
@FeignClient(name = "user-service", fallback = UserClientFallback.class)
public interface UserClient {
    @GetMapping("/user/{id}")
    CompletableFuture<User> getUserAsync(@PathVariable Long id);  // 异步调用
}

// 降级处理
public class UserClientFallback implements UserClient {
    @Override
    public CompletableFuture<User> getUserAsync(Long id) {
        return CompletableFuture.completedFuture(new User(id, "默认用户"));
    }
}}

八、版本演进:Nacos 2.2.0 新特性

8.1 gRPC 协议支持

复制代码
# Nacos 2.x 默认使用 gRPC(性能优于 HTTP 1.x)
spring:
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848
        grpc-port: 9848  # gRPC 端口# Nacos 2.x 默认使用 gRPC(性能优于 HTTP 1.x)
# Nacos 2.x 默认使用 gRPC(性能优于 HTTP 1.x)
spring:
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848
        grpc-port: 9848  # gRPC 端口spring:
# Nacos 2.x 默认使用 gRPC(性能优于 HTTP 1.x)
spring:
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848
        grpc-port: 9848  # gRPC 端口  cloud:
# Nacos 2.x 默认使用 gRPC(性能优于 HTTP 1.x)
spring:
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848
        grpc-port: 9848  # gRPC 端口    nacos:
# Nacos 2.x 默认使用 gRPC(性能优于 HTTP 1.x)
spring:
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848
        grpc-port: 9848  # gRPC 端口      discovery:
# Nacos 2.x 默认使用 gRPC(性能优于 HTTP 1.x)
spring:
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848
        grpc-port: 9848  # gRPC 端口        server-addr: 127.0.0.1:8848
# Nacos 2.x 默认使用 gRPC(性能优于 HTTP 1.x)
spring:
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848
        grpc-port: 9848  # gRPC 端口        grpc-port: 9848  # gRPC 端口

8.2 访问控制优化

java 复制代码
#// Nacos 2.2.0 支持基于角色的访问控制(RBAC)
@Configuration
public class NacosSecurityConfig {
    
    @Bean
    public Properties nacosProperties() {
        Properties properties = new Properties();
        properties.put("username", "nacos");
        properties.put("password", "nacos");
        properties.put("accessKey", "your-access-key");
        properties.put("secretKey", "your-secret-key");
        return properties;
    }
}// Nacos 2.2.0 支持基于角色的访问控制(RBAC)`
`#// Nacos 2.2.0 支持基于角色的访问控制(RBAC)
@Configuration
public class NacosSecurityConfig {
    
    @Bean
    public Properties nacosProperties() {
        Properties properties = new Properties();
        properties.put("username", "nacos");
        properties.put("password", "nacos");
        properties.put("accessKey", "your-access-key");
        properties.put("secretKey", "your-secret-key");
        return properties;
    }
}@Configuration`
`#// Nacos 2.2.0 支持基于角色的访问控制(RBAC)
@Configuration
public class NacosSecurityConfig {
    
    @Bean
    public Properties nacosProperties() {
        Properties properties = new Properties();
        properties.put("username", "nacos");
        properties.put("password", "nacos");
        properties.put("accessKey", "your-access-key");
        properties.put("secretKey", "your-secret-key");
        return properties;
    }
}public class NacosSecurityConfig {`
`#// Nacos 2.2.0 支持基于角色的访问控制(RBAC)
@Configuration
public class NacosSecurityConfig {
    
    @Bean
    public Properties nacosProperties() {
        Properties properties = new Properties();
        properties.put("username", "nacos");
        properties.put("password", "nacos");
        properties.put("accessKey", "your-access-key");
        properties.put("secretKey", "your-secret-key");
        return properties;
    }
}    `
`#// Nacos 2.2.0 支持基于角色的访问控制(RBAC)
@Configuration
public class NacosSecurityConfig {
    
    @Bean
    public Properties nacosProperties() {
        Properties properties = new Properties();
        properties.put("username", "nacos");
        properties.put("password", "nacos");
        properties.put("accessKey", "your-access-key");
        properties.put("secretKey", "your-secret-key");
        return properties;
    }
}    @Bean`
`#// Nacos 2.2.0 支持基于角色的访问控制(RBAC)
@Configuration
public class NacosSecurityConfig {
    
    @Bean
    public Properties nacosProperties() {
        Properties properties = new Properties();
        properties.put("username", "nacos");
        properties.put("password", "nacos");
        properties.put("accessKey", "your-access-key");
        properties.put("secretKey", "your-secret-key");
        return properties;
    }
}    public Properties nacosProperties() {`
`#// Nacos 2.2.0 支持基于角色的访问控制(RBAC)
@Configuration
public class NacosSecurityConfig {
    
    @Bean
    public Properties nacosProperties() {
        Properties properties = new Properties();
        properties.put("username", "nacos");
        properties.put("password", "nacos");
        properties.put("accessKey", "your-access-key");
        properties.put("secretKey", "your-secret-key");
        return properties;
    }
}        Properties properties = new Properties();`
`#// Nacos 2.2.0 支持基于角色的访问控制(RBAC)
@Configuration
public class NacosSecurityConfig {
    
    @Bean
    public Properties nacosProperties() {
        Properties properties = new Properties();
        properties.put("username", "nacos");
        properties.put("password", "nacos");
        properties.put("accessKey", "your-access-key");
        properties.put("secretKey", "your-secret-key");
        return properties;
    }
}        properties.put("username", "nacos");`
`#// Nacos 2.2.0 支持基于角色的访问控制(RBAC)
@Configuration
public class NacosSecurityConfig {
    
    @Bean
    public Properties nacosProperties() {
        Properties properties = new Properties();
        properties.put("username", "nacos");
        properties.put("password", "nacos");
        properties.put("accessKey", "your-access-key");
        properties.put("secretKey", "your-secret-key");
        return properties;
    }
}        properties.put("password", "nacos");`
`#// Nacos 2.2.0 支持基于角色的访问控制(RBAC)
@Configuration
public class NacosSecurityConfig {
    
    @Bean
    public Properties nacosProperties() {
        Properties properties = new Properties();
        properties.put("username", "nacos");
        properties.put("password", "nacos");
        properties.put("accessKey", "your-access-key");
        properties.put("secretKey", "your-secret-key");
        return properties;
    }
}        properties.put("accessKey", "your-access-key");`
`#// Nacos 2.2.0 支持基于角色的访问控制(RBAC)
@Configuration
public class NacosSecurityConfig {
    
    @Bean
    public Properties nacosProperties() {
        Properties properties = new Properties();
        properties.put("username", "nacos");
        properties.put("password", "nacos");
        properties.put("accessKey", "your-access-key");
        properties.put("secretKey", "your-secret-key");
        return properties;
    }
}        properties.put("secretKey", "your-secret-key");`
`#// Nacos 2.2.0 支持基于角色的访问控制(RBAC)
@Configuration
public class NacosSecurityConfig {
    
    @Bean
    public Properties nacosProperties() {
        Properties properties = new Properties();
        properties.put("username", "nacos");
        properties.put("password", "nacos");
        properties.put("accessKey", "your-access-key");
        properties.put("secretKey", "your-secret-key");
        return properties;
    }
}        return properties;`
`#// Nacos 2.2.0 支持基于角色的访问控制(RBAC)
@Configuration
public class NacosSecurityConfig {
    
    @Bean
    public Properties nacosProperties() {
        Properties properties = new Properties();
        properties.put("username", "nacos");
        properties.put("password", "nacos");
        properties.put("accessKey", "your-access-key");
        properties.put("secretKey", "your-secret-key");
        return properties;
    }
}    }`
`#// Nacos 2.2.0 支持基于角色的访问控制(RBAC)
@Configuration
public class NacosSecurityConfig {
    
    @Bean
    public Properties nacosProperties() {
        Properties properties = new Properties();
        properties.put("username", "nacos");
        properties.put("password", "nacos");
        properties.put("accessKey", "your-access-key");
        properties.put("secretKey", "your-secret-key");
        return properties;
    }
}}

九、总结

Nacos AP 架构通过以下机制实现高可用服务发现:

  1. Distro 协议:自举机制,无 Leader 单点故障
  2. 内存存储:高性能读写,异步持久化
  3. 增量同步:减少网络开销,提升同步效率
  4. 故障自愈:节点恢复后自动从其他节点拉取数据
  5. 健康检查:自动剔除不健康实例

AP 模式适用场景: - 服务注册与发现(非核心元数据) - 对可用性要求高于一致性 - 允许短暂的不一致窗口

CP 模式适用场景: - 配置中心(配置变更需要强一致) - 核心元数据存储(如 Leader 选举)


参考资料


标签:Nacos,服务发现,配置中心,AP架构,Distro协议

相关推荐
鬼先生_sir1 天前
SpringCloud-Nacos
spring cloud·nacos·java面试
@atweiwei5 天前
深入解析gRPC服务发现机制
微服务·云原生·rpc·go·服务发现·consul
ALex_zry5 天前
微服务架构下的服务发现与注册:gRPC服务治理实战
微服务·架构·服务发现
Samson Bruce6 天前
【Nacos】
nacos
七七powerful7 天前
运维养龙虾--Nacos 3.0 + MCP Router:打造 AI 原生应用的服务治理新范式
人工智能·nacos·nacos mcp
人间打气筒(Ada)8 天前
go:如何实现接口限流和降级?
开发语言·中间件·go·限流·etcd·配置中心·降级
赵丙双10 天前
多网卡微服务注册 IP/host 问题
微服务·eureka·nacos·consul·多网卡
一叶飘零_sweeeet15 天前
分布式协调双雄深度拆解:ZooKeeper 与 Nacos 从底层原理到生产实战全指南
分布式·zookeeper·nacos
一叶飘零_sweeeet16 天前
服务注册发现深度拆解:Nacos vs Eureka 核心原理、架构选型与生产落地
微服务·云原生·eureka·nacos·架构·注册中心