引言
在《配置同步》一篇我们提到,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”