
技术摘要:
本文发明公开了一种基于微内核加插件式的软件架构方法,该软件架构方法建立动态插件模型基础上,首先构建一个基础的框架应用程序,用以加载插件并且为插件的运行提供必要的执行环境;其次,制定插件的命名规则,确保不同开发者的插件命名的惟一性;然后,依次制定插件 全部
背景技术:
软件架构的本质在于模块的拆分,这些经过拆分的模块在实施时按照业务的需求 进行组装,满足应用软件的业务需求,最大限度的应对软件变更需要。微内核架构的拆分主 要包含两个部分:核心系统和插件模块。内核是一个平台的最小核心,它是平台核心框架、 公共类库的最小集合,没有任何业务逻辑,有一个负责插件组装的管理引擎,能够加载、卸 载和运行应用所需的插件。内核必须是健壮并稳定的,用以保证平台本身的可扩展性、稳定 性及灵活性。插件又分为技术插件和业务插件。每个业务插件均是是可独立完成某个或一 系列功能的模块,是一个完整的业务描述,封装了一个业务目标所需的各种技术,业务逻 辑。插件之间存在依赖关系,但只能通过指定的接口进行交互,从而实现插件间的松耦合 性。通常插件由内核的管理引擎进行加载,它不能独立运行,需要在平台内核的支撑下才可 以运行。 插件技术的应用可以大大的减少软件开发的时间,同时也将软件的质量得到了显 著。目前,基于C 语言的插件式软件架构在插件的架构与生成、插件的识别、插件信息的获 取、插件的生命周期未形成明确统一的规范,插件之间的解耦不足,在动态加载方面能力有 所不足。随着软件系统的不断发展,软件系统自身结构和集成的功能正在变得日益庞大和 复杂,功能应用的开发难度被提升、各个模块的耦合度增加,对软件的模块化提住了更高的 要求。与此同时,各种新技术、新平台的应用需求使得插件框架的能力受到极大的挑战。
技术实现要素:
发明目的:本发明旨在提供一种基于微内核加插件式的软件架构方法,能应对软 件系统不断变化的开发需求,保证系统的扩展性、灵活性和可维护性。 技术方案:本发明所述的一种基于微内核加插件式的软件架构方法,包括以下步 骤: (1)构建一个基础的框架应用程序,用以加载插件并且为插件的运行提供必要的 执行环境; (2)制定插件的命名规则,规范插件的命名及内容,确保不同开发者的插件命名的 惟一性; (3)制定插件的物理组织规则,插件以压缩包的形式进行打包,打包的内容有插件 名字的描述,同时也包括动态库、资源文件及属性描述文件等,每个插件具有独立的模块组 织; (4)构建插件生命周期层,对组织好的插件进行整个生命周期进行管理,包括插件 的安装、启动、停止、更新和卸载过程; (5)构建插件服务层,作为插件之间交互的桥梁,服务层与插件的生命周期层紧密 4 CN 111596969 A 说 明 书 2/7 页 结合,形成一个动态协作模型,包括服务注册、服务定位、服务更新、服务事件通知;各个插 件将其向其他插件提供的功能以服务的形式注册到软件框架提供的服务中心,其他插件则 在软件框架的服务中心查找所需的服务; (6)构建主题事件服务层:基于QT的信号槽机制和服务层,实现事件的异步发送; 插件主动先向软件框架订阅某一主题事件时,需传入响应槽函数的签名,当对应的主题信 号发出后,所有订阅此主题的槽函数将会被调用,同时事件消息会作为参数传入槽函数,其 所属的插件将对这事件消息进行处理;插件在订阅某一主题事件后也可以主动反订阅,则 将不会收到事件消息; (7)根据上述步骤,构建插件容器,同时在插件容器中添加跨进程消息转发功能, 提供跨进程统一消息交互服务。 进一步地,步骤(2)所述的插件命名规则如下: 插件命名采用反向域名机制,即名字由多个以“.”分隔的子部分组成,第一部分是 机构或厂商的顶级域名,第二部分是机构或公司的域名,剩下的部分则是由厂商或者机构 自由地分配,域名中的字符采用大小写字母字符、数字以及中横线,命名的最后一部分是以 下划线连接的版本信息,版本信息由主版本号、副版本号以及修订号三部分组成。 进一步地,,步骤(2)所述的插件内容主要包括插件内容将由动态链接库、清单文 件、数据文件、配置文件和资源文件。 进一步地,所述步骤(3)包括以下步骤: (31)以可执行环境为基础开发插件自动打包工具,将插件内容压缩至同一个压缩 包内,形成扩展名为“bndl”的压缩文件; (32)提供接口读取插件数据,包括将提取插件文件和解析插件数据; (33)基于可执行环境层提供跨平台的类加载器,以加载实现插件激活器接口的插 件激活器类。 进一步地,所述步骤(4)包括以下步骤: (41)设计文件组织结构,规定插件的部署位置,只有部署到指定位置的插件才会 被默认加载; (42)利用模块层中的数据读取接口,从插件压缩包提取清单文件和属性文件,对 插件进行必要的初始化操作; (43)启动插件前,分析插件依赖关系,先启动依赖的插件; (44)启动插件时,利用模块层中的类加载器,加载插件激活器类,调用其中的 “start“方法,启动插件; (45)利用模块层中的类加载器,加载插件激活器类,调用其中的“stop“方法,停止 插件; (46)插件不再使用时,卸载插件和与之相关的资源。 进一步地,步骤(5)所述的服务注册包括单例和工厂两种注册模式;所述单例注册 模式须使服务接口继承自服务基类;其主要接口函数声明如下: virtual const std::type_info&type( )const 返回对象的类型信息; virtual bool isA(const std::type_info&otherType)const 5 CN 111596969 A 说 明 书 3/7 页 判断对象是否为指定类型的子类; 所述工厂服务注册是服务提供者将服务工厂注册到框架内,服务消费者可以通过 工厂获取多个服务实例,工厂服务需继承工厂服务基类,其主要接口函数如下: ServiceRegistration registerService(const cppString&clazzes,Service:: Ptr service,const cppDictionary&properties=cppDictionary( )) 注册服务,传入参数分别为服务的唯一ID、服务本身的指针、服务的属性; ServiceReference getServiceReference(const cppString&clazze) 通过服务的唯一ID获取服务引用; Service::Ptr getService(const ServiceReference&reference) 通过服务的引用获取服务本身的指针。 进一步地,所述步骤(7)工作过程如下: 软件框架作为主进程,另一软件框架作为插件容器,它们同时具有插件管理和服 务管理的能力,插件容器只有跨进程交互服务功能,而主进程框架提供更多的核心服务功 能;在单一进程中,当A插件订阅了某一主题事件,其他插件若想发送事件给A插件,则需调 用发送同一主题事件的接口,A插件才能收到事件消息;但在跨进程时,主进程框架和插件 容器将使用不同的主题事件进行消息发送和接收,从而向外暴露统一的接口进行消息发送 和消息接收,实现了插件无论部署在子进程或者是在子进程都调用同样的接口进行消息发 送和接收。 有益效果:与现有技术相比,本发明的有益效果:1、该软件架构方法参考面向JAVA 的动态模型系统OSGI(Open Service Gateway Initiative),具有降低系统复杂、提高功能 复用性、简单小巧易于部署、插件可动态更新等特点;2、该软件架构方法建立在动态插件模 型的基础之上,在插件的组织结构、插件的形式、框架对插件的生命周期管理及插件之间的 交互提出了一套具体实施方法,一定程度上弥补了基于C/C 语言插件框架架构方法较少 的不足;3、该软件架构方法不仅适用于windows平台,也同时适用于linux平台,其可执行环 境层采用C/C 标准库和名为POCO的跨平台C 开源核心库,屏蔽上层对操作系统API的依 赖,基于此实现的功能在不同平台具有通用性;4、提供基于主题事件服务的跨进程消息交 互机制,解决单一框架中插件过多,内存占用过高等问题。 附图说明 图1为基于微内核加插件式的软件架构图; 图2为插件的组成图; 图3为插件的组织结构图; 图4为插件的生命周期状态变化图; 图5为服务功能原理图; 图6为主题事件的发布与订阅图; 图7为主题事件的发送与接收图; 图8为跨进程统一消息交互图。 6 CN 111596969 A 说 明 书 4/7 页