soul源码阅读(十二)数据同步原理初认识

整体对soul插件有了个基本认识后,我们继续来研究下soul的数据同步是如何实现的?

原理分析

在了解soul数据同步原理前,不妨可以自己先试想下,要实现数据的同步,需要我们做些什么?

(1)网关如何从soul-admin去获取插件,规则,流量等数据?是通过什么样的方式去获取的?获取后数据是如何管理的?

(2)我们已经了解了插件,也知道插件流量规则是通过在admin页面上配置后动态实时的传给网关,网关根据这些规则来进行匹配路由的,那么admin页面配置后的数据是怎么传到网关的呢?

带着这些问题,我们阅读了官方文档:https://dromara.org/zh-cn/docs/soul/dataSync.html

下面带着两幅图做下原理分析:

从图中可以看出一个用户登录soul-admin管理台后,在页面上对规则,插件,流量等增删改查的配置操作后,会将这些规则数据保存到mysql数据库,同时会保存一份数据到配置服务中心(也是soul-admin模块),服务中心会通过推拉两种可能的方式推送给到网关,具体是推模式还是拉模式取决于配置,如何配置?再往下一个图介绍。网关在启动时,也是一样,会以推或者拉的方式去soul-admin去同步数据,并且保存到本地缓存中。

再来看一幅图:

从这幅图中可以看出soul-admin在规则,插件等相关的配置后会通过 EventPublisher 发出配置变更通知,由 EventDispatcher 处理该变更通知,然后根据配置的同步策略(http、weboscket、zookeeper),现在还增加了一种同步策略nacos,将配置发送给对应的事件处理器,以推或者拉的方式通知给到网关。

同步策略了解

zookeeper同步

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

websocket同步

websocket 和 zookeeper 机制有点类似,将网关与 admin 建立好 websocket 连接时,admin 会推送一次全量数据,后续如果配置数据发生变更,则将增量数据通过 websocket 主动推送给 soul-web。使用websocket同步的时候,特别要注意断线重连,也叫保持心跳。soul使用java-websocket 这个第三方库来进行websocket连接。

http长轮询

http 长轮询机制如上所示,

(1)soul-web 网关请求 admin 的配置服务,读取超时时间为 90s。

(2)http 请求到达 soul-admin 之后,并非立马响应数据,而是利用 Servlet3.0 的异步机制,异步响应数据。首先,将长轮询请求任务 LongPollingClient 扔到 BlocingQueue 中,并且开启调度任务,60s 后执行,这样做的目的是 60s 后将该长轮询请求移除队列,即便是这段时间内没有发生配置数据变更。

(3)如果这段时间内,管理员变更了配置数据,此时,会挨个移除队列中的长轮询请求,并响应数据,告知是哪个 Group 的数据发生了变更(我们将插件、规则、流量配置、用户配置数据分成不同的组)。网关收到响应信息之后,只知道是哪个 Group 发生了配置变更,还需要再次请求该 Group 的配置数据。

(4)当 soul-web 网关层接收到 http 响应信息之后,拉取变更信息(如果有变更的话),然后再次请求 soul-admin 的配置服务,如此反复循环。

nacos同步

由于官方文档未提到,暂时先留空,待阅读源码后,补齐这一块。

猜你喜欢

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