Microkernel设计模式漫谈

早期我在设计系统的时候,尚没有听过Microkernel设计模式。那时候我就在想,如何才能设计出来一个“长青系统”。它能够最大程度的顺应系统的演化,具有极强的扩展性,极好的模块化。

直到前几天读《面向模式的软件架构》的时候,读到了Microkernel设计模式,才恍然发现我之前设计系统采取的一些措施和手段,实际上就是使用了Microkernel设计模式。不过到底缺乏理论支持,那些系统看上去并不够精致。

背景与问题

Microkernel设计模式,其背景原书中写的是:

使用依赖于相同核心功能的编程接口开发多个应用程序

不过对于我这种侧重业务的开发而言,它可以被描述为:

使用依赖于相同核心功能的编程接口接入多个业务

在我所涉及的需求,大多数都是具有良好的通用性——因为我所在的部门,涉及的类目实在过多。很多需求都不能仅为当前类目开发,而要充分考虑到其余的类目。此外就是,我主要负责的一款商业产品,它类似于一个平台,允许各个业务方开发各色功能接入这个平台。这些功能可以被组合成不同的产品,执行不同的售卖策略。尤其特殊的是,有很多功能也是我们开发的。于是我们既扮演了一个平台方的角色,又扮演了一个业务方的角色。

不论是哪种情况,都要求必须能够适应业务的不断发展。

解决方案

早期我思考的一个解决方案就是,保持系统的核心尽量与业务特征剥离。有时候我会把这个称为“业务无关内核”。这其实是我从哲学上收获的一个启发。哲学上讲“内涵越小,外延越大”,而“内涵越大,外延越小”。对于一个系统来说,要想适应不同的业务,也就是要具有很强大的“外延”,那么就必须保持“内涵”小。

我们可以这样想:如果一个内核具有极强的业务特征,那么每次接入一个新的业务的时候,这个内核都要修改,以纳入这个业务的特征。如果我们可以预见到所有要接入的业务的特征,那么,我们就可以让内核具有所有这业务的特征。但是很显然的是,我们并不能做到这一点。很多时候,在设计系统的初期,是基本不可能预见到会接入什么样的业务的。所以这条思路是不行的。

可行的是,让内核不具有任何的业务特征。如果一个内核不具有任何的业务特征,那么它就可以接入各种业务特征。所以其实质而言,所谓Micorkenel,我的理解是:

微内核中实现必不可少的功能,但是这些功能应该与具体业务特征无关,而仅仅与接入各种业务的方式有关。

也可以从《Unix编程艺术》中的“提供机制,而不是策略”来理解Microkernel。我认为,Microkenel设计模式中的内核就是提供机制,剩余的策略都是围绕内核来构建,但是并不是属于内核的一部分。于是所有的接入业务,包括其内部实现,都只是一种策略。

机制是一种更加高层次的抽象,因此也越稳定。

在内核设计了这种机制后,我们自己也可以作为一个业务方,利用这种机制实现自己的策略。我们的实现和别的业务方在抽象层次上是平等的。不过可以利用一些内核所不暴露给第三方的特殊接口,实现一些比较特殊的功能。这样就可以引入了Microkernel设计模式里面的两个其他角色:

  • 内部服务器(internal server):扩展了内核提供的功能,是一个提供额外功能的独立组件。微内核通过服务请求调用内部服务器的功能,因此内部服务器可以封装一些与底层硬件或软件系统相关的细节;
  • 外部服务器(external server):是使用微内核实现其底层应用领域视图的组件。视图是抽象层,建立在微内核提供的不可分割的服务的基础上。不同外部服务器为特定应用领域实现了不同的策略;

这是一种针对不同平台的说法。就侧重业务而言,并且依据我个人的理解为,它应该被表述为:

  • 内部服务器:扩展了内核提供的功能,是一个提供额外功能的独立组件。该组件由维护内核的团队维护,可以利用未被暴露出去的“特权”服务实现某些特性,以支持客户端调用;
  • 外部服务器:是利用微内核实现的与业务相关的服务。可以被客户端直接调用;

注意的是,无论是内部服务器还是外部服务器,都是一个独立的组件,并且应该支持可插拔。可插拔意味着,内外部服务器是可以随时增加,减少或者替换的。这是满足扩展性的一个核心要求。

微内核还可以增加一个适配层。但是这个适配层是可选的。对于简单的应用来说,加上一个适配层可能过于复杂,太重了。但是如果需要避免客户端对内外部服务器的直接依赖,那么就需要加上这个适配层。或者说,希望对客户端暴露一个统一的api,那么也需要加上这个适配层。但是直接依赖于内外部服务器,对于大多数应用来说,应该不会出现太大的问题。

于是我们现在可以得到整个系统的划分了:


Microkernel设计模式结构

就图而言,越是往中心,其变化就越少,就越稳定;越是往外边,就越贴近业务,知道最外面的真的业务——客户端。

例子

我想用我在可配置前端页面的解决方案里面的例子来作为一个说明:

可配置页面结构

我在那里要设计的是一个可配置的页面,它基本上遵循了Microkernel的设计模式(虽然我设计的时候并没有系统的学习Microkernel设计模式的理论)。我在文中提及的一点是,因为我无法预料到将来页面会有多少组件,会有多少预定义的动作。所以我设计了一个小巧而精致的内核,内核里面没有定义任何组件,它提供的是通信模块,事件模块,Module模块和model模块。这些模块的实现里面并不含有任何与业务相关的信息。所以可以将其称为一个业务无关的核心。

于此同时,我预定义了一大批的组件,如输入框,复选框;还预定义了部分事件。这部分预定义的组件组成的预定义Module,其实就是充当了内部服务器的角色。所不同的是,这些组件并没有用到什么“特权服务”,它使用的接口与暴露给自定义组件的接口是一致的。

同样道理,第三方module就是充当了一个外部服务器的角色。注意的是,这个例子里面我并没使用一个适配层。

后记

这只能算是我对于Microkernel的一个简单理解。其实我描述的Microkernel与书中提及的有挺大的差异。一者是我理解可能有偏差,另外一个可能是我在将这个设计模式与具体业务结合起来的时候,其中更改了一些概念。读者应该注意区分。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 220,367评论 6 512
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,959评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 166,750评论 0 357
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,226评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,252评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,975评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,592评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,497评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,027评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,147评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,274评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,953评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,623评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,143评论 0 23
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,260评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,607评论 3 375
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,271评论 2 358

推荐阅读更多精彩内容