整体对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同步
由于官方文档未提到,暂时先留空,待阅读源码后,补齐这一块。