【Soul网关探秘】http数据同步-Web端处理变更通知 (2)

此处由 DividePluginDataHandler 提供 removeSelector 实现:

public void removeSelector(final SelectorData selectorData) { UpstreamCacheManager.getInstance().removeByKey(selectorData.getId()); }

根据 selector id 移除缓存的上游服务,注意只是从 UPSTREAM_MAP_TEMP 移除

public void removeByKey(final String key) { UPSTREAM_MAP_TEMP.remove(key); } 刷新数据

CommonPluginDataSubscriber 实现数据刷新:

public void refreshSelectorDataAll() { BaseDataCache.getInstance().cleanSelectorData(); }

注意这里的 refresh all 实际是做的 clean 操作。

BaseDataCache 的 cleanSelectorData 处理:

public void cleanSelectorData() { SELECTOR_MAP.clear(); }

直接清除 SELECTOR_MAP 所有数据。

响应订阅

CommonPluginDataSubscriber 实现订阅响应:

public void onSelectorSubscribe(final SelectorData selectorData) { subscribeDataHandler(selectorData, DataEventTypeEnum.UPDATE); }

subscribeDataHandler 对 selectorData 的 update 处理:

private <T> void subscribeDataHandler(final T classData, final DataEventTypeEnum dataType) { Optional.ofNullable(classData).ifPresent(data -> { if (data instanceof PluginData) { ... } else if (data instanceof SelectorData) { SelectorData selectorData = (SelectorData) data; if (dataType == DataEventTypeEnum.UPDATE) { BaseDataCache.getInstance().cacheSelectData(selectorData); Optional.ofNullable(handlerMap.get(selectorData.getPluginName())).ifPresent(handler -> handler.handlerSelector(selectorData)); } else if (dataType == DataEventTypeEnum.DELETE) { ... } } else if (data instanceof RuleData) { ... } }); }

缓存选择器数据到 BaseDataCache,并处理选择器。

此处由 DividePluginDataHandler 提供 handlerSelector 实现:

public void handlerSelector(final SelectorData selectorData) { UpstreamCacheManager.getInstance().submit(selectorData); }

提交选择器数据到 UpstreamCacheManager。

UpstreamCacheManager 的 submit 处理:

public void submit(final SelectorData selectorData) { final List<DivideUpstream> upstreamList = GsonUtils.getInstance().fromList(selectorData.getHandle(), DivideUpstream.class); if (null != upstreamList && upstreamList.size() > 0) { UPSTREAM_MAP.put(selectorData.getId(), upstreamList); UPSTREAM_MAP_TEMP.put(selectorData.getId(), upstreamList); } else { UPSTREAM_MAP.remove(selectorData.getId()); UPSTREAM_MAP_TEMP.remove(selectorData.getId()); } }

根据 selector id 更新 UPSTREAM_MAP 和 UPSTREAM_MAP_TEMP。

总结

本篇梳理和分析了配置变更通知到达后 soul-web 端的处理流程,最终处理主要是更新本地配置缓存以及维护上游服务散列表。

soul-web收到变更通知后处理流程如下:

soul-web 端收到响应

若配置组数据存在变更,则发起获取配置请求获取最新配置信息

更新配置组缓存

循环处理配置数据刷新事件

若最新配置数据为空,则删除本地配置数据并移除上游服务

若最新配置数据不为空,则缓存配置组数据并更新上游服务

若配置组数据无变更,不作处理

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpxwgw.html