bin获取实例 zk_高性能网关Soul源码解析【数据同步zk】

fc54ad46219897ada28832dba92a6711.png

点击上方蓝字关注不迷路

f1f6c229f6a88e93dc58d88372d49c86.gif

前言

上一篇讲到了Soul使用websocket进行数据同步的流程以及源码解析等,我们从官网得知,其数据同步我们可以配置websocket、zookeeper、http长轮询。那么本篇我们就来看一下Soul是如何使用zookeeper进行数据同步的。

数据同步流程

用户可以在 soul-admin 后台任意修改数据,并马上同步到网关的jvm内存中。同步soul的插件数据,选择器,规则数据,元数据,签名数据等等。所有插件的选择器,规则都是动态配置,立即生效,不需要重启服务。

460ecaefa1c217e65e2cfb91de5d53a1.png

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

b86032264222001169514aacc0aa16b3.png

网关配置

依赖配置

开启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

52d4ebdfa62270738598b0b86434b67b.png

数据同步原理概述

基于 zookeeper的同步原理很简单,主要是依赖zookeeper的 watch 机制,soul-web 会监听配置的节点,soul-admin在启动的时候,会将数据全量写入zookeeper,后续数据发生变更时,会增量更新 zookeeper 的节点,与此同时,soul-web会监听配置信息的节点,一旦有信息变更时,会更新本地缓存。 

数据同步源码解析

上篇文章说了DataChangedEventDispatcher为数据同步的事件分发器,它根据操作的不同的类型进行不同的同步数据方式的分发,下面我们来回顾一下。我们以一个插件的更新为例。

5678eafdac3931bf9d31d130039a2ca9.png e805f7c300a7f5f12e47cd542878d0e2.png

99ec9ba6b5802858873ffb0d386b6d55.png

既然我们使用了zookeeper作为数据同步的方式,其必然需要引入ZookeeperDataChangedListener,因为我们开启了数据同步方式的配置为sync.zookeeper,同样的套路直接找到自动装配的类

d73deef089d3e56d4877a0c5205f2674.png

a65831ce37e9536454c501676a92e7c1.png

①:根据配置zk的地址、会话超时时间、连接超时构建zk客户端。

下一步来看一下,具体的数据更新事件推送到ZookeeperDataChangedListener以后是如何做处理的

d5489d8d25337de0f8bfece3b480c6d6.png

①:遍历需要更新的插件②:根据插件名称,组装zk的节点信息,例如/plugin/sofa③:如果是删除类型④:否则需要创建或者更新zk节点

92123a3675e6b8835a3e9865b999e81d.png

①:判断节点目录是否存在②:创建持久节点③:修改节点信息节点名称、节点值

到此,数据推送写入到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的依赖,直接通过此依赖找到自动配置类

2aa070bbd6f86b09b0c715716da0a084.png

①:根据配置zk的地址、会话超时时间、连接超时构建zk客户端ZkClient。②:获取ZkClient上下文的可用实例、插件数据缓存订阅处理器、元数据缓存订阅处理器、认证缓存订阅处理器来构建zk数据同步服务

4b72498decd332540357e38923ae37db.png

①:初始化观察数据方法②:初始化观察认证方法③:初始化观察数元数据方法

我们拿watcherData举例说明,其他方法同理。

b707dadc00f40fda741bd18a61d62373.png

①:获取插件zk节点目录②:获取此目录下的子节点③:根据插件名称,观察此插件的所有的插件节点、选择器节点、规则节点④:添加插件节点目录监听事件,当子节点变更事件,当前节点下有新增、删除子节点时触发

9d9de85d21aa66d0f389e7b807a485f6.png

①:观察插件事件②:观察选择器事件③:观察规则事件

293b581d4114f787e490b6dca7adf578.png

①:组装插件节点目录②:判断节点目录是否存在③:不存在就创建持久节点***④:读取节点信息,并缓存节点信息⑤:监听节点修改事件

6e3e1096c9b32df83b849e9c4ea1330b.png

到此数据监听同步的流程就完了,是不是很简单?当然其中还有很多细节还待挖掘,其存入本地缓存的策略等等,后续我们来一步步完善它。

30da964acafe723c30b53494d8b2af1f.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值