点击上方蓝字关注不迷路
前言
上一篇讲到了Soul使用websocket进行数据同步的流程以及源码解析等,我们从官网得知,其数据同步我们可以配置websocket、zookeeper、http长轮询。那么本篇我们就来看一下Soul是如何使用zookeeper进行数据同步的。
数据同步流程
用户可以在 soul-admin 后台任意修改数据,并马上同步到网关的jvm内存中。同步soul的插件数据,选择器,规则数据,元数据,签名数据等等。所有插件的选择器,规则都是动态配置,立即生效,不需要重启服务。
zookeeper环境搭建
拉取镜像
Docker version 19.03.8
duansiguodeMacBook-Pro:dromara duansg$ docker pull zookeeper28ffb774bc32duansiguodeMacBook-Pro:dromara duansg$ docker imagesREPOSITORY TAG IMAGE ID CREATED SIZEzookeeper latest 28ffb774bc32 1 days ago 253MB
运行
docker run
duansiguodeMacBook-Pro:dromara duansg$ docker run --privileged=true -d --name zookeeper --publish 2181:2181 -d zookeeper:latesta06e5b932cca84bc7bc78af5187b38ceaa03e66a87212d147c30b36ce2a92c69
查看运行状态
docker ps or docker ps -a
duansiguodeMacBook-Pro:dromara duansg$ docker psCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMESa06e5b932cca zookeeper:latest "/docker-entrypoint.…" 4 hours ago Up 4 hours 2888/tcp, 3888/tcp, 0.0.0.0:2181->2181/tcp, 8080/tcp zookeeper
到此你的zookeeper环境就搭建好了,是不是很简单?
Soul-admin同步配置
yml文件配置
需要开启zookeeper同步,然后重启服务即可
soul: sync: # websocket: # enabled: true zookeeper: url: localhost:2181 sessionTimeout: 5000 connectionTimeout: 2000
网关配置
依赖配置
开启zk同步
<dependency> <groupId>org.dromaragroupId> <artifactId>soul-spring-boot-starter-sync-data-zookeeperartifactId> <version>${project.version}version>dependency>
yml文件配置
设置zk地址以及超时时间,然后重启服务
soul : sync:# websocket :# urls: ws://127.0.0.1:9095/websocket zookeeper: url: localhost:2181 sessionTimeout: 5000 connectionTimeout: 2000
数据同步原理概述
基于 zookeeper的同步原理很简单,主要是依赖zookeeper的 watch 机制,soul-web 会监听配置的节点,soul-admin在启动的时候,会将数据全量写入zookeeper,后续数据发生变更时,会增量更新 zookeeper 的节点,与此同时,soul-web会监听配置信息的节点,一旦有信息变更时,会更新本地缓存。
数据同步源码解析
上篇文章说了DataChangedEventDispatcher为数据同步的事件分发器,它根据操作的不同的类型进行不同的同步数据方式的分发,下面我们来回顾一下。我们以一个插件的更新为例。
既然我们使用了zookeeper作为数据同步的方式,其必然需要引入ZookeeperDataChangedListener,因为我们开启了数据同步方式的配置为sync.zookeeper,同样的套路直接找到自动装配的类
①:根据配置zk的地址、会话超时时间、连接超时构建zk客户端。
下一步来看一下,具体的数据更新事件推送到ZookeeperDataChangedListener以后是如何做处理的
①:遍历需要更新的插件②:根据插件名称,组装zk的节点信息,例如/plugin/sofa③:如果是删除类型④:否则需要创建或者更新zk节点
①:判断节点目录是否存在②:创建持久节点③:修改节点信息节点名称、节点值
到此,数据推送写入到zk的流程就是这么简单。
数据监听源码分析
zk数据分析
在查看数据监听原理之前,我们先来看一下zk的节点信息,看看都包含了哪些节点信息
查看zk容器
duansiguodeMacBook-Pro:dromara duansg$ docker psCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMESa06e5b932cca zookeeper:latest "/docker-entrypoint.…" 6 hours ago Up 6 hours 2888/tcp, 3888/tcp, 0.0.0.0:2181->2181/tcp, 8080/tcp zookeeper
进入zk容器
duansiguodeMacBook-Pro:dromara duansg$ docker exec -it a06e5b932cca /bin/bash
通过zk客户端连接
root@a06e5b932cca:/apache-zookeeper-3.6.2-bin# cd binroot@a06e5b932cca:/apache-zookeeper-3.6.2-bin/bin# ./zkCli.sh//.....省略信息WATCHER::WatchedEvent state:SyncConnected type:None path:null[zk: localhost:2181(CONNECTED) 0]
遍历节点目录
[zk: localhost:2181(CONNECTED) 0] ls /[soul, zookeeper][zk: localhost:2181(CONNECTED) 1] ls /soul[auth, metaData, plugin, rule, selector]
metaData
[zk: localhost:2181(CONNECTED) 3] ls /soul/metaData[%2Fdubbo%2FbatchSave, %2Fdubbo%2FbatchSaveAndNameAndId, %2Fdubbo%2FfindByArrayIdsAndName, %2Fdubbo%2FfindByIdsAndName, %2Fdubbo%2FfindByListId, %2Fdubbo%2FfindByStringArray, %2Fdubbo%2FsaveComplexBeanTest, %2Fdubbo%2FsaveComplexBeanTestAndName, %2Fsofa%2FfindAll, %2Fsofa%2FfindById, %2Fsofa%2Finsert, %2Fspringcloud%2F**
plugin
[zk: localhost:2181(CONNECTED) 4] ls /soul/plugin[context_path, divide, dubbo, hystrix, monitor, rate_limiter, resilience4j, rewrite, sentinel, sign, sofa, springCloud, tars, waf[zk: localhost:2181(CONNECTED) 1] get /soul/plugin/divide��sr&org.dromara.soul.common.dto.PluginData4%3��21LconfigtLjava/lang/String;LenabledtLjava/lang/Boolean;Lidq~Lnameq~LroletLjava/lang/Integer;xppsrjava.lang.Boolean� r�՜��Zvaluexpt5tdividesrjava.lang.Integer⠤���8Ivaluexrjava.lang.Number���
rule
[zk: localhost:2181(CONNECTED) 5] ls /soul/rule[context_path, divide, dubbo, hystrix, monitor, rate_limiter, resilience4j, rewrite, sentinel, sign, sofa, springCloud, tars, waf
selector
[zk: localhost:2181(CONNECTED) 6] ls /soul/selector[context_path, divide, dubbo, hystrix, monitor, rate_limiter, resilience4j, rewrite, sentinel, sign, sofa, springCloud, tars, war
查找自动装配信息
因为网关引入了soul-spring-boot-starter-sync-data-zookeeper的依赖,直接通过此依赖找到自动配置类
①:根据配置zk的地址、会话超时时间、连接超时构建zk客户端ZkClient。②:获取ZkClient上下文的可用实例、插件数据缓存订阅处理器、元数据缓存订阅处理器、认证缓存订阅处理器来构建zk数据同步服务
①:初始化观察数据方法②:初始化观察认证方法③:初始化观察数元数据方法
我们拿watcherData举例说明,其他方法同理。
①:获取插件zk节点目录②:获取此目录下的子节点③:根据插件名称,观察此插件的所有的插件节点、选择器节点、规则节点④:添加插件节点目录监听事件,当子节点变更事件,当前节点下有新增、删除子节点时触发
①:观察插件事件②:观察选择器事件③:观察规则事件
①:组装插件节点目录②:判断节点目录是否存在③:不存在就创建持久节点***④:读取节点信息,并缓存节点信息⑤:监听节点修改事件
到此数据监听同步的流程就完了,是不是很简单?当然其中还有很多细节还待挖掘,其存入本地缓存的策略等等,后续我们来一步步完善它。