一、前戏
基于zookeeper的watch机制实现
科普贴:https://blog.csdn.net/z69183787/article/details/53023578
https://blog.csdn.net/artaganan8/article/details/92771483
- soul-web会监听配置的节点
- soul-admin 在启动的时候,会将数据全量写入 zookeeper
- 后续数据发生变更时,会增量更新 zookeeper 的节点,与此同时
- soul-web 会监听配置信息的节点,一旦有信息变更时,会更新本地缓存
简单粗暴的说,就是推--拉,会把元数据存到zookeeper中,soul-admin本地有变化就推送zookeeper,soul-web 监听有变化就拉
二、配置
- 网关配置
<dependency>
<groupId>org.dromara</groupId>
<artifactId>soul-spring-boot-starter-sync-data-zookeeper</artifactId>
<version>${last.version}</version>
</dependency>
soul :
sync:
zookeeper:
url: localhost:2181
sessionTimeout: 5000
connectionTimeout: 2000
#url: 配置成你的zk地址,集群环境请使用(,)分隔
- soul-admin
soul:
sync:
zookeeper:
url: localhost:2181
sessionTimeout: 5000
connectionTimeout: 2000
- soul-admin配置功能监听
在DataSyncConfiguration类中配置实现了DataChangedListener接口的zookeeperDataChangedListener,对本地功能导致的元数据变化进行事件监控
- soul-admin配置启动全量加载
ZookeeperDataInit类中基于CommandLineRunner接口实现容器启动之后,加载实现类的逻辑资源,已达到完成资源初始化、配置全量推送的任务
image.png三、数据发送
- 通过DataChangedEventDispatcher调度者负责分发处理时间,匹配到对应的监听器
public void onApplicationEvent(final DataChangedEvent event) {
for (DataChangedListener listener : listeners) {
switch (event.getGroupKey()) {
case APP_AUTH:
listener.onAppAuthChanged((List<AppAuthData>) event.getSource(), event.getEventType());
break;
case PLUGIN:
listener.onPluginChanged((List<PluginData>) event.getSource(), event.getEventType());
break;
case RULE:
listener.onRuleChanged((List<RuleData>) event.getSource(), event.getEventType());
break;
case SELECTOR:
listener.onSelectorChanged((List<SelectorData>) event.getSource(), event.getEventType());
break;
case META_DATA:
listener.onMetaDataChanged((List<MetaData>) event.getSource(), event.getEventType());
break;
default:
throw new IllegalStateException("Unexpected value: " + event.getGroupKey());
}
}
}
- 同步策略需要实现 DataChangedListener 接口 , 如:ZookeeperDataChangedListener
在ZookeeperDataChangedListener内部基于zkClient的api将数据同步到zookeeper中
image.png- 同步到zk中的数据,因序列化原因并不是完全明文的
如果是规则删除事件,对应需要删除 zk 节点,其他更新或者新建规则对应增加 zk 节点;
四、数据接收
数据同步接收,需实现SyncDataService接口,如:ZookeeperSyncDataService
通过使用zkclient,基于watch机制,监控数据变化,将zookeeper同步到本地缓存中。
image.png五、小结
- 了解了CommandLineRunner接口加载机制,spring的小知识又增长了一发
- 了解了zk的watch机制,后文会深入了解下原理
- 日拱一卒,每天进步一点点
网友评论