Soul 网关源码学习(11) - Soul 网关插件概览

在前面的文章中讲述了了 soul 网关的插件的运行时相关信息在运行的 soul admin 实例中维护,数据维护后会存储到数据库当中,数据的变更会以事件的形式在
soul admin 中传播,我们开启的数据同步机制数据变更处理器会将变更之后的数据同步到 soul bootstrap 中。soul bootstrap 的运行时相关的数据都在内存中,在今天的学习当中,主要记录 soul 网关数据如何加载到 soul bootstrap 运行时,以及 soul bootstrap 如何实现插件热插拔。

通过数据同步机制同步的数据如何加载到 soul bootstrap 运行时

前面的学习当中,我们了解到了 soul bootstrap 侧通过引入 soul-spring-boot-starter-sync-data-center 中的 stater 后,在启动的配置文件中通过相应的配置属性开关来开启不同方式的配置同步。数据同步依赖的接口定义在了模块
soul-sync-data-api 中,分别定义了 AuthDataSubscriberMetaDataSubscriberPluginDataSubscriberSyncDataService

在前面的源码分析中,我们了解到了 SyncDataService 是各个同步机制的 SyncDataService (如:WebsocketSyncDataService) 的接口定义,这个接口没有任何的方法定义,是个标记接口。SyncDataService 的各个实现类中就依赖了 AuthDataSubscriberMetaDataSubscriberPluginDataSubscriber 来完成数据的更新。我们拿 PluginDataSubscriber
的方法列表来举例(它里面的方法最多,而且包含了其它两个 Subscriber 有的方法):

public interface PluginDataSubscriber {

default void onSubscribe(PluginData pluginData) {
}

default void unSubscribe(PluginData pluginData) {
}

default void refreshPluginDataAll() {
}

default void refreshPluginDataSelf(List<PluginData> pluginDataList) {
}

default void onSelectorSubscribe(SelectorData selectorData) {
}

default void unSelectorSubscribe(SelectorData selectorData) {
}

default void refreshSelectorDataAll() {
}

default void refreshSelectorDataSelf(List<SelectorData> selectorDataList) {
}

default void onRuleSubscribe(RuleData ruleData) {
}

default void unRuleSubscribe(RuleData ruleData) {
}

default void refreshRuleDataAll() {
}

default void refreshRuleDataSelf(List<RuleData> ruleDataList) {
}
}

可以看到,PluginDataSubscriber 中包含了三类数据的处理,分别是: PluginData, SelectorData, RuleData, 对每类数据的处理有 onSubscribe, unSubscribe, refreshXXXDataAll, refreshXXXDataSelf。前面的学习中也了解到了 soul bootstrap 运行时的数据时存在 JVM 内存中的,
PluginDataSubscriber 的实现类 org.dromara.soul.plugin.base.cache.CommonPluginDataSubscriber 可以看到,对每类数据的处理最终使用了 org.dromara.soul.plugin.base.cache.BaseDataCache,这个类当中定义了 PluginData, SelectorData, RuleData 的缓存存储容器。
CommonPluginDataSubscriber 中的 onSubscribe, unSubscribe 系列方法还依赖与 org.dromara.soul.plugin.base.handler.PluginDataHandler 接口的实现,不同的插件有不同的 PluginDataHandler,PluginData, SelectorData, RuleData 定义了各个插件运行时的行为, soul bootstrap 通过依赖 plugin starter 就能集成到这些插件的行为。

soul bootstrap 如何实现插件热插拔

从依赖的角度

依赖的各个 plugin starter 的配置中,@ConditionalOnClass 注解的配置,配置会被 Spring 容器加载的条件是 classpath 下有对应的插件类信息,如果配置未被加载,插件处理相关的类的实例不会被加载到 soul bootstrap 运行时。

从运行时数据的角度

soul admin 侧可以管理插件,选择器,规则等信息的配置,这些数据维护后会被同步到 soul bootstrap 的缓存,以此来控制 soul bootstrap 的行为。

总结

今天学习了 soul 网关数据同步如何影响到运行时,以及 soul 网关如何实现运行时插件可插拔的功能,在学习这部分的源码的过程中,对 soul 网关依赖的组织,插件相关抽象的设计有了更深的理解。

文章作者: David Liu
文章链接: https://davidliu.now.sh/2021/01/26/soul_plugin_hotswap_discovery/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 David Liu's Blog