微内核架构(Microkernel Architecture)

微内核架构有时也被成为插件架构模式(plug-in architecture pattern),通常用于实现基于产品的应用,如Eclipse和Firefox。然而许多公司也将内部的业务软件做成软件产品,提供版本、发版说明和插件特性。微内核架构模式通过插件向核心应用添加额外的功能,提供了可扩展性和功能的独立和分离。

模式描述

微内核架构包含两部分组件:核心系统(core system)和插件模块(plug-in modules)。应用逻辑被分割为独立的插件模块和核心系统,提供了可扩展性、灵活性、功能隔离和自定义处理逻辑的特性。


图1 微内核架构模式(microkernel architecture pattern)

微内核架构的核心系统通常提供系统运行所需的最小功能集。许多操作系统使用的就是微内核架构,这也是它名字的由来。从商业应用程序的角度来看,核心系统一般是通用业务逻辑,没有特殊情况、特殊规则或复杂情形下的自定义代码。

插件模块是独立的模块,包含特定的处理、额外的功能和自定义代码,来向核心系统增强或扩展额外的业务能力。通常插件模块之间也是独立的,也有一些插件是依赖于若干其它插件的。重要的是,尽量减少插件之间的通信以避免依赖的问题。

核心系统需要知道哪些插件是可用的且如何使用。一种实现的方式是使用插件注册表。注册表中包含插件的一些信息,如名称、数据契约(输入数据和输出数据)、远程访问协议(决定插件如何与核心系统连接,XML或WSDL等)。

插件模块和核心系统的连接方式有多种,包括OSGi (open service gateway initiative)、messaging、web service、甚至点对点绑定(对象实例化)。选择哪种连接方式取决于构件的应用类型和是否分布式部署等特殊需求。

插件和核心系统之间的契约也是各种各样的,既可以是标准的也可以是自定义的。通常在使用第三方插件时需要自定义契约。这种情况下,通常创建一个该插件契约到你的标准契约的适配器,这样核心系统就不需要针对每个插件的定制编码了。创建标准契约时(通常为XML),要记得从一开始就设计好版本策略。

案例

微内核架构最好的案例也许就是Eclipse啦。下载基础版本的Ecilpse或许只比一个功能花哨的编辑器强一点,一旦装上一些插件,它立刻就变成高度定制化的很有用的产品。浏览器也是微内核架构产品的典型案例。

这样的基于产品的软件例子数不胜数,但是大型商业应用呢?微内核结构也是适用的。这里再以保险公司的索赔处理为例。(书中的例子都不符合国情,看着挺费劲的。)

索赔处理过程很复杂,每个阶段都有很多不同的规则和条例来说明是否应该得到赔偿。例如汽车挡风玻璃被岩石击碎,有的州是允许赔偿的,有的是不允许的。标准的索赔过程几乎有无限的条件。

通常保险索赔应用都会使用一个大型的复杂的规则引擎来处理。但是规则引擎会像滚雪球一样越来越大,修改一个规则可能会影响其它的规则,或者一个简单的规则修改需要很多分析人员、开发人员和测试人员。使用微内核架构模式可以避免这样的问题。

如图2中所示,核心系统claims processing包含了处理索赔过程的基本业务逻辑。每个插件模块包含一个州的特殊规则。这个例子中,插件模块可以通过自定义代码或分离规则引擎实例来实现。最重要的是,每个州的独特的规则从核心系统中剥离出来,可以被添加或移除,修改时不影响或会稍微影响核心系统与其它插件。


图2 微内核架构案例

注意事项

微内核架构模式的一个优秀之处在于它可以嵌入或者作为其它架构模式的一部分。例如事件驱动架构中的事件处理组件就可以使用微内核架构实现。

微内核架构为递进设计和增量开发提供了方便。可以先实现一个稳固的核心系统,然后在不对核心系统进行大量修改的情况下逐渐地增加功能和特性。

对于基于产品的应用,微内核架构是一开始的首选。尤其是这样的产品:随着时间逐渐地发布新功能,而且希望保证所有的用户都能获取到新功能。如果以后发现该架构不符合需求了,可以随时重构成其它架构。

模式分析

下表展示了分层架构模式的通用架构特性的评级和分析。

整体灵活性

评级:高

分析:整体灵活性是对环境变化快速响应的能力。由于插件之间的低耦合,改变通常是隔离的,可以快速实现。通常,核心系统是稳定且快速的,具有一定的健壮性,几乎不需要修改。

易于部署

评级:高

分析:取决于实现方式,插件可以在运行时动态添加(热部署),最小化部署的停机时间。

可测试性

评级:高

分析:插件可以独立测试,也很容易被模拟,不需修改核心系统就可以演示或构建新特性的原型。

性能

评级:高

分析:虽然微内核架构本身不会使应用高性能,但通常使用微内核架构构建的应用性能都还不错,因为可以自定义或者裁剪掉不需要的功能。JBoss应用服务器就是这样的。

可伸缩性

评级:低

分析:因为大部分微内核架构的实现都是基于产品的,一般都很小,是一个独立的单元,因此不具有高可伸缩性。取决于插件的实现方式,有时在插件特性层可以提供伸缩性,但总体上来说该架构还是用于构建高可伸缩性应用的。

开发容易度

评级:低

分析:微内核架构需要深思熟虑的设计和契约的规划管理,因此实现起来比较复杂。契约的版本机制、插件的注册机制、插件的粒度、插件连接方式的选择都使得实现起来是复杂的。


参考资料:

Software Architecture Patterns

colobu.com

微内核架构(Microkernel Architecture)的更多相关文章

  1. 事件驱动架构 (Event-Driven Architecture,EDA) 简介

    EDA 是一种侧重于以生成/消费为基础的异步通信的架构模式.这主要对照于传统的基于线程的同步系统. EDA 是一种以事件 (event)为核心,提供事件产生,路由,消费已经结果回调等机制的架构模式. ...

  2. microkernel architecture - Proxy

    The microkernel architecture pattern allows you to add additional application features as plug-ins t ...

  3. 编译器架构Compiler Architecture(下)

    编译器架构Compiler Architecture(下) Combining Scanning and Parsing 实际上没有必要将扫描(词法分析/标记化)与解析(语法分析/树生成)分开.基于P ...

  4. 编译器架构Compiler Architecture(上)

    编译器架构Compiler Architecture(上) 编译器是程序,通常是非常大的程序.它们几乎都有一个基于翻译分析综合模型的结构. CONTENTS Overview • Compiler C ...

  5. 架构(Architecture)和框架(Framework)杂谈

    1. 架构和框架的设计层次不同       类似于硬件设计,软件设计也分为不同的层次.典型的软件设计层次如下图:        在这个图中我们可以看到,Framework处于Micro-archite ...

  6. 架构(Architecture)随想

    架构(Architecture)的意义: 先不要看什么是架构,先看下architect是什么,没有错,它是建筑师,在一块空地上build高楼大厦的人,它是一个designer,设计好整个大楼,也是一个 ...

  7. NHibernate官方文档中文版-框架架构(Architecture)

    总体概览 一个非常高层次的NHibernate架构: 这个图展示了NHibernate使用数据库和配置信息来为应用程序提供持久化服务(和持久化对象). 我们想展示一个更加详细的运行时架构.但是NHib ...

  8. 深度漫谈数据系统架构——Lambda architecture

    https://mp.weixin.qq.com/s/whmhm2yzug2WVdH3dTq8hg

  9. Software Architecture Pattern(Mark Richards)笔记

    软件架构模式 缺少规范架构的程序通常会变得紧耦合.脆弱.难以更改,缺少清晰的发展方向和愿景.这本小书用50多页介绍了常用的5种常见架构模式,相信不管是大牛还是萌新都会有所收获,特别是对我这种偏爱系统设 ...

随机推荐

  1. js中的text(),html() ,val()的区别

    js中的text(),html() ,val()的区别 text(),html() ,val()三个方法用于html元素的存值和取值,但是他们各有特点,text()用于html元素文本内容的存取,ht ...

  2. 基于 ThinkPHP 3.2.3 的页面静态化功能的实现

    PHP 的页面静态化有多种实现方式,比如使用输出缓冲(output buffering),该种方式是把数据缓存在 PHP 的缓冲区(内存)中,下一次取数据时直接从缓冲区中读取数据,从而避免了脚本的编译 ...

  3. phpcms 导航栏点击栏目颜色定位方法和phpcms list页实现分页

    另:一个栏目下面如果没有子栏目,那么它调用的模板就是列表页模板(及list_为前缀的模板):如果一个栏目下面有子栏目,那么它调用的就是栏目首页模板(category_为前缀的模板). 当你这个栏目添加 ...

  4. HAProxy 实践(一)

    运行环境 OS: Deiban 7 软件:haproxy 1.5.8 HTTP Server: 192.168.99.1:8520 192.168.99.1:8530 192.168.99.1:854 ...

  5. stty--设置终端线

    stty - chang and print terminal line settings SYNOPSIS stty [-F DEVICE | --file=DEVICE] [SETTING]... ...

  6. network config

    ifcfg-ens32 --static TYPE=Ethernet BOOTPROTO=static DEFROUTE=yes IPV4_FAILURE_FATAL=no IPV6INIT=yes ...

  7. JAVA线程池原理详解二

    Executor框架的两级调度模型 在HotSpot VM的模型中,JAVA线程被一对一映射为本地操作系统线程.JAVA线程启动时会创建一个本地操作系统线程,当JAVA线程终止时,对应的操作系统线程也 ...

  8. Scrum 项目 6.0 sprint演示

    6.0----------------------------------------------------- sprint演示 1.坚持所有的sprint都结束于演示. 团队的成果得到认可,会感觉 ...

  9. C#中把Datatable转换为Json的5个代码实例

    一. /// <summary> /// Datatable转换为Json /// </summary> /// <param name="table" ...

  10. Java 可变参数列表

    1.可变参数列表的简单实现 当调用方法时,方法的参数个数或类型未知时,称其为可变参数列表.在以前的Java代码中,可以使用Object数组来实现这样的功能.因为,所有的类都是直接或间接继承于Objec ...