Nacos 是一款发现、配置和微服务管理工具。它提供了一组简单易用的特性集,可以快速实现动态服务发现、服务配置、服务元数据及流量管理。
安装启动好 Nacos 后,修改对应的 soul-admin 和 soul-bootstrap 中的配置:
soul:
file:
enabled: true
corss:
enabled: true
dubbo :
parameter: multi
sync:
# websocket :
# urls: ws://localhost:9095/websocket
nacos:
url: localhost:8848
namespace: 1c10d748-af86-43b9-8265-75f487d20c6c
在 soul-bootstrap 的 pom.xml 中加入依赖:
<dependency>
<groupId>org.dromara</groupId>
<artifactId>soul-spring-boot-starter-sync-data-nacos</artifactId>
<version>${project.version}</version>
</dependency>
启动 soul-admin 和 soul-bootstrap,发现 soul-bootstrap 无法启动,原因是在 NacosCacheHandler 类中,以下代码处:
protected void updateMetaDataMap(final String configInfo) {
try {
//这里会抛出 NullPointerException ,因为暂时没有实现 Nacos 的数据初始化。
List<MetaData> metaDataList = new ArrayList<>(GsonUtils.getInstance().toObjectMap(configInfo, MetaData.class).values());
metaDataList.forEach(metaData -> metaDataSubscribers.forEach(subscriber -> {
subscriber.unSubscribe(metaData);
subscriber.onSubscribe(metaData);
}));
} catch (JsonParseException e) {
log.error("sync meta data have error:", e);
}
}
只能在 Nacos 后台手动添加初始化数据,需要分别添加 元数据 和 认证的数据。详细的解决办法可以参考 soul 网关入门篇(七):数据同步方式- nacos 配置
2021-01-24 02:15:31.175 INFO 90111 --- [ main] d.s.s.s.s.d.n.NacosSyncDataConfiguration : you use nacos sync soul data......
看到这个代表已经成功使用 Nacos 同步数据了。
看一下 Nacos 的管理端情况,发现并没有数据,但是在 NacosDataChangedListener 打断点后点击同步数据的话,是能进到 对应的函数的:
由于缺乏对 Nacos 的认知,我决定暂时蒙在鼓里。
Nacos 同步配置信息的逻辑非常简单,就是运用了 Nacos 中的 ConfigService:
//从Nacos配置服务获取配置
@SneakyThrows
private String getConfig(final String dataId) {
String config = configService.getConfig(dataId, GROUP, 6000);
return StringUtils.hasLength(config) ? config : EMPTY_CONFIG_DEFAULT_VALUE;
}
//发布数据到Nacos配置服务
@SneakyThrows
private void publishConfig(final String dataId, final Object data) {
configService.publishConfig(dataId, GROUP, GsonUtils.getInstance().toJson(data));
}
在 Nacos 管理端添加对应的 namespace,对应soul-admin 和 soul-bootstrap 配置中的 namespace:
再次查看配置管理,发现已经有了对应的配置数据json了。
总结
Nacos 有个独立的配置管理服务 ConfigService,如果要了解为什么在 Nacos 后台中看不到任何数据和节点,还需要深入了解 Nacos 配置服务的实现原理才行。用 Nacos 做数据同步跟Zookeeper 是同样的问题,需要维护额外的中间件造成维护成本的提升。