欢迎您访问365答案网,请分享给你的朋友!
生活常识 学习资料

微内核结构了解

时间:2023-06-07
目录

基本结构设计关键点

插件管理插件连接插件通信 OSGI

插件管理插件连接插件通信 规则引擎

插件管理插件连接插件通信 基本结构

微内核架构包含两类组件:核心系统(core system)和插件模块(plug-in modules)。核心系统负责和具体业务功能无关的通用功能,例如模块加载、模块间通信等;插件模块负责实现具体的业务逻辑。

微内核的架构本质就是将变化部分封装在插件里面,从而达到快速灵活扩展的目的,而又不影响整体系统的稳定。

设计关键点

微内核的核心系统设计的关键技术有:插件管理、插件连接和插件通信

插件管理

核心系统需要知道当前有哪些插件可用,如何加载这些插件,什么时候加载插件。常见的实现方法是插件注册表机制,核心系统提供插件注册表(可以是配置文件,也可以是代码,还可以是数据库),插件注册表含有每个插件模块的信息,包括它的名字、位置、加载时机(启动就加载,还是按需加载)等。

插件连接

通常来说,核心系统必须制定插件和核心系统的连接规范,然后插件按照规范实现,核心系统按照规范加载即可。
常见的连接机制有 OSGi(Eclipse 使用)、消息模式、依赖注入(Spring 使用),甚至使用分布式的协议都是可以的,比如 RPC 或者 HTTP Web 的方式。

插件通信

设计的时候插件是完全解耦的,但在实际业务运行的过程中,是会出现某个业务流程需要多个插件协作,所以核心系统需要提供插件通信机制。

OSGI

OSGi 是一个插件化的标准,而不是一个可运行的框架,Eclipse 采用的 OSGi 框架称为 Equinox,类似的实现还有 Apache 的 Felix、Spring 的 Spring DM。

插件管理

模块层实现插件管理功能。OSGi 中,插件被称为 Bundle,每个 Bundle 是一个 Java 的 JAR 文件,每个 Bundle 里面都包含一个元数据文件 MANIFEST.MF,这个文件包含了 Bundle 的基本信息。
如,Bundle 的名称、描述、开发商、classpath,以及需要导入的包和输出的包等,OSGi 核心系统会将这些信息加载到系统中用于后续使用:

// MANIFEST.MF Bundle-ManifestVersion: 2 Bundle-Name:UserRegisterBundle-SymbolicName: com.test.userregister Bundle-Version: 1.0 Bundle-Activator: com.test.UserRegisterActivator import-Package: org.log4j;version="2.0", ....、Export-Package: com.test.userregister;version="1.0",

插件连接

生命周期层实现插件连接功能,提供了执行时模块管理、模块对底层 OSGi 框架的访问。生命周期层精确地定义了 Bundle 生命周期的操作(安装、更新、启动、停止、卸载),Bundle 必须按照规范实现各个操作。

public class UserRegisterActivator implements BundleActivator { public void start(BundleContext context) { UserRegister.instance = new UserRegister (); } public void stop(BundleContext context) { UserRegister.instance = null; } }

插件通信

服务层实现插件通信的功能。OSGi 提供了一个服务注册的功能,用于各个插件将自己能提供的服务注册到 OSGi 核心的服务注册中心,如果某个服务想用其他服务,则直接在服务注册中心搜索可用服务中心就可以了。

// 注册服务public class UserRegisterActivator implements BundleActivator {// 在 start() 中用 BundleContext.registerService() 注册服务public void start(BundleContext context) {context.registerService(UserRegister.class.getName(), new UserRegisterImpl(), null);}// 无须在 stop() 中注销服务,因为 Bundle 停止时会自动注销该 Bundle 中已注册的服务public void stop(BundleContext context) {}}// 检索服务public class Client implements BundleActivator {public void start(BundleContext context) {// 1、从服务注册表中检索间接的“服务引用”ServiceReference ref = context.getServiceReference(UserRegister.class.getName());// 2、使用“服务引用”去访问服务对象的实例((UserRegister) context.getService(ref)).register();}public void stop(BundleContext context) {}}

这里的服务注册不是插件管理功能中的插件注册,实际上是插件间通信的机制。

规则引擎

规则引擎从结构上来看也属于微内核架构的一种具体实现,其中执行引擎可以看作是微内核,执行引擎解析配置好的业务流,执行其中的条件和规则,通过这种方式来支持业务的灵活多变。

规则引擎在计费、保险、促销等业务领域应用较多。

开源的JBoss Drools

对照微内核架构的设计关键点:

插件管理

规则引擎中的规则就是微内核架构的插件,引擎就是微内核架构的内核。规则可以被引擎加载和执行。规则引擎架构中,规则一般保存在规则库中,通常使用数据库来存储。

插件连接

规则引擎规定了规则开发的语言,业务人员需要基于规则语言来编写规则文件,然后由规则引擎加载执行规则文件来完成业务功能,因此,规则引擎的插件连接实现机制其实就是规则语言。

插件通信

规则引擎的规则之间进行通信的方式就是数据流和事件流,由于单个规则并不需要依赖其他规则,因此规则之间没有主动的通信,规则只需要输出数据或者事件,由引擎将数据或者事件传递到下一个规则。

--------来源《极客课程》∙ 学习摘要

Copyright © 2016-2020 www.365daan.com All Rights Reserved. 365答案网 版权所有 备案号:

部分内容来自互联网,版权归原作者所有,如有冒犯请联系我们,我们将在三个工作时内妥善处理。