思考微内核
关于微内核,我最早印象来自于操作系统。Andrew Tanebaum同Linus Torvalds的那场著名论战将微内核这个名词深深的印入了我的脑海,不过说实话,在很长一段时间内,我只是记住了这个词而已,一直没有弄清楚微内核究竟是怎样一回事。再次听说微内核是在工作以后,不过是在一个完全不同于操作系统的领域中,很多人都在说自己开发的系统是微内核的。同样,我也只是记住了名词,但是脑中却产生了一些困惑:究竟什么才是微内核,它们所说的微内核同操作系统中的微内核有什么关系。深入Spring为我打开了微内核的大门,因为微内核也存在于Spring之中。
在那场关于OS的著名论战中,Tanebaum老先生为我们解释了微内核以及与之对应的宏内核,他认为对于宏内核来说,整个操作系统就是一个整体,包括了进程管理、内存管理、文件系统等等,而对微内核来说,操作系统的大部分在内核之外,彼此间通过消息进行通信。换句话说,对于微内核来说,进程管理、内存管理、文件系统根本就不是微内核的一部分,这是一个看起来难以让人接受的结论,怎么能把操作系统内核的重要组成部分踢出去呢?请注意,我这里说的是,它们不是微内核的一部分,而不是说它们不是操作系统内核的一部分。有些让人糊涂,怎么又冒出一个内核。本着高内聚的原则,操作系统的实现让我们只需面对操作系统内核,而无需了解其内部实现。对于微内核的实现来说,其内部还会有一个内核,负责更加底层的内容,比如消息传递、中断管理、底层的进程管理等等,而我们作为用户所面对的内核不过是在这个内核之上构建起来的一个应用罢了。
其实,所谓的内核不过是在我们通常意义上的内核之中,还有一个更为基础的内核而已,在这一点上,操作系统和普通应用没有任何分别。比如作为普通的用户来说,我们通常会把应用服务器视作一个内核,而某些应用服务器在其内部有一个用来构建应用服务器的基础,比如JBoss前几个版本使用的JMX,这便是它的微内核,它为我们提供的各种各样的服务都是基于这个内核构建起来的。既然是作为基础,微内核的设计通常都具备良好的可扩展性,只有这样,我们才能够让我们的“内核”不断的发展壮大。JBoss已经为我们做了一个很好的演示,源源不断的新内容让我们可以享受更好的服务。
前面说过,Spring为我打开了微内核的大门,那么Spring的微内核在哪里呢?这便是DI容器。我们已经知道了,Spring已经不只是一个单纯的DI容器,还提供了许多其它的功能,比如AOP。如果我们只是简单的学会使用它们,那可就让一个很好的学习机会从身边溜走了。研究Spring的微内核,FactoryBean便是无论如何不可错过的,它是DI容器为我们参与容器组件组装过程中而提供的接口。有了它,我们就可以定制自己的组件组装过程,这样我们就有了机会对一个普通的JavaBean做手脚,就像使用Spring AOP中常用的ProxyFactoryBean所做的一样。FactoryBean让DI容器具备了可扩展性,这样,我们就不必把所有功能都做到Spring的DI容器中中去,而是作为一个FactoryBean对DI容器的功能进行扩展,对我们来说,因为大多数功能都是由Spring提供的,因此我们把它们视作了Spring“内核”的一部分,殊不知,其中还有一个叫做DI的微内核。除了Spring自身之外,现在已经有一些项目开始利用这个特性扩展Spring,比如,Acegi Security和Spring Modules。关于FactoryBean更多的细节,Spring参考文档是一个不错的去处。
有一些功能性的工作,我们即可以放到“微内核”中,也可以作为“微内核”的外挂存在像AOP功能,在Spring中,AOP是以外挂的形式存在,而在Hivemind中,它则被做到了内核之中。
这让我想起了《C++沉思录》上的经典论断,“库设计就是语言设计,语言设计就是库设计”。同样的同步功能,在Java中就是语言特征,而在C/C++中往往是以库的形式存在。在这里,语言就是我们的微内核,库就是微内核的外挂,而对普通的语言用户而言,这些东西都是我们可以直接拿过来用的,都属于我们的内核。按照这种说法,程序设计语言也是某种意义上的微内核,只不过,我们大多数时间内会直接同这个“微内核”打交道。
有一些微内核通过内部实现降低接口的复杂度,让用户使用起来简单了许多,同时也减少了用户无意而为的错误,这方面最好的例子就是现在已经让人习以为常的Garbage Collection,因为许多程序设计语言已经把它做到了语言特征,我们便无需忧虑内存管理了。既然微内核提供给接口给内核使用,我们当然也可以直接使用这些功能,比如,我们为JBoss添加自己的服务,比如我们使用FactoryBean扩展自己的功能,甚至为微内核的操作系统添加新的服务。只不过在大多数情况下,我们面对的是内核而已,其实,我们在使用程序设计语言时,早已熟悉了直接面对微内核。
这便是我所理解的微内核。