目标
-
Nacos简单介绍
- Nacos 关键特性
- Nacos 服务搭建启动
-
soul-admin nacos配置启动
- 添加Soul-Nacos依赖
- 修改yml配置文件
- 启动admin会看到Nacos网页上有四个数据
- 介绍Nacos在Admin启动流程
- DataSyncConfiguration初始化NacosBean
admin数据发生变动发布流程
总结
Nacos简单介绍
上图从特性、架构、业务、生态、优势、战略等六个方面介绍了Nacos的核心功能
- Nacos(Dynamic Naming and Configuration Service):从全称我们看得出来他是动态命令和配置服务,是Spring Cloud Alibaba的一个组件。
- Nacos数据模型Key由三元组唯一确定,Namespace默认是空串,公共命名空间(public),分组默认是DEFAUTL_GROUP
- Nacos致力于帮助我们发现、配置和管理微服务。Nacos提供了一组简单易用的特性集,帮助我们快速实现动态服务发现、服务配置、服务元数据及流量管理。
Nacos关键特性
- 服务发现和服务健康监测
- 动态配置服务
- 动态DNS服务
- 服务及其元数据管理
Nacos服务搭建启动
- Nacos server 下载二进制文件
- 解压执行
- 启动成功
Nacos 服务默认端口是8848,我们登陆localhost:8848/nacos 即可访问官方后台管理
- 登陆后台查看
后面我们启动admin/bootstrap 就可以看到有数据注册上来
Soul-Admin的Nacos配置启动
添加Soul-Nacos依赖
<dependency>
<groupId>com.alibaba.nacos</groupId>
<artifactId>nacos-client</artifactId>
<version>${nacos-client.version}</version>
</dependency>
修改yml配置文件
此处Soul默认只使用一种数据同步方式,所以将其他三种同步方式注释掉。只打开Nacos配置
启动admin会看到Nacos网页上有四个数据
注意点: 默认Nacos 是不会自动创建命名空间的,有些同学以为网页上看不到数据,就以为数据同步不起作用。经过测试这其实是Nacos展示这块没有根据发布数据来自动显示。如何做才能看到上图样子呢。
只需要点击命名空间,创建你配置文件配置的namespace的名称即可,本文namespace是1c10d748-af86-43b9-8265-75f487d20c6c。所以本文建立的命令为
介绍Nacos 在Admin启动流程
DataSyncConfiguration 初始化NacosBean
- 初始化DataChangedListener 数据监听器
这里只是初始化Nacos客户端和监听数据监听器
- 检查是否对Nacos数据进行上报
这里之前未做检查,其实我觉得没必要做检查,毕竟Nacos是全量更新,就算一开始拿不到数据,在后期数据变更时候,可以做一次全量更新。
admin 数据发生变动发布流程
@Override
public void onPluginChanged(final List<PluginData> changed, final DataEventTypeEnum eventType) {
// 这里进来先获取Nacos对应的数据,是考虑到多个admin,adminA 改了 adminB如何取到A改的值,这里就在adminB未重启的情况下,只要发生变化,就会重新拉取Nacos 的数据,来保证admin之间的数据同步
updatePluginMap(getConfig(NacosPathConstants.PLUGIN_DATA_ID));
switch (eventType) {
case DELETE:
changed.forEach(plugin -> PLUGIN_MAP.remove(plugin.getName()));
break;
case REFRESH:
case MYSELF:
Set<String> set = new HashSet<>(PLUGIN_MAP.keySet());
changed.forEach(plugin -> {
set.remove(plugin.getName());
PLUGIN_MAP.put(plugin.getName(), plugin);
});
PLUGIN_MAP.keySet().removeAll(set);
break;
default:
changed.forEach(plugin -> PLUGIN_MAP.put(plugin.getName(), plugin));
break;
}
publishConfig(NacosPathConstants.PLUGIN_DATA_ID, PLUGIN_MAP);
}
总结
今天收获很大,由原来的的单机编程想法往集群方向的开发突破,Nacos 在集群环境下,admin端是如何知道A改了数据B端如何知道。使用Nacos 作为中间媒介,并且对应端数据发生变化先获取媒介上当前最新数据,然后在获取自己关心的数据,进行发布更新。