Soul API網關源碼解析07 - 數據同步篇

目標

  • WebSocketClient客戶端數據流處理邏輯圖
  • WebSocketDataHandler核心類的組成
  • 總結

WebSocketClient客戶端數據流處理邏輯圖

image

整個數據處理流程都是圍繞 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
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

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容