本文是数据同步 zookeeper 系列的第二篇文章,主要讲从代码出发,讲解数据怎么从启动,到更新操作等,是怎么同步到网关端的流程。
前文概要性的介绍了 zookeeper 的概念和它的主要特性,介绍了 Soul 网关是怎么配置 Zookeeper 的。
admin 端
admin 启动时
2021-01-25 23:00:40.661 INFO 32864 --- [-localhost:2181] org.I0Itec.zkclient.ZkEventThread : Starting ZkClient event thread.
...
2021-01-25 23:00:40.692 INFO 32864 --- [ main] org.apache.zookeeper.ZooKeeper : Initiating client connection, connectString=localhost:2181 sessionTimeout=5000 watcher=org.I0Itec.zkclient.ZkClient@4eb9ae4d
...
2021-01-25 23:02:06.010 ERROR 32864 --- [upstream-task-1] o.d.s.a.s.impl.UpstreamCheckService : check the url=192.168.0.1:22 is fail
从日志中得出,启动后会有心跳检测。接下来注意看 zooInspector 连接 Zookeeper 的变化,
由此可以看出,Zookeeper 的方式是有初始化数据的功能的。对比之前的 nacos 是没有,现在的 nacos 已经有了,详见 issue1052。
查看源码得出,在启动时 admin 会注入 ZkClient
和 ZookeeperDataInit
,DataChangedListener
的 Bean。这里的 ZookeeperDataInit 就是初始化 Zookeeper 中数据的。 ZookeeperDataChangedListener
实现了 DataChangedListener
。 大致流程图如下:
admin 更新数据时
打开 admin 的管理后台,配置信息时,会发布一个 DataChangedEvent,DataChangedListener 就会监听到此时的变化,从而做出相应的变化。大致的流程图如下图所示:
之前一直没有注意到点的是:PluginTransfer 是一个接口, 而这个接口的实现类都是怎么来的。 这里用了一个插件 mapstruct
admin 的基本分析完了, 它的主要职责是将数据同步到 Zookeeper 上。不管刚启动还是启动后它就会触发 DataChangedEvent 事件,然后经过一系列的操作, 最后由 ZkClient 将数据同步到 Zookeeper。 总体来说,流程比较简单。