源码版本:2.6.1
前言
上一篇Apache 神禹(shenyu)源码阅读(一)——Admin向Gateway的数据同步(Admin端)写了Admin 端在接收到程序员对 Divide 插件的选择器 Selector 作出新增操作时,Admin 端是如何将要同步的数据发布给 Gateway 端的。
本篇介绍 Gateway 端是如何接收 Admin 端发布的数据的。
本文介绍的数据同步(sync data)在 Shenyu 架构图中的位置
正文
1. Gateway 端通过网络接收 Admin 端要同步的数据
- ShenyuWebsocketClient.onMessage()
由 Admin 端的WebsocketCollector.send()
通过网络发送数据后(上一篇的内容),Gateway 端的ShenyuWebsocketClient.onMessage()
收到数据,onMessage()
是 Spring 框架抽象类WebSocketClient
的一个方法,在ShenyuWebsocketClient
中实现了这个方法。
public final class ShenyuWebsocketClient extends WebSocketClient {
// ...
@Override
public void onMessage(final String result) {
handleResult(result);
}
private void handleResult(final String result) {
// 1. 打印日志
LOG.info("handleResult({})", result);
// 2. 调用 Gson 包,将 Json 字符串转换为 WebsocketData
WebsocketData<?> websocketData = GsonUtils.getInstance().fromJson(result, WebsocketData.class);
// 3. 因为我们是新增的 Selector,所以这里 groupEnum 为 ConfigGroupEnum.SELECTOR
ConfigGroupEnum groupEnum = ConfigGroupEnum.acquireByName(websocketData.getGroupType());
// 4. 事件是 UPDATE
String eventType = websocketData.getEventType();
// 5. 再转成 Json 字符串
String json = GsonUtils.getInstance().toJson(websocketData.getData());
// 6. 交给 WebsocketDataHandler 处理数据
websocketDataHandler.executor(groupEnum, json, eventType);
}
}
-
ShenyuWebsocketClient.handleResult()
如上面那段代码,
- 打印日志
- 调用 Gson 包,将 Json 字符串转换为
WebsocketData
- 因为我们是新增的 Selector,所以这里
groupEnum
为ConfigGroupEnum.SELECTOR
- 事件是 UPDATE
- 再转成 Json 字符串
- 交给
WebsocketDataHandler
处理数据
-
WebsocketDataHandler.executor()
WebsocketDataHandler
的一个EnumMap
类型的成员变量存储了ConfigGroupEnum
->DataHandler
的映射。在executor
方法里拿到ConfigGroupEnum
对应的DataHandler
去处理数据
public class WebsocketDataHandler {
// ...
private static final EnumMap<ConfigGroupEnum, DataHandler> ENUM_MAP = new EnumMap<>(ConfigGroupEnum.class);
public void executor(final ConfigGroupEnum type, final String json, final String eventType) {
ENUM_MAP.get(type).handle(json, eventType);
}
}
2 交由 SelectorDataHandler 处理数据
-
DataHandler.handle
DataHandler
是个接口:
public interface DataHandler {
/**
* Handle.
*
* @param json the data for json
* @param eventType the event type
*/
void handle(String json, String eventType);
}
其继承关系如下图:
-
AbstractDataHandler.handle()
这里
handle()
用到了一个设计模式——模板方法,里面用到的方法都是交由子类根据自己的逻辑去实现
事件类型为 UPDATE 和 CREATE 的事件都由 doUpdate 方法处理
public abstract <