微内核架构(Microkernel Architecture),也称为插件化架构(Plug-in Architecture),是一种面向功能进行拆分的可扩展性架构,通常用于实现基于产品(原文为 product-based,指存在多个版本、需要下载安装才能使用,与 web-based 相对应)的应用。
例如 Eclipse 这类 IDE 软件、UNIX 这类操作系统、淘宝 App 这类客户端软件等,也有一些企业将自己的业务系统设计成微内核的架构,例如保险公司的保险核算逻辑系统,不同的保险品种可以将逻辑封装成插件。
微内核架构包含两类组件:核心系统(core system)和插件模块(plug-in modules)。
微内核的基本架构示意图如下:
上面这张图中核心系统功能比较稳定,不会因为业务功能扩展而不断修改,插件模块可以根据业务功能的需要不断地扩展。微内核的架构本质是将变化部分封装在插件里面,从而达到快速灵活扩展的目的,而又不影响整体系统的稳定。
微内核的核心系统设计的关键技术有:插件管理、插件连接和插件通信。
核心系统需要知道当前有哪些插件可用,如何加载这些插件,什么时候加载插件。
常见的实现方法是插件注册表机制。
核心系统提供插件注册表(配置文件/代码/数据库),插件注册表含有每个插件模块的信息,包括它的名字、位置、加载时机(启动就加载/按需加载)等。
插件如何连接到核心系统,通常,核心系统必须制定插件和核心系统的连接规范,然后插件按照规范实现,核心系统按照规范加载即可。
常见的连接机制有 OSGi(Eclipse 使用)、消息模式、依赖注入(Spring 使用),甚至使用分布式的协议都是可以的,比如 RPC 或者 HTTP Web 的方式。
插件间的通信。虽然设计的时候插件间是完全解耦的,但实际业务运行过程中,必然会出现某个业务流程需要多个插件协作,这就要求两个插件间进行通信。
由于插件之间没有直接联系,通信必须通过核心系统,因此核心系统需要提供插件通信机制。
这种情况和计算机类似,计算机的 CPU、硬盘、内存、网卡是独立设计的配件,但计算机运行过程中,CPU 和内存、内存和硬盘肯定是有通信的,计算机通过主板上的总线提供了这些组件之间的通信功能。
微内核的核心系统也必须提供类似的通信机制,各个插件之间才能进行正常的通信。
OSGi 的全称是 Open Services Gateway initiative,本身其实是指 OSGi Alliance。这个联盟是 Sun Microsystems、IBM、爱立信等公司于 1999 年 3 月成立的开放的标准化组织,最初名为 Connected Alliance。它是一个非盈利的国际组织,旨在建立一个开放的服务规范,为通过网络向设备提供服务建立开放的标准,这个标准就是 OSGi specification。
谈到 OSGi,如果没有特别说明,一般都是指 OSGi 的规范。
尤其是 Eclipse 这个流行软件采用 OSGi 标准后,OSGi 更是成为了首选的插件化标准。
现在谈论 OSGi,已经和嵌入式应用关联不大了,更多是将 OSGi 当作一个微内核的架构模式。
Eclipse 从 3.0 版本开始,抛弃了原来自己实现的插件化框架,改用了 OSGi 框架。
注意:OSGi 是一个插件化的标准,而不是一个可运行的框架,Eclipse 采用的 OSGi 框架称为
Equinox
,类似的实现还有 Apache 的Felix
、Spring 的Spring DM
。
OSGi 框架的逻辑架构图如下:
MANIFEST.MF
,这个文件包含了 Bundle 的基本信息。例如,Bundle 的名称、描述、开发商、classpath,以及需要导入的包和输出的包等,OSGi 核心系统会将这些信息加载到系统中用于后续使用。服务层(Service 层)实现插件通信的功能。OSGi 提供了一个服务注册的功能,用于各个插件将自己能提供的服务注册到 OSGi 核心的服务注册中心,如果某个服务想用其他服务,则直接在服务注册中心搜索可用服务中心就可以。
注意:这里的服务注册不是插件管理功能中的插件注册,实际上是插件间通信的机制。