本文章将成系列介绍:包含但不限于高性能微服务API网关Soul的环境搭建、源码设计
本章节介绍soul,admin操作,使用websocket同步数据到网关
源码跟踪
- 点击divide插件的选择器修改按钮,可以看到前端调用了RuleController.“rule/{id}”的get方法,查询表数据:rule、rule_condition、selector、selector_condition
- 修改某项数据点击确认后,可以看到前端调用了RuleController.“rule/{id}”的put方法,对rule_condition中某项数据执行delete then add(那更新字段岂不是无意义?),之后退出调用RuleController.“rule“的get方法重新查询(分页,每页十二条数据)选择器项下所有规则;
看了这些之后并没有发现与网管同步数据的内容,于是从网关入手查看……
1.看到网关启动日志:
2021-01-21 23:37:49.285 INFO 4768 — [ main] b.s.s.d.w.WebsocketSyncDataConfiguration : you use websocket sync soul data…
2021-01-21 23:37:52.431 INFO 4768 — [ main] o.d.s.p.s.d.w.WebsocketSyncDataService : websocket connection is successful…
2.网关端启动后admin端打印日志:
2021-01-21 23:39:52.665 INFO 20000 — [0.0-9095-exec-3] o.d.s.a.l.websocket.WebsocketCollector : websocket on open successful…
3.在admin端长时间断点停留导致websocket超时,断点释放后,网关端重新连接websocket打印日志:
2021-01-22 00:18:38.049 INFO 2744 — [ocket-connect-1] o.d.s.p.s.d.w.WebsocketSyncDataService : websocket reconnect is successful…
-
WebsocketCollector
-
声明了@ServerEndpoint("/websocket")注解与客户端使用websocket建立连接,使用了:
@OnOpen(连接建立成功调用的方法)
@OnMessage(收到客户端消息后调用的方法)
@OnClose(连接关闭调用的方法)
@OnError(发生错误时调用)
send方法(向当前客户端发送消息)
-
发现在修改了规则某一项后点击确认,更新数据库后,调用了WebsocketCollector.send方法用来向客户端发送数据
-
再往前追溯发现调用了DataChangedEventDispatcher.onApplicationEvent(final DataChangedEvent event)方法:
DataChangedEvent中封装了:
eventType = {DataEventTypeEnum@9079} “UPDATE”
groupKey = {ConfigGroupEnum@9238} “RULE”
timestamp = 1611245183682
source = {Collections$SingletonList@9239} size = 1(变更数据)-
onApplicationEvent(final DataChangedEvent event)中调用了WebsocketDataChangedListener.onRuleChanged(final List ruleDataList, final DataEventTypeEnum eventType)方法,在此组装了将会被发送的WebsocketData,并将其转为了jsonString,之后调用前面所说的WebsocketCollector.send(final String message, final DataEventTypeEnum type)方法
-
-
SoulWebsocketClient(使用猜测法猜测出来,网关端,接收admin端Websocket消息)
-
SoulWebsocketClient.onMessage(final String result)方法接收了admin端刚刚发送的ruleData消息并处理:
-
websocketDataHandler.executor(groupEnum, json, eventType)方法:
紧接着调用AbstractDataHandler.handle(final String json, final String eventType)方法
紧接着调用RuleDataHandler.doUpdate(final List dataList)方法
紧接着调用CommonPluginDataSubscriber.onRuleSubscribe(final RuleData ruleData)方法 -
紧接着调用BaseDataCache.cacheRuleData(final RuleData ruleData)方法,将admin端发送的数据放入RULE_MAP中