目标
- WebSocketClient客户端数据流处理逻辑图
- WebSocketDataHandler核心类的组成
- 总结
WebSocketClient客户端数据流处理逻辑图
整个数据处理流程都是围绕 WebSocketDataHandler 类实现的,主要包含不同种数据类型对应的处理Handler,和一个执行消息的executor
// 数据对应的处理函数Map
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);
}
重点看下构造函数,在WebSocket客户端连接服务端时候使用了Spring4.3新特性ObjectProvider来依赖注入Bean。将Subscriber与Handler绑定到一起了。
public WebsocketDataHandler(final PluginDataSubscriber pluginDataSubscriber,
final List<MetaDataSubscriber> metaDataSubscribers,
final List<AuthDataSubscriber> authDataSubscribers) {
ENUM_MAP.put(ConfigGroupEnum.PLUGIN, new PluginDataHandler(pluginDataSubscriber));
ENUM_MAP.put(ConfigGroupEnum.SELECTOR, new SelectorDataHandler(pluginDataSubscriber));
ENUM_MAP.put(ConfigGroupEnum.RULE, new RuleDataHandler(pluginDataSubscriber));
ENUM_MAP.put(ConfigGroupEnum.APP_AUTH, new AuthDataHandler(authDataSubscribers));
ENUM_MAP.put(ConfigGroupEnum.META_DATA, new MetaDataHandler(metaDataSubscribers));
}
从代码可以看出,Subscribers 作为Handler的构造函数。根据不同属性的数据格式与应用场景不同。有定义Subscribe对象域数组区别。
口述数据处理流程(selector为例)
- 数据到达onMessage
- 拿到真实数据并且解析出数据类型以及事件类型
- 拼接成json字符串
- 调用websocketDataHandler的executor,根据数据类型执行对应的handler
- 根据事件类型判断是刷新还是更新还是删除
这里就执行对应数据类型定义的handler方法了,这里面主要有doRefresh,doUpdate,doDelete三种类型的方法
- 刷新本地缓存
- 因为Selector对应的协议插件不关心,那么这个数据发生变化只是处理下本地缓存即可
- MetaData元数据发生变化,不单单要更新本地缓存,同时还要告知关心这个数据的插件进行相关的处理。
WebSocketDataHandler核心类的组成
不同数据的Handler类之间关系图
发布者定义
主要是不同的操作对象关心不同的数据,为了统一前置数据更新操作,采用了发布者模式。来进行消息流的传递。
WebSocketDataHandler
将Handler与Subscriber关联在一起,代码见上方
总结
soul-admin
soul 网关
将上一章数据流图与本章数据流图整合到一起,soul 数据同步中心的核心流程以及类图关系就很清楚了。下一章节针分析zookeeper 如何做数据同步的。