前言
- 在之前的文章中说到了soul的http长轮询数据同步策略,这次说一下另一个跟http有点关系的同步策略websocket,websocket策略与长轮询相反,它是admin主动向网关push数据,在官网的文章中,也介绍了websocket的同步原理,结合官网的文章看一下websocket的整体同步流程。
连接建立
在我们将网关同步策略配置为websocket后,启动项目,加载我们在网关配置的同步策略
1 | soul : |
之后会向目标地址建立websocket连接,在建立websocket连接的时候,会对每个连接设置30s间隔的断线重连,具体代码如下
1 | public WebsocketSyncDataService(final WebsocketConfig websocketConfig, |
主动Push
- 此时web与admin的连接就建立完成了,只需要等待admin发生修改操作,将数据push到web更新本地缓存就好,我们来看看admin的push过程,以及web收到通知后的操作,在admin修改一个配置提交,定位到PluginServiceImpl#createOrUpdate方法。
1 | public String createOrUpdate(final PluginDTO pluginDTO) { |
在admin中,与其他的数据同步策略处理一样,都是通过Spring事件发布机制处理,看下最终通过DataChangedEventDispatcher定位到的方法
1 | public void onPluginChanged(final List<PluginData> pluginDataList, final DataEventTypeEnum eventType) { |
通过listener定位到了websocketDataChangedListener中,之后通过WebsocketCollector#send方法发送数据,看看WebsocketCollector#send方法
1 | public static void send(final String message, final DataEventTypeEnum type) { |
- 在admin通过websocket发送之后,SoulWebsocketClient#onMessage接收数据最终在handleResult方法进行处理
1 | private void handleResult(final String result) { |
- 然后定位到了AbstractDataHandler中的handle方法(又是一个运用了模版模式的地方)
1 | public void handle(final String json, final String eventType) { |
- 我们修改插件,因此是Plugin类型,最终定位到了PluginDataHandler#doUpdate方法
1 | protected void doUpdate(final List<PluginData> dataList) { |
1 | // 比如divide插件,就只充血了3个方法,其余的都是用接口默认方法。 |
结尾
- 到这里,websocket的数据同步策略一次具体的同步流程就完成了,soul在进行设计的时候进行了高度抽象,大部分的代码都做到了复用,具体的功能特性只需进行少量定制实现就好。最后理一下websocket数据同步策略的流程: