如何实现配置在集群间同步的?
前提步骤部署MySQL,并执行sql脚本创建nacos schema
参照官网的nacos集群部署指南——nacos 集群部署指南
启动nacos集群
开始设置在集群中任意登陆一台nacos server节点,然后创建配置
再次登陆其余节点,会发现配置信息已经同步到其余的节点中了
配置信息如何在集群间同步?
其实,这个配置信息同步是很简单的——直接从MySQL中读取就好了,在集群模式下,nacos-server需要使用数据库进行存储config配置信息,然后其他nacos-server config节点直接从数据库中读取即可1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32(params = "search=accurate", method = RequestMethod.GET)
public Page (HttpServletRequest request,
HttpServletResponse response,
@RequestParam("dataId") String dataId,
@("group") String group,
@RequestParam(value = "appName", required = false) String appName,
@RequestParam(value = "tenant", required = false,
defaultValue = StringUtils.EMPTY) String tenant,
@RequestParam(value = "config_tags", required = false) String configTags,
@RequestParam("pageNo") int pageNo,
@RequestParam("pageSize") int pageSize){
Map configAdvanceInfo = new HashMap(100);
if (StringUtils.isNotBlank(appName)) {
configAdvanceInfo.put("appName", appName);
}
if (StringUtils.isNotBlank(configTags)) {
configAdvanceInfo.put("config_tags", configTags);
}
try {
return persistService.findConfigInfo4Page(pageNo, pageSize, dataId, group, tenant,
configAdvanceInfo);
} catch (Exception e) {
String errorMsg = "serialize page error, dataId=" + dataId + ", group=" + group;
log.error(errorMsg, e);
throw new RuntimeException(errorMsg, e);
}
}
CommunicationController的作用
既然部署了nacos-server config集群,那么nacos-client连接的时候,基本上都是写上nacos-server cluster集群下所有节点的IP地址信息,那么这里就会有一个问题了,假设现在有三台nacos-server-config,分别为nacos-A/nacos-B/nacos-C,同时有一个nacos-client,它连接到了nacos-A,但是运维的同学,却在nacos-B进行了配置发布,那么nacos-client要怎么才能获取到最新的配置信息,换句话说,nacos-A要怎么才能知道配置已经更新了?这个时候CommunicationController的作用就体现出来了
CommunicationController是用于其他节点通知的控制器,是被动接受配置更新通知的。那么,这个通知是怎么发出的呢?这个时候回到ConfigController.publishConfig关键代码1
2
3
4
5
6
7
8
9
10
11
12
13
14
15if (StringUtils.isBlank(betaIps)) {
if (StringUtils.isBlank(tag)) {
// 配置信息持久化存储
persistService.insertOrUpdate(srcIp, srcUser, configInfo, time, configAdvanceInfo, false);
// 进行事件发布
EventDispatcher.fireEvent(new ConfigDataChangeEvent(false, dataId, group, tenant, time.getTime()));
} else {
persistService.insertOrUpdateTag(configInfo, tag, srcIp, srcUser, time, false);
EventDispatcher.fireEvent(new ConfigDataChangeEvent(false, dataId, group, tenant, tag, time.getTime()));
}
} else {
// beta publish,配置信息灰度发布
persistService.insertOrUpdateBeta(configInfo, betaIps, srcIp, srcUser, time, false);
EventDispatcher.fireEvent(new ConfigDataChangeEvent(true, dataId, group, tenant, time.getTime()));
}