话不多说,上来就干
这一篇我们从源码角度来分析一下在配置websocket通信协议下,soul网关的管理后台如何动态的同步数据到soul网关的。
本篇所指的同步数据,是soul网关管理后台页面修改配置数据,数据同步到soul网关的核心服务,并且更新存于本地缓存的相关配置信息这一过程。
由于网关处于通信链路的特殊位置,需要插件的可插拔等特性,动态配置数据且实时生效是一个优秀网关必须的特性之一,soul网关的配置数据支持动态修改,所以了解soul网关的配置数据同步,也是非常有必要的。
先上官网的同步数据链路图
从图中,我们可以大致了解到,管理后台admin的数据修改->事件发布器->数据更新事件分发器->websocket->websocket缓存处理器->soul网关本地缓存
我们就从这几点来进行源码分析
基本准备
启动soul-admin服务,配置文件soul.sync.websocket.enabled=true
启动soul-bootstrap服务,配置文件soul.sync.websocket.urls: ws://localhost:9095/websocket,这个urls是指soul-amdin的ip地址
修改admin管理数据
随便修改一个配置数据weight,点击sure
可以看到是请求的/selector/{id}这个接口
事件发布器
进入soul-admin的服务代码中,找到selector相关的controller层和方法
SelectorController.updateSelector(@PathVariable("id") final String id, @RequestBody final SelectorDTO selectorDTO)
其中关键代码是 selectorService.createOrUpdate(selectorDTO),点进去,找到发布方法
发布方法中调用的是soul自己定义的数据改变事件
DataChangedEvent
这个数据改变事件的构造方法中,有两个关键参数:
eventType:事件类型(增删改查等事件操作动作)
groupKey:事件分组key(即soul中自定义一些模块组划分,包含权限,插件,选择器等等)
最终通过spring的上下文支持发布事件
数据更新事件分发器
在soul-admin中,DataChangedEventDispatcher分发器实现了应用监听器,监听事件
switch到selector,最终还是通过websocket的send方法,发送数据
websoket
soul数据同步中心通过监听websocket,获得事件数据
然后通过 websocketDataHandler.executor(groupEnum, json, eventType)执行同步
websocket缓存处理器
在选择器数据处理器的doUpdate方法中,调用订阅方法
最终通过订阅方法CommonPluginDataSubscriber.subscribeDataHandler()处理更新本地配置数据缓存
soul网关本地缓存
调用submit方法调用本地缓存
本篇的soul源码追踪就到这里,很多地方还是比较粗糙,需要进一步debug进去查看,希望读者能指出我的错误或者不足之处,以自省