【仅供内部供应商使用,不提供对外解答和培训】

Page tree

【仅供内部供应商使用,不提供对外解答和培训】

Skip to end of metadata
Go to start of metadata

关键特性

  • 热部署 => 引入了对象清理、资源释放、缓存更新的问题
  • 混淆、加密 => 不能直接使用引擎部分,必须通过bridge
  • 字节码层面处理

变化要点整理

  • 插件的jar包从lib移动到plugin.xml所在文件夹
  • plugin.xml所在文件夹改名为plugin-id-version
  • ExtraClassManager中只存储插件对象与默认值;不在监听环境改变事件,完全由插件引擎控制
  • 插件引擎只监听环境切入与切出,切入时启动、切出时关闭
  • 所有plugin.xml中描述的对象都在运行的第一时间生成,不再等待servlet事件
  • 插件引擎放弃使用动态代理,改为在运行前的字节码操作来实现相同的功能,所以之后可以对插件对象使用instance of等操作
  • 每个插件有单独的ClassLoader
    • 插件自身在加载当前插件的资源时,不要使用系统ClassLoader了,加载不到的
    • 报表中使用IOUtils读取资源、GeneralUtils的classForName去反序列化对象,这两个工具方法会遍历所有插件
    • 每次运行都会创建一个新的ClassLoader,保证在类初始化就做一些操作的插件热部署时不出问题

整体结构

插件框架整体分两部分,第一部分是所有相关的接口定义,基础功能实现等,位于stable模块,可被其他地方访问。第二部分是插件引擎的实现,通过自定义的ClassLoader加载,需要通过PluginManager才能访问。

接口部分

在stable模块中定义了插件的重要接口,每一部分都是相对独立,对插件的特定方面进行的描述

  • 插件上下文部分接口:定义插件上下文对象的功能、获取方式等
  • 管理器部分:连接接口部分与引擎实现
    • 控制器:定义插件生命周期的控制接口,包括运行、禁用、更新、删除等
    • 插件资源池
    • 插件上下文对象
  • observer:插件监听模型,用于对各种插件、插件各种事件的监听,用于解决热部署中的对象清理、资源释放、缓存更新等问题
  • solution:通用解决方案模块,现有更简单便捷的工具来处理热部署所带来的问题
  • pack、transformer:分别定义插件打包时自定义任务的接口,以及插件class文件的处理接口
  • 其他:比如对插件注入对象、ExtraClassManager定义、plugin.xml读取接口、授权与错误码

引擎

引擎是整个插件框架的实现,包括对插件生命周期的抽象与控制、热部署的实现、插件间依赖的解析、文件系统抽象、插件字节码打包和运行时处理等内容。

  • bridge:与PluginManager相连接,是整个插件引擎的入口
  • control:控制器,与Plugin对象配合,共同实现插件的运行、禁用、更新删除,实现热部署
  • core:插件对象Plugin、插件上下文PluginContext实现,自定义PluginClassLoader
  • env:插件文件系统抽象,用于处理不同部署环境下的差异
  • pretreatment:打包前预处理模块,集成javassist,在插件打包时可自动处理class文件
  • transformer:运行时处理,集成javassist,进行插件class文件被加载之前的字节码处理
  • encryption:插件加密和解密模块
  • dependence、embfile:对应标签的处理
  • 其他:如license、错误处理、xml读取


插件加载运行流程

  • No labels