引言

在《配置同步》一篇我们提到,Soul 支持 websocket 同步策略,今天我们就来探究 Soul 是如何实现该同步策略的。

一、同步原理

在开始之前,我们再来回顾一下 《配置同步》一篇里对 websocket 同步原理的描述:

与 zookeeper 同步机制类似

  • soul-websoul-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

  1. @Configuration
  2. @ConditionalOnProperty(name = "soul.sync.websocket.enabled", havingValue = "true", matchIfMissing = true)
  3. @EnableConfigurationProperties(WebsocketSyncProperties.class)
  4. static class WebsocketListener {
  5. @Bean
  6. @ConditionalOnMissingBean(WebsocketDataChangedListener.class)
  7. public DataChangedListener websocketDataChangedListener() {
  8. return new WebsocketDataChangedListener();
  9. }
  10. @Bean
  11. @ConditionalOnMissingBean(WebsocketCollector.class)
  12. public WebsocketCollector websocketCollector() {
  13. return new WebsocketCollector();
  14. }
  15. @Bean
  16. @ConditionalOnMissingBean(ServerEndpointExporter.class)
  17. public ServerEndpointExporter serverEndpointExporter() {
  18. return new ServerEndpointExporter();
  19. }
  20. }

2、websocket 的 spring 实现:ServerEndpointExporter

负责提供易用的 websocket 操作模式,通常配合 @OnOpen、@OnMessage、@Onclose、@@Error 等一起使用

3、websocket 收集器:WebsocketCollector

负责 websocket 里 session 的管理

在这里,借助 @ServerEndPoint(“/websocket”) 注册 websocket 端点

  1. @Slf4j
  2. @ServerEndpoint("/websocket")
  3. public class WebsocketCollector {
  4. //...
  5. }

自此, soul-admin 完成 websocket 端点注册,注册路径为 “/websocket”

soul-web端

配置已变更

断线需重连