微内核架构(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. mysql替换制定的内容的 类似正则表达式的功能

    content= 'asnfojassozxpdsgdspdps神龙架谁骄傲的骄傲搜ID飞机扫' SELECT content FROM test WHERE id =1 吧zx替换成ZZZZ UPD ...

  2. ie下如果已经有缓存,load方法的效果就无法执行.的解决方法

    <script type="text/javascript">        $(document).ready(function(){        $('img') ...

  3. github展示项目

    首先在原repo中创建一个gh-pages分支,然后把你master分支的东西都搬过来,将这个gh-pages作为你的HEAD主分支.如果想删掉master分支,需要在repo的settings中修改 ...

  4. [Ubuntu][Linux]更改PATH路径

    1.什么是环境变量(PATH) 在Linux中,在执行命令时,系统会按照PATH的设置,去每个PATH定义的路径下搜索执行文件,先搜索到的文件先执行. 我们知道查阅文件属性的指令ls 完整文件名为:/ ...

  5. Linux Shell编程基础

    在学习Linux BASH Shell编程的过程中,发现由于不经常用,所以很多东西很容易忘记,所以写篇文章来记录一下 ls   显示当前路径下的文件,常用的有 -l 显示长格式  -a 显示所有包括隐 ...

  6. angularJ表单验证

    常用的表单验证指令 1. 必填项验证 某个表单输入是否已填写,只要在输入字段元素上添加HTML5标记required即可: <input type="text" requir ...

  7. 会员管理系统全部源代码(C#+EF+SQLite+Winforms实现)

    会员管理系统全部源代码,VS2010开发,使用Ado.net实体框架EF,简化数据库访问层,并能方便的移植到其他数据库.利用数据绑定减少编码量,提高程序的可维护性和可读性.使用Winfoms方便快速界 ...

  8. [Android Tips] 17. Check APK Sign Info

    $ jarsigner -verify -verbose -certs <apk file path> 查看 keystore $ keytool -list -keystore debu ...

  9. Struts2(二):工作原理

    struts可查看源码:https://github.com/apache/struts 在学习struts2之前,我先看了一些比较早版本对struts2的工作原理相关的介绍,顺便抄写过来,用来帮助自 ...

  10. Web3D编程入门总结——WebGL与Three.js基础介绍

    /*在这里对这段时间学习的3D编程知识做个总结,以备再次出发.计划分成“webgl与three.js基础介绍”.“面向对象的基础3D场景框架编写”.“模型导入与简单3D游戏编写”三个部分,其他零散知识 ...