当前位置: 首页 > news >正文

Solon2 开发之插件,四、插件热插拔管理机制(H-Spi)

插件热插拔管理机制,简称:H-Spi。是框架提供的生产时用的另一种高级扩展方案。相对E-Spi,H-Spi 更侧重隔离、热插热拔、及管理性。

应用时,是以一个业务模块为单位进行开发,且封装为一个独立插件包。

1、特点说明

  • 所有插件包独享ClassLoader、AopContext、配置;完全隔离
    • 可通过 Solon.app(), Solon.cfg(), Solon.context() 等…手动获取主程序或全局的资源
  • 模块可以打包成一个独立的插件包(放在体外加载),也可以与主程序一起打包。“分”或“合”也是自由!
  • 更新插件包,不需要重启主服务。热更新!
  • 开发时,所有资源完全独立自控。且必须完成资源移除的任务
  • 模块之间的通讯,尽量交由事件总线(EventBus)处理。且尽量用弱类型的事件数据(如Map,或 JsonString)
  • 主程序需要引入 “solon.hotplug” 依赖,对业务插件包进行管理

2、插件开发注意示例

  • 插件在“启动”时添加到公共场所的资源或对象,必须在插件停止时须移除掉(为了能热更新):
public class Plugin1Impl implements Plugin {AopContext context;StaticRepository staticRepository;@Overridepublic void start(AopContext context) {this.context = context;//添加自己的配置文件this.context.cfg().loadAdd("demo1011.plugin1.yml");//扫描自己的beanthis.context.beanScan(Plugin1Impl.class);//添加自己的静态文件仓库(注册classloader)staticRepository = new ClassPathStaticRepository(context.getClassLoader(), "plugin1_static");StaticMappings.add("/html/", staticRepository);}@Overridepublic void stop() throws Throwable {//移除http处理。//用前缀,方便移除Solon.app().router().remove("/user");//移除定时任务(如果有定时任务,选支持手动移除的方案)JobManager.remove("job1");//移除事件订阅context.beanForeach(bw -> {if (bw.raw() instanceof EventListener) {EventBus.unsubscribe(bw.raw());}});//移除静态文件仓库StaticMappings.remove(staticRepository);}
}
  • 一些涉及 classloader 的相关细节,需要多多注意。比如后端模板的渲染:
public class BaseController implements Render {//要考虑模板所在的classloaderstatic final FreemarkerRender viewRender = new FreemarkerRender(BaseController.class.getClassLoader());@Overridepublic void render(Object data, Context ctx) throws Throwable {if (data instanceof Throwable) {throw (Throwable) data;}if (data instanceof ModelAndView) {viewRender.render(data, ctx);} else {ctx.render(data);}}
}
  • 更多细节,需要根据业务情况多多注意。

3、插件管理

插件有管理能力后,还可以仓库化,平台化。详见:《生态 / Solon / solon.hotplug》

http://www.lryc.cn/news/5435.html

相关文章:

  • 从react源码看hooks的原理
  • 空间尺寸对迭代次数的影响
  • mininet+flowvisor+floodlight实现网络切片功能
  • 【C++】十分钟带你入门C++
  • kettle利用excel文件增量同步一个库的数据(多表一次增量同步)
  • 面试题:android中A Activity 打开B Activity,为什么A Activity的onStop()方法最后被调用
  • 百度版本gactgpt即将来临,gpt人工智能机器横空出世
  • 【python--networkx】函数说明+代码讲解
  • 【Jqgrid分页勾选保存】三步实现表格分页勾选(取消勾选)保存(附源码)
  • Appium移动自动化测试——app控件获取之uiautomatorviewer
  • webpack、vite、vue-cli、create-vue 的区别
  • 数据结构——TreeMap、TreeSet与HashMap、HashSet
  • Spring Boot学习篇(十三)
  • 微软Bing的AI人工只能对话体验名额申请教程
  • 怎么打造WhatsApp Team?SaleSmartly(ss客服)告诉你
  • IPV4地址的原理和配置
  • 软件测试面试准备——(一)Selenium(1)基础问题及自动化测试
  • AcWing 1230.K倍区间
  • kubernetes集群部署springcloud项目【AL】【未写完】
  • 各种音频接口比较
  • 软件测试面试理论(超详细)
  • c++学习笔记-二进制文件操作(哔站-黑马程序员c++教学视频)
  • 内网渗透(二十三)之Windows协议认证和密码抓取-Mimikatz介绍和各种模块使用方法
  • Nginx if的使用教程
  • 备考蓝桥杯【快速排序和归并排序】
  • Taro使用微信OCR插件无法调用onSuccess回调问题
  • 【Java】代码块的细节你搞懂了吗(基础知识七)
  • 设计模式C++实现12:抽象工厂模式
  • 目标检测论文阅读:GraphFPN算法笔记
  • 实测2023款哪吒U-II,智驾功能对女司机很友好