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 场景设计:
-
自举机制:每个节点平等,无 Leader 角色
-
增量同步:仅同步变更数据,减少网络开销
-
故障自愈:节点故障后自动从其他节点恢复数据
-
心跳续约:客户端定期续约,服务端定期清理过期实例
sequenceDiagram
participant P as Provider
participant N1 as Nacos Node 1
participant N2 as Nacos Node 2
participant N3 as Nacos Node 3P->>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 架构通过以下机制实现高可用服务发现:
- Distro 协议:自举机制,无 Leader 单点故障
- 内存存储:高性能读写,异步持久化
- 增量同步:减少网络开销,提升同步效率
- 故障自愈:节点恢复后自动从其他节点拉取数据
- 健康检查:自动剔除不健康实例
AP 模式适用场景: - 服务注册与发现(非核心元数据) - 对可用性要求高于一致性 - 允许短暂的不一致窗口
CP 模式适用场景: - 配置中心(配置变更需要强一致) - 核心元数据存储(如 Leader 选举)
参考资料
- Nacos 官方文档:https://nacos.io/zh-cn/
- Nacos GitHub 源码(2.2.0):https://github.com/alibaba/nacos/tree/2.2.0
- 《Spring Cloud Alibaba 微服务原理与实战》第4章:服务注册与发现
标签:Nacos,服务发现,配置中心,AP架构,Distro协议