探寻app_auth,meta_data的缓存流程
一、概述
昨天对soul网关项目里的PLUGIN 、SELECTOT 、RULE 的传递流程做了概括分析,今天我们对昨天分析过程中提到的APP_AUTH、META_DATA和CommonPluginDataSubscriber里的handerMap进行概括简单分析。
二、APP_AUTH缓存流程
APP_AUTH这块的数据比较独立,应用比较单一
- 和 PLUGIN 一样,网关的数据同步里,先是初始化相关实现
soul-spring-boot-starter-sync-data-zookeeper(ZookeeperSyncDataService的构造函数里)
soul-spring-boot-starter-sync-data-http(HttpSyncDataService的构造函数里)
soul-spring-boot-starter-sync-data-websocket(WebsocketSyncDataService的构造函数里)
soul-spring-boot-starter-sync-data-nacos(NacosSyncDataService的构造函数里)
2. 只有SignAuthDataSubscriber一个实例
public class SignAuthDataSubscriber implements AuthDataSubscriber {
@Override
//更新auth信息
public void onSubscribe(final AppAuthData appAuthData) {
SignAuthDataCache.getInstance().cacheAuthData(appAuthData);
}
@Override
//取消auth信息
public void unSubscribe(final AppAuthData appAuthData) {
SignAuthDataCache.getInstance().removeAuthData(appAuthData);
}
}
- SignAuthDataCache增/删/查缓存AUTH_MAP
5. obtainAuthData的使用者就是auth 插件里的具体处理逻辑了
三、META_DATA缓存流程
- 类似,有三个metaDataSubscriber
- MetaDataAllSubscriber
- SofaMetaDataSubscriber
- AlibabaDubboMetaDataSubcriber
- MetaDataAllSubscriber里和上面的类似,统一使用MetaDataCache的META_DATA_MAP(ConcurrentMap)进行缓存,实现增/删/查,做后续逻辑
- SofaMetaDataSubscriber里,也实现了一个META_DATA(ConcurrentMap),实现增/删/查,做后续逻辑
- AlibabaDubboMetaDataSubcriber里,也实现了一个META_DATA(ConcurrentMap),实现增/删/查,做后续逻辑
缓存了三份META_DATA,这个是个PLUGIN最大的差异。META_DATA_MAP的key是path,PlUGIN_MAP的key是插件,层次不一样,后期我觉得可以像PlUGIN_MAP一样统一到CommonMetaDataSubscriber里。
四、CommonPluginDataSubscriber里的handerMap
昨天在CommonPluginDataSubscriber里除了直接更新plugin_map之外,还有个handerMap,简单看一下。
也是分发给各个PluginDataHandler去对plugin进行处理
看其中一个
public class DividePluginDataHandler implements PluginDataHandler {
@Override
public void handlerSelector(final SelectorData selectorData) {
UpstreamCacheManager.getInstance().submit(selectorData);
}
@Override
public void removeSelector(final SelectorData selectorData) {
UpstreamCacheManager.getInstance().removeByKey(selectorData.getId());
}
@Override
public String pluginNamed() {
return PluginEnum.DIVIDE.getName();
}
}
//UpstreamCacheManager里的方法,更具体插件里的缓存信息的
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);
} else {
UPSTREAM_MAP.remove(selectorData.getId());
}
}
所以这些handler的作用域是具体到每个插件的缓存逻辑里,更新类的成员变量、缓存等信息。
五、小结
- APP_AUTH :认证鉴权信息,目前只有auth插件有用。
- META_DATA:元数据信息,主要针对dubbo框架,个别插件有用。
- CommonPluginDataSubscriber中的handerMap:更插件的类的成员变量、缓存等信息。