在前面的文章中讲述了了 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 中,分别定义了 AuthDataSubscriber,MetaDataSubscriber,PluginDataSubscriber,SyncDataService。
在前面的源码分析中,我们了解到了 SyncDataService 是各个同步机制的 SyncDataService (如:WebsocketSyncDataService) 的接口定义,这个接口没有任何的方法定义,是个标记接口。SyncDataService 的各个实现类中就依赖了 AuthDataSubscriber,MetaDataSubscriber,PluginDataSubscriber 来完成数据的更新。我们拿 PluginDataSubscriber
的方法列表来举例(它里面的方法最多,而且包含了其它两个 Subscriber 有的方法):
public interface PluginDataSubscriber { |
可以看到,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 网关依赖的组织,插件相关抽象的设计有了更深的理解。