引言
在《配置同步》一篇我们提到,Soul 支持 websocket 同步策略,今天我们就来探究 Soul 是如何实现该同步策略的。
一、同步原理
在开始之前,我们再来回顾一下 《配置同步》一篇里对 websocket 同步原理的描述:
与 zookeeper 同步机制类似
soul-web与soul-admin建立好 websocket 连接时,soul-admin将会推送一次全量数据- 若后续配置数据发生变更,则
soul-admin将再次推送增量数据给soul-web注意:
使用 websocket 进行同步时,特别要注意断线重连,即保持心跳。
soul 使用 java-websocket 来进行 websocket 连接。
提取成关键词就是:
- 连接建立,全量推送
- 配置变更,增量推送
- 断线重连,保持心跳
下面将围绕这三部分源码展开分析。
二、源码实现
连接初建立
soul-admin端
1、配置入口:DataSyncConfiguration.WebsocketListener
配置项 soul.sync.websocket.enabled为 true 时生效
负责装配 DataChangedListener、WebsocketCollector、ServerEndpointExporter
@Configuration@ConditionalOnProperty(name = "soul.sync.websocket.enabled", havingValue = "true", matchIfMissing = true)@EnableConfigurationProperties(WebsocketSyncProperties.class)static class WebsocketListener {@Bean@ConditionalOnMissingBean(WebsocketDataChangedListener.class)public DataChangedListener websocketDataChangedListener() {return new WebsocketDataChangedListener();}@Bean@ConditionalOnMissingBean(WebsocketCollector.class)public WebsocketCollector websocketCollector() {return new WebsocketCollector();}@Bean@ConditionalOnMissingBean(ServerEndpointExporter.class)public ServerEndpointExporter serverEndpointExporter() {return new ServerEndpointExporter();}}
2、websocket 的 spring 实现:ServerEndpointExporter
负责提供易用的 websocket 操作模式,通常配合 @OnOpen、@OnMessage、@Onclose、@@Error 等一起使用
3、websocket 收集器:WebsocketCollector
负责 websocket 里 session 的管理
在这里,借助 @ServerEndPoint(“/websocket”) 注册 websocket 端点
@Slf4j@ServerEndpoint("/websocket")public class WebsocketCollector {//...}
自此, soul-admin 完成 websocket 端点注册,注册路径为 “/websocket”
