前言
上次說到虏束,數據同步的大體流程是怎么樣。那今天我們來從 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, 發(fā)現
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吻氧,發(fā)現 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));
這里有個創(chuàng)建 SoulWebsocketClient 的操作,我們進入此類祟滴,發(fā)現它集成了 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 編輯信息后會發(fā)送 message 报账,這時候會調用 onMessage 的方法研底。后臺更新 selector 時的調試
經過一波 debug 梁只,得出下面這張圖:
總結:1. 還需要深入的是: websocket 的使用 demo秉沼,和使用場景