插件热插拔管理机制,简称: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; @Override
public void start(AopContext context) {
this.context = context; //添加自己的配置文件
this.context.cfg().loadAdd("demo1011.plugin1.yml");
//扫描自己的bean
this.context.beanScan(Plugin1Impl.class); //添加自己的静态文件仓库(注册classloader)
staticRepository = new ClassPathStaticRepository(context.getClassLoader(), "plugin1_static");
StaticMappings.add("/html/", staticRepository);
} @Override
public 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 {
//要考虑模板所在的classloader
static final FreemarkerRender viewRender = new FreemarkerRender(BaseController.class.getClassLoader()); @Override
public 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》

Solon2 开发之插件,四、插件热插拔管理机制(H-Spi)的更多相关文章

  1. 覃超:Facebook的项目开发流程和工程师的绩效管理机制

    覃超:Facebook的项目开发流程和工程师的绩效管理机制 http://mp.weixin.qq.com/s?__biz=MjM5MDE0Mjc4MA==&mid=2650992350&am ...

  2. MS CRM 2011的自定义和开发(11)——插件(plugin)开发(四)

    http://www.cnblogs.com/StoneGarden/archive/2012/02/08/2343294.html MS CRM 2011的自定义和开发(11)——插件(plugin ...

  3. 从零开始实现ASP.NET Core MVC的插件式开发(四) - 插件安装

    标题:从零开始实现ASP.NET Core MVC的插件式开发(四) - 插件安装 作者:Lamond Lu 地址:https://www.cnblogs.com/lwqlun/p/11260750. ...

  4. 【转】为eclipse安装python、shell开发环境和SVN插件

    原文网址:http://www.crazyant.net/1185.html eclipse是一个非常好用的IDE,通常来说我们都用eclipse来开发JAVA程序,为了让开发python.shell ...

  5. 为eclipse安装python、shell开发环境和SVN插件

    http://www.crazyant.net/1185.html 为eclipse安装python.shell开发环境和SVN插件 2013/08/27 by Crazyant 暂无评论 eclip ...

  6. 使用 Android Studio 开发 widget 安卓桌面插件

    •What AppWidget 即桌面小部件,也叫桌面控件,就是能直接显示在Android系统桌面上的小程序: 这么说可能有点抽象,看图: 像这种,桌面上的天气.时钟.搜索框等等,都属于 APP Wi ...

  7. Notepad++进行php开发所必需的插件

    Notepad++进行php开发所必需的插件有那些呢? 1. Compare: 可以用来比较两个文件不同之处. 2. Explorer:文件浏览器插件,包含收藏夹.Session保存功能.可与NppE ...

  8. 再谈Weiphp公众平台开发——1、增加插件

    去年开始接触基于Weiphp的公众平台开发,一直没时间好好整理一下. 下面开始讲解第一个自定义weiphp插件:MyHello的开发流程. 1.插件创建.在weiphp管理后台依次点击“插件管理-&g ...

  9. MS CRM 2011的自定义和开发(11)——插件(plugin)开发(三)

    http://www.cnblogs.com/StoneGarden/archive/2012/02/06/2340661.html MS CRM 2011的自定义和开发(11)——插件(plugin ...

  10. MyEclipse 8.5 开发环境配置,汉化,Aptana2.0插件,SVN 插件,Flex Builder 3/4 插件安装(转载)

    转载地址http://elf8848.iteye.com/blog/630864 下载MyEclipse 8.5 可以通过代理http://www.proxyie.cn/访问MyEclipse的官方网 ...

随机推荐

  1. 前后端都用得上的 Nginx 日常使用经验

    前言 nginx 是一个高性能的开源反向代理服务器和 web 服务器,一般用来搭建静态资源服务器.负载均衡器.反向代理,本文将分享其在 Windows/docker 中的使用,使用 nssm 部署成服 ...

  2. JVM-JVM如何加载类

    一.Java 语言的类型可以分为两大类: 基本类型(primitive types) 引用类型(reference types):类.接口.数组类和泛型参数(泛型参数会在编译中被擦除),因此Java虚 ...

  3. 「面试题」20+Vue面试题整理

    「面试题」20+Vue面试题整理 转载地址:https://juejin.cn/post/6844904084374290446 「观感度:」 「口味:红烧猪蹄」 「烹饪时间:15min」 本文已收录 ...

  4. 物体三维模型的构建:3DSOM软件实现侧影轮廓方法

      本文介绍基于3DSOM软件,实现侧影轮廓方法的空间三维模型重建. 目录 1 背景知识 1.1 三维信息获取方法 1.2 侧影轮廓方法原理及其流程 2 三维模型制作 2.1 马铃薯三维模型制作 2. ...

  5. Android app的暗黑模式适配实现

    原文地址: Android app的暗黑模式适配实现 - Stars-One的杂货小窝 很久之前放在草稿箱的一篇简单笔记,是之前蓝奏云批量下载工具Android版本实现暗黑主题的适配记录 本文所说的这 ...

  6. C语言输入一个三位的正整数,按逆序打印出该数的各位数字。

    #include <stdio.h> int main() { int n, a, b, c;//定义3位数,个位数,十位数,百位数变量 scanf_s("%d", & ...

  7. 一款基于.NET Core的快速开发框架、支持多种前端UI、内置代码生成器

    前言 经常看到有小伙伴在技术群里问有没有什么好用且快速的开发框架推荐的,今天就给大家分享一款基于MIT License协议开源.免费的.NET Core快速开发框架.支持多种前端UI.内置代码生成器. ...

  8. Semantic Kernel 正式发布 v1.0.1 版本

    微软在2023年12月19日在博客上(Say hello to Semantic Kernel V1.0.1)发布了Semantic kernel的.NET 正式1.0.1版本.新版本提供了新的文档, ...

  9. tarjan无向图割点与割边板子

    \(\Huge{割点}\) \(无向图割点判定法则\) 当遍历到一个点x时,这个点为割点的情况有两种: 第一种是该节点为根节点且子节点数>=2,必导致两个子节点不连通: 第二种是该节点不为根节点 ...

  10. 分享两种Pulsar消息积压topic级别策略老化办法

    本文分享自华为云社区<Pulsar消息积压topic级别策略老化的两种方案>,作者: 张俭. Pulsar像大多数消息中间件一样,支持按时间和大小对消息积压进行老化.但是默认的策略只能在n ...