目標
- WebSocketClient客戶端數據流處理邏輯圖
- WebSocketDataHandler核心類的組成
- 總結
WebSocketClient客戶端數據流處理邏輯圖
image
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.png
發布者定義
image
主要是不同的操作對象關心不同的數據,為了統一前置數據更新操作,采用了發布者模式。來進行消息流的傳遞。
WebSocketDataHandler
將Handler與Subscriber關聯在一起,代碼見上方
總結
soul-admin
image.png
soul 網關
image
將上一章數據流圖與本章數據流圖整合到一起,soul 數據同步中心的核心流程以及類圖關系就很清楚了。下一章節針分析zookeeper 如何做數據同步的。