美文网首页
soul从入门到放弃9--zookeeper数据同步

soul从入门到放弃9--zookeeper数据同步

作者: 滴流乱转的小胖子 | 来源:发表于2021-01-24 07:11 被阅读0次

一、前戏

基于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 会监听配置信息的节点,一旦有信息变更时,会更新本地缓存
image.png

简单粗暴的说,就是推--拉,会把元数据存到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中的数据,因序列化原因并不是完全明文的
image.png

如果是规则删除事件,对应需要删除 zk 节点,其他更新或者新建规则对应增加 zk 节点;

四、数据接收

数据同步接收,需实现SyncDataService接口,如:ZookeeperSyncDataService

通过使用zkclient,基于watch机制,监控数据变化,将zookeeper同步到本地缓存中。

image.png

五、小结

  • 了解了CommandLineRunner接口加载机制,spring的小知识又增长了一发
  • 了解了zk的watch机制,后文会深入了解下原理
  • 日拱一卒,每天进步一点点

相关文章

网友评论

      本文标题:soul从入门到放弃9--zookeeper数据同步

      本文链接:https://www.haomeiwen.com/subject/uqgpzktx.html