开篇:为何需要热加载和热插拔?生产级插件管理的意义
在 Java 后端开发日常里,开发者常遭遇几个场景:开发阶段“改一行等半天”、生产环境“半夜停机更新”、模块化部署“耦合困境”。这三个痛点指向开发态热加载、运行态热插拔、架构态模块隔离三个核心能力需求。Solon 框架从内核层面设计了一套完整的插件管理与生命周期管控机制,提供 Debug 模式、启动参数体系等关键技术能力。
Debug 模式与资源热更新
Solon 的 Debug 模式面向开发阶段,开启后框架会高频监控资源文件变化,实现模板文件和静态资源即时刷新,无需重启应用。有程序启动参数、JVM 系统参数等四种启用方式。开启后,不同类型资源变化触发不同行为,模板和静态资源热更新最实用,但 Java 类代码不会自动热加载,solon - proxy 插件会额外打印代理类信息,Debug 模式有性能损耗,仅建议在开发环境开启。
启动参数体系
Solon 提供完整的启动参数体系,启动参数在应用启动完成后会被静态化。有完整参数表,启动参数有三种等价写法。重点参数如 --env 是环境切换核心开关,--stop.safe 和 --stop.delay 是优雅停机关键配置等。可通过 Solon.cfg() 在代码中访问启动参数,启动后配置只读。
E - Spi(体外扩展机制)
将 Java 应用打包成 fatjar 部署时,E - Spi 解决不重新打包主程序动态添加业务模块或修改配置的问题。它把扩展模块和配置文件放 JAR 包外部目录,启动时自动扫描加载。有配置与文件结构,也可代码方式灵活加载。采用共享 ClassLoader,更新后需重启主服务。插件包打包有 fatjar 打包和公共依赖上提两种方案。
H - Spi(热插拔机制)
E - Spi 是“体外扩展的经济型方案”,H - Spi 是为生产环境热插拔场景定制的高级方案,核心区别是“隔离”。H - Spi 让每个插件包独享 ClassLoader、AppContext 和配置,实现运行时独立性。其隔离遵循双亲委派模型变体,插件 stop() 方法要精确移除 start() 中注册的资源。
solon - hotplug 插件
solon - hotplug 是 H - Spi 机制的具体实现插件,有依赖引入方式。提供底层接口 PluginPackage 和管理接口 PluginManager 两层 API 设计。有配置文件声明式和 HTTP 接口动态管理两种热管理方式,可构建插件管理平台。开发中要注意 ClassLoader 对框架行为的影响。
插件开发模板
热插拔插件核心接口 Plugin 的 start() 和 stop() 方法要严格对称。start() 方法通常完成加载插件专属配置文件、扫描插件自身 Bean 等四件事。stop() 方法要移除 HTTP 路由、定时任务等四类资源。完成插件实现类后,需创建 Solon 的 SPI 声明文件。
插件间交互建议
H - Spi 的 ClassLoader 隔离使插件 A 的类对插件 B 不可见,可采用事件总线解耦、弱类型数据传递、父级 ClassLoader 放置共享接口、结合 DamiBus 等策略进行插件间交互。
ClassLoader 隔离下的注意事项
模板渲染要显式传入插件自身的 ClassLoader,热插拔插件包名要独立,依赖要分层放置,插件访问主程序资源有标准途径,开发中要清楚当前代码运行的 ClassLoader 和访问资源所属的 ClassLoader。
应用生命周期与 @Init 加载时序
SolonApp 从 Solon.start() 到 Solon.stop() 经历多个时机点构成完整执行链路。有六个应用事件时机点,AppBeanLoadEndEvent 之前的事件要手动订阅。LifecycleBean 接口绑定在 AppContext 启动与停止阶段,存在依赖关系时 Solon 支持自动排序,循环依赖有解除双向依赖和手动指定顺序位两种解决方案。