目录
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会再次将有变更的数据给通知到网关,看起来更可靠些。