微内核架构(Microkernel Architecture)
微内核架构(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
微内核架构(Microkernel Architecture)的更多相关文章
- 事件驱动架构 (Event-Driven Architecture,EDA) 简介
EDA 是一种侧重于以生成/消费为基础的异步通信的架构模式.这主要对照于传统的基于线程的同步系统. EDA 是一种以事件 (event)为核心,提供事件产生,路由,消费已经结果回调等机制的架构模式. ...
- microkernel architecture - Proxy
The microkernel architecture pattern allows you to add additional application features as plug-ins t ...
- 编译器架构Compiler Architecture(下)
编译器架构Compiler Architecture(下) Combining Scanning and Parsing 实际上没有必要将扫描(词法分析/标记化)与解析(语法分析/树生成)分开.基于P ...
- 编译器架构Compiler Architecture(上)
编译器架构Compiler Architecture(上) 编译器是程序,通常是非常大的程序.它们几乎都有一个基于翻译分析综合模型的结构. CONTENTS Overview • Compiler C ...
- 架构(Architecture)和框架(Framework)杂谈
1. 架构和框架的设计层次不同 类似于硬件设计,软件设计也分为不同的层次.典型的软件设计层次如下图: 在这个图中我们可以看到,Framework处于Micro-archite ...
- 架构(Architecture)随想
架构(Architecture)的意义: 先不要看什么是架构,先看下architect是什么,没有错,它是建筑师,在一块空地上build高楼大厦的人,它是一个designer,设计好整个大楼,也是一个 ...
- NHibernate官方文档中文版-框架架构(Architecture)
总体概览 一个非常高层次的NHibernate架构: 这个图展示了NHibernate使用数据库和配置信息来为应用程序提供持久化服务(和持久化对象). 我们想展示一个更加详细的运行时架构.但是NHib ...
- 深度漫谈数据系统架构——Lambda architecture
https://mp.weixin.qq.com/s/whmhm2yzug2WVdH3dTq8hg
- Software Architecture Pattern(Mark Richards)笔记
软件架构模式 缺少规范架构的程序通常会变得紧耦合.脆弱.难以更改,缺少清晰的发展方向和愿景.这本小书用50多页介绍了常用的5种常见架构模式,相信不管是大牛还是萌新都会有所收获,特别是对我这种偏爱系统设 ...
随机推荐
- Java简单类——一对多映射(省、市)
class Province { private int pid ; private String name ; private City cities [] ; public Province (i ...
- 使用NPOI将TABLE内容导出到EXCEL
项目中需要将页面中的table内容导出到EXCEL,在用了几种方法后发现NPO是最快&最好的 需要应用 NPOI.dll 还有个Ionic.Zip.dll不知道有用没,没去研究,两个DLL都放 ...
- LinkedBlockingQueue的put,add跟offer的区别
LinkedBlockingQueue的put,add和offer的区别 最近在学习<<Java并发编程实践>>,有很多java.util.concurrent包下的新类.Li ...
- webService 发送soap请求,并解析返回的soap报文
本例应用场景:要做一个webService测试功能,不局限于任何一种固定格式的webService,所以像axis,cxf等框架就不好用了.只有深入到webService的原理,通过发收soap报文, ...
- change和onchange触发为什么不立马生效?
change和onchange触发了,为什么不立马生效?那是因为他们本身不是当文本改变就立马触发的事件,而是当文本改变了,blur离开了表单才触发. 如果要加上触发请结合keyup,keydown,o ...
- Java并发控制:ReentrantLock Condition使用详解
生产者-消费者(producer-consumer)问题,也称作有界缓冲区(bounded-buffer)问题,两个进程共享一个公共的固定大小的缓冲区.其中一个是生产者,用于将消息放入缓冲区:另外一个 ...
- 关于Left join
Sql关联表时条件放在On或者where上结果是不一样的. 1.放在on上 如下 select S.StoreID,* from BizProductItem as P left join BizSt ...
- 20145320 《Java程序设计》第8周学习总结
20145320 <Java程序设计>第8周学习总结 教材学习内容总结 15.1日志 java.util.logging包提供了日志功能相关类与接口,不必额外配置日志组件,就可以在标准ja ...
- JAVA线程池原理详解二
Executor框架的两级调度模型 在HotSpot VM的模型中,JAVA线程被一对一映射为本地操作系统线程.JAVA线程启动时会创建一个本地操作系统线程,当JAVA线程终止时,对应的操作系统线程也 ...
- C++之路进阶——codevs1362(网络扩容)
1362 网络扩容 省队选拔赛 时间限制: 2 s 空间限制: 128000 KB 题目等级 : 大师 Master 题目描述 Description 给定一张有向图,每条边都有一个容量 ...