Soul API网关源码解析07 - 数据同步篇

目标

  • WebSocketClient客户端数据流处理逻辑图
  • WebSocketDataHandler核心类的组成
  • 总结

WebSocketClient客户端数据流处理逻辑图

image

整个数据处理流程都是围绕 WebSocketDataHandler 类实现的,主要包含不同种数据类型对应的处理Handler,和一个执行消息的executor

// 数据对应的处理函数Map
private static final EnumMap 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 metaDataSubscribers,
                            final List 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
image.png
  • 拿到真实数据并且解析出数据类型以及事件类型
  • 拼接成json字符串
  • 调用websocketDataHandler的executor,根据数据类型执行对应的handler
image
  • 根据事件类型判断是刷新还是更新还是删除
image.png

这里就执行对应数据类型定义的handler方法了,这里面主要有doRefresh,doUpdate,doDelete三种类型的方法

  • 刷新本地缓存
image.png
  • 因为Selector对应的协议插件不关心,那么这个数据发生变化只是处理下本地缓存即可
  • MetaData元数据发生变化,不单单要更新本地缓存,同时还要告知关心这个数据的插件进行相关的处理。

WebSocketDataHandler核心类的组成

不同数据的Handler类之间关系图

image.png

发布者定义

image

主要是不同的操作对象关心不同的数据,为了统一前置数据更新操作,采用了发布者模式。来进行消息流的传递。

WebSocketDataHandler

将Handler与Subscriber关联在一起,代码见上方

总结

soul-admin


image.png

soul 网关


image

将上一章数据流图与本章数据流图整合到一起,soul 数据同步中心的核心流程以及类图关系就很清楚了。下一章节针分析zookeeper 如何做数据同步的。

参考

soul github
soul document

你可能感兴趣的:(Soul API网关源码解析07 - 数据同步篇)