文章目录
分析前准备
环境配置
- soul-admin配置
soul:
database:
dialect: mysql
init_script: "META-INF/schema.sql"
init_enable: true
sync:
nacos:
url: localhost:8848
namespace: 1c10d748-af86-43b9-8265-75f487d20c6c
acm:
enabled: false
endpoint: acm.aliyun.com
namespace:
accessKey:
secretKey:
- soul-bootstrap配置
soul :
file:
enabled: true
corss:
enabled: true
dubbo :
parameter: multi
sync:
nacos:
url: localhost:8848
namespace: 1c10d748-af86-43b9-8265-75f487d20c6c
acm:
enabled: false
endpoint: acm.aliyun.com
namespace:
accessKey:
secretKey:
pom文件需要引入如下依赖
<dependency>
<groupId>org.dromara</groupId>
<artifactId>soul-spring-boot-starter-sync-data-zookeeper</artifactId>
<version>${project.version}</version>
</dependency>
nacos启动单实例
- 下载nacos,版本号为1.4.1,详见nacos官网
- 启动nacos,可参考官网快速开始部分,有两种启动方式集群和非集群方式,本篇默认以非集群方式启动(仅测试环境使用),启动命令如下:
cd nacos/bin
sh startup.sh -m standalone
启动成功后,默认在8848端口运行,访问http://localhost:8848/nacos/#/login,默认用户名和密码nacos/nacos
3. 启动soul-admin后,手动刷新插件后信息后,配置不能同步至nacos,需要在nacos设置命名空间,并将命名空间对应的id(由nacos自动生成)设置到soul-boostrap和soul-admin中,然后重启再次刷新,配置信息,可以发现插件信息已同步至nacos中
命名空间的设置如图:
同步后的信息如图:
需要注意的是,rule和selector等相关信息,并未同步,手动刷新也不能同步,必须相关规则有发生变更才能同步。经过分析得出以下结论,soul-amdin有两块手动同步的操作:
(1)plugin的同步
(2)plugin内部的selector和rule的同步
先分析soul-admin已经提前有数据,而nacos没有数据的情况,
手动同步plugin可以同步成功,同步内部selector和rule并没有成功,需要手动变更才能成功,因此可以猜测plugin没有缓存,同步时直接从数据库读取同步,selector和rule在admin内部有缓存,同步时会先判断数据库与缓存是否一致,不一致才会同步,一致不同步,所以直接点击同步按钮,并不会同步,没有发生变更,想要同步成功需要改变规则。
接着分析soul-admin没有任何数据,即应用还未将注册信息注册到soul-admin,此时soul-admin和nacos都开启,接着启动examples示例,可以发现,首次注册时,会触发selector和rule同步操作
关于zookeeper在soul-admin在启动时会有全量同步的操作,而nacos没有,猜测可能是zookeeper是将数据存在内存中,重启有丢失的风险,而nacos没有,是因为nacos有自己单独的存储策略,重启不会丢失,待后续验证
数据同步过程
目前版本boot-admin启动后并不会主动向nacos推送配置中心,需要在soul-admin中进行手动全量同步,才会将配置信息推送给nacos,soul-bootsrap启动后会自动watch对应分组信息,当有数据变更后,会及时收到对应信息,整个过程类似zookeeper
源码分析
-
soul-admin在得到配置信息改变的情况下,会通过事件分发程序调用对应的DataChangedListener,此处对应NacosDataChangedListener,关键代码如下:
-
在将发生变化的配置信息组装成nacos所需的格式,通过publishConfig主动向nacos推送配置,对应代码如下:
调用nacos提供的api向服务器推送其配置信息 -
soul-bootstrap启动之后,会触发注册监听nacos流程,关键代码如下:
watchData的实现逻辑如下:
其实就是注册监听程序,通过回调函数来处理接收到的配置信息