前言
上次说到,数据同步的大体流程是怎么样。那今天我们来从 websocket 的方式入手,看看他的实现如何。哪些精妙设计的方案,哪些在我们平常编码中能采用的呢?
多个 admin 服务
查看 WebsocketSyncDataService
的第一段代码
String[] urls = StringUtils.split(websocketConfig.getUrls(), ",");
进入 WebsocketConfig
时我们可以得知,我们可以配置多个 admin 的服务,并且他的配置方式为 127.0.0.1:8888,127.0.0.1:8889
,配置为 soul-bootstrap
中的
soul :
sync:
websocket :
urls: ws://localhost:9095/websocket,ws://localhost:9096/websocket
注意:这中间是没有空格的。
我们并不知道这样的配置是否正确,我们验证一下。配置好后重启 bootstrap, 发现
2021-01-20 23:54:19.387 ERROR 4530 --- [ main] o.d.s.p.s.d.w.WebsocketSyncDataService : websocket url( ws://localhost:9096/websocket) is error
连接并不成功,这时我们得另外在起一个 admin,修改 soul-admin 的端口配置,
配置成功后启动应用,这个时候我们本地机子上有两个 admin 的进程。
由于之前启动的是 9095, 那现在我在 9096 上修改参数:
为了更好的辨识,重启了 bootstrap,发现 websocket client 有了两个链接。
2021-01-21 00:18:11.966 INFO 775 --- [ main] b.s.s.d.w.WebsocketSyncDataConfiguration : you use websocket sync soul data.......
2021-01-21 00:18:12.022 INFO 775 --- [ main] o.d.s.p.s.d.w.WebsocketSyncDataService : websocket connection is successful.....
2021-01-21 00:18:12.347 INFO 775 --- [ main] o.d.s.p.s.d.w.WebsocketSyncDataService : websocket connection is successful.....
由此可知,我们的配置目前为止是生效的。
soul websocket 同步的流程
接着 WebsocketSyncDataService
往下看:
clients.add(new SoulWebsocketClient(new URI(url), Objects.requireNonNull(pluginDataSubscriber), metaDataSubscribers, authDataSubscribers));
这里有个创建 SoulWebsocketClient 的操作,我们进入此类,发现它集成了 WebSocketClient 类,
- onOpen(final ServerHandshake serverHandshake) 原文注释:Called after an opening handshake has been performed and the given websocket is ready to be written on. 大体的意思是说:在链接服务端后调用此方法
- onMessage(final String result) 原文注释:Callback for string messages received from the remote host;大体意思是说:从远端服务器上接受到字符串信息后调用
- onClose(final int i, final String s, final boolean b) 原文注释:Called after the websocket connection has been closed.
- onError(final Exception e) 原文注释:Called when errors occurs.
当服务端,也就是 admin 编辑信息后会发送 message ,这时候会调用 onMessage 的方法。后台更新 selector 时的调试
经过一波 debug ,得出下面这张图:
总结:1. 还需要深入的是: websocket 的使用 demo,和使用场景