soul源码阅读(十六)zookeeper bootstrap同步

目录

zookeeper watch机制

运行bootstrap的zookeeper同步

zookeeper bootstrap源码调试及解析

总结


zookeeper watch机制

根据官网我们了解到网关是通过zookeeper 的 watch 机制去监听节点信息,并且启动的时候会读取一次全量信息,之后每次增量读取更新,那么我们先来对watch机制做下了解。

Watch的整体流程如下图所示,客户端先向ZooKeeper服务端成功注册想要监听的节点状态,同时客户端本地会存储该监听器相关的信息在WatchManager中,当ZooKeeper服务端监听的数据状态发生变化时,ZooKeeper就会主动通知发送相应事件信息给相关会话客户端,客户端就会在本地响应式的回调相关Watcher的Handler。

运行bootstrap的zookeeper同步

soul-bootstrap模块的pom.xml引入soul-spring-boot-starter-sync-data-zookeeper

配置application-local.yml的zookeeper信息如下:

启动SoulBootstrapApplication,运行如下:

zookeeper bootstrap源码调试及解析

ZookeeperSyncDataConfiguration初始化zkClient和ZookeeperSyncDataService。

我们看到初始化监听data,appAuth,metaData等方法。

调试进入watcherData()方法查看,以插件会例,会遍历循环所有插件,然后watcherAll,并且该方法会对/soul/plugin注册一个事件监听。

我们继续调试,可以发现cachePluginData应该就是获取真实数据的缓存操作了,同时也会注册一个监听。

最终进入到该方法里拿到zk节点的数据,进行本地的缓存操作。而且跟踪完全流程可以发现启动初始化会拿zk下soul所有节点的数据缓存更新到本地。

接下来我们看下admin修改plugin的开关后,同步到zk,网关是如何用watch机制进行增量更新的,操作如下:

看到bootstrap端收到zk给的通知后进入到handleDataChange,然后也是一样的流程,会将通知状态有变更的数据缓存到本地。

总结

原理和websocket基本一致哈,不同的地方在于zookeeper作为中间代理做了数据的缓存,如果出现断线的情况,zk会再次将有变更的数据给通知到网关,看起来更可靠些。

猜你喜欢

转载自blog.csdn.net/he_cha_bu/article/details/113407932