前言
上次說(shuō)到,數(shù)據(jù)同步的大體流程是怎么樣。那今天我們來(lái)從 websocket 的方式入手,看看他的實(shí)現(xiàn)如何。哪些精妙設(shè)計(jì)的方案,哪些在我們平常編碼中能采用的呢?
多個(gè) admin 服務(wù)
查看 WebsocketSyncDataService 的第一段代碼
String[] urls = StringUtils.split(websocketConfig.getUrls(), ",");
進(jìn)入 WebsocketConfig 時(shí)我們可以得知,我們可以配置多個(gè) admin 的服務(wù),并且他的配置方式為 127.0.0.1:8888,127.0.0.1:8889 ,配置為 soul-bootstrap 中的
soul :
sync:
websocket :
urls: ws://localhost:9095/websocket,ws://localhost:9096/websocket
注意:這中間是沒(méi)有空格的。
我們并不知道這樣的配置是否正確,我們驗(yàn)證一下。配置好后重啟 bootstrap, 發(fā)現(xiàn)
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
連接并不成功,這時(shí)我們得另外在起一個(gè) admin,修改 soul-admin 的端口配置,

配置成功后啟動(dòng)應(yīng)用,這個(gè)時(shí)候我們本地機(jī)子上有兩個(gè) admin 的進(jìn)程。
由于之前啟動(dòng)的是 9095, 那現(xiàn)在我在 9096 上修改參數(shù):

為了更好的辨識(shí),重啟了 bootstrap,發(fā)現(xiàn) websocket client 有了兩個(gè)鏈接。
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));
這里有個(gè)創(chuàng)建 SoulWebsocketClient 的操作,我們進(jìn)入此類,發(fā)現(xiàn)它集成了 WebSocketClient 類,
- onOpen(final ServerHandshake serverHandshake) 原文注釋:Called after an opening handshake has been performed and the given websocket is ready to be written on. 大體的意思是說(shuō):在鏈接服務(wù)端后調(diào)用此方法
- onMessage(final String result) 原文注釋:Callback for string messages received from the remote host;大體意思是說(shuō):從遠(yuǎn)端服務(wù)器上接受到字符串信息后調(diào)用
- 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.
當(dāng)服務(wù)端,也就是 admin 編輯信息后會(huì)發(fā)送 message ,這時(shí)候會(huì)調(diào)用 onMessage 的方法。后臺(tái)更新 selector 時(shí)的調(diào)試

經(jīng)過(guò)一波 debug ,得出下面這張圖:

總結(jié):1. 還需要深入的是: websocket 的使用 demo,和使用場(chǎng)景