Soul网关(6) - 同步数据之Websocket

802 阅读2分钟

话不多说,上来就干

这一篇我们从源码角度来分析一下在配置websocket通信协议下,soul网关的管理后台如何动态的同步数据到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进去查看,希望读者能指出我的错误或者不足之处,以自省