本文转载自微信公众号《是的练级攻略》,作者是是。转载本文请联系yes的练级指导公众号。你好,我是。RPC的核心在上一篇已经讲过了,想必一个RPC通信的大致流程和基本原理已经清楚了。本文使用Dubbo来谈谈微内核的设计思路,不会涉及到Dubbo具体细节的实现。与Dubbo强相关的内容会在后面的文章中写到。所以今天的重点是微内核,我最开始是从操作系统中了解到这个概念的,但是操作系统的微内核和Dubbo相关的微内核是不一样的。Dubbo的微内核是广义的微内核,而操作系统只是针对内核实现的。所以你肯定不知道,别着急,慢慢听我说。我们先来看看操作系统的微内核。操作系统中的微内核在维基百科上搜索微内核出现:在计算机科学中,微内核(英文:Microkernel,μ-kernel)是内核的一种设计架构,它由尽可能精简的程序组成,以实现操作系统所需的最基本功能,包括底层地址空间管理、线程管理和进程间通信。本词条属于操作系统技术,所以这里的微内核是指操作系统的内核设计,与宏内核架构相对应。Linux是一个单片内核架构。我们都知道操作系统是一个中间层,为我们管理底层硬件资源,为上层服务提供接口。提供进程管理、内存管理、文件系统、进程通信等功能。像Linux这样的宏内核设计将这些功能作为内核实现,而微内核只保留最基本的功能。比如进程管理、内存管理等被留下,文件管理等功能被剥离出来,成为用户空间的独立进程提供服务。看看维基百科上的这张图,应该就很清楚了。在微内核架构中将宏内核中的一些功能分离到用户态,从而减少了内核代码量。更少的代码意味着更少的潜在错误,并且更容易解决问题。系统也更稳定,更不容易崩溃,因为这些服务从内核中移除并在用户空间中运行。如果出现问题,内核会重新启动服务,而不是像以前那样整个内核GG。以显卡驱动为例,如果出现问题,就会出现蓝屏。如果是微内核设计,可以重启显卡驱动。听起来微内核不错?不,还是说说微内核的缺点吧。首先是性能问题。由于很多函数作为独立的进程运行在用户空间,宏内核中的函数调用就变成了进程间调用,涉及进程间通信,伴随着内核态和用户态的来回切换。我们知道这种上下文切换是很耗时的。这个性能问题有点大。然而,微内核设计并没有那么简单。如果你想变得聪明,降低耦合,提高可移植性,你需要一个好的设计。按照Linus的说法:“如果GNU内核(微内核架构)早在去年春天就完成了,我将根本不会开始我的项目(Lniux)。”GNUHurd采用微内核架构,设计过于精致,开发速度慢,性能长期无法提升。当时,Linus和Minix的作者Andrew就操作系统的宏内核和微内核的质量在网上掀起了一波口水战。让我们回顾一下那段历史,还是挺有意思的。由于AT&T将Unix商业化,大学不能免费使用Unix。作为一名大学教授,Andrew构建了自己的操作系统Minix用于教学。Andrew当时的学术趋势是微内核架构,将核心功能模块化,分成几个独立的进程,运行在不同的地址空间,以提高代码的可移植性和系统安全性。所以Minix是按照微内核架构写的,当然还有上面提到的GNUHurd。当时Linus正在上大学,他爷爷送给他一块Intel80386。Linus也看到了Andrew的课本,并根据书上的内容编写了Linux。但是Linus并没有遵循微内核的设计,而是像Unix一样采用了宏内核架构。Andrew教授看到了Linux,然后在comp.os.Minix上批评道:monolithickernel的设计是有害的。Linux内核耦合度太高,完全为Intel80386设计,处理器架构演进迅速,操作系统要轻便。Andrew还提到:1991年使用宏内核来设计操作系统,这是一个巨大的倒退。一天后,莱纳斯反驳道。他说Minix的设计存在缺陷。从哲学和美学的角度来看,微内核确实不错,但是你可以看到GUNHurd还没有开发出来。那么操作系统取决于硬件的特性,所以内核本身不需要过于便携,但应用程序的可移植性很重要。Linux比Minix更容易移植。而且linux本来就是给自己做的,所以适合80386,如果要移植到其他平台,代码都是开源的(当时要买minix源码),想要的可以做他们自己。Andrew也发了一波回应:Minix有局限性因为我是教授,因为大部分学生只能在低端机器上使用,所以对系统的硬件要求足够低,虽然你的Linux是免费的,但是硬件所需的是昂贵的。其实可以看出,两者并没有就宏内核和微内核的技术细节进行深入探讨,而是互相把握:你的Minix代码还是要收费的,Linux需要的硬件是进行“攻击”如此昂贵。》,所以叫口水战。反正口水战后双方都没有改变设计,而是Linus引入了微内核的思想,提高代码和可移植性。QNX是市场上成功的微内核设计。黑莓用的就是这个操作系统,汽车市场几乎都用QNX,我多年前用过黑莓手机,当时感觉不对劲,宏内核,提一下linux就够了。架构都有成功的产品,所以还是选择的问题,没有一个完全压倒另一个,具体的我就不多说了,今天的主角其实就是广义上的微内核,MicrokernelinDubboDubbo的微内核是从广义上讲,它的思想是:核心系统+插件。说白了,这个微内核就是把不变的功能抽象为核心,把变化的功能扩展为插件,符合开放和关闭,并且更容易扩展和维护。小霸王游戏机大家应该都玩过。它看起来是这样的,它的设计可以认为是微内核设计。本体本身就是核心系统,游戏芯片就是外挂。我们想玩什么游戏就插什么,简单方便,又不影响身体本身。如果游戏芯片不抽象成外挂类型,会不会很难?改变游戏将成为一个问题。因此,微内核架构的本质就是将变化的部分抽象成插件,从而在不影响整体稳定性的情况下,快速方便地满足各种需求。这就是微内核架构的本质。这里再说一个细节,比较真实(只是我个人的想法)。MarkRichards在?的微内核章节中提到,微内核架构模式的核心系统传统上只包含使系统运行所需的最少功能。从字面上看,Mark认为核心系统是指独立运行的提供基本功能的最小模块。比如vscode、idea、chrome等设计,都符合Mark认为的核心设计。核心系统提供基本和必要的功能,可以独立运行。比如vscode的核心是编辑器,不需要插件就可以独立运行,然后还有丰富的插件可以满足一些特殊的需求,扩展核心系统的功能。认为核心一定是能够使系统运行的最小功能模块的想法可能会产生误导。我认为核心不一定需要独立运行并提供基本功能,允许系统运行的最小组织模块也是核心。两种说法的区别在于,如果只有核心,系统能否正常运行。vscode在没有插件的情况下依然可以运行,可以提供基本的功能,但是小霸王游戏机没有游戏芯片,跑着玩个球很寂寞。但是小霸王不是微内核吗?个人认为区分变化和不变性,把变化封装成插件,就叫微内核设计。比如Dubbo可以支持很多协议,各种负载均衡扩展,集群扩展等等,它自身的一些功能也是通过扩展点来实现的,没有插件是无法运行的。这样的核心就像胶水一样,最后结合各种插件提供服务。没有插件,系统就没有意义。所以我觉得核心系统不一定需要能够独立运行,让系统运行的最小组织模块也是核心。.因此,我认为马克说的不准确,容易误导。当然,这是文上的细节,核心概念是一样的:把核心抽象出来,剥离出来,改成插件。微内核设计的好处这里的微内核是指广义的微内核。作为框架或软件,可扩展性非常重要。因为一个框架、一个软件有成千上万的用户,不同的人有不同的需求。作为框架维护者和软件开发者,你有精力和能力去满足所有用户的需求吗?做梦,它不存在。有些想法你想不到。比如之前看到的vscode里面,有一个“坤坤励志老师”的插件。默认情况下,你写完一个小时的代码,蔡徐坤就会为你跳舞。你太美了,让你歇歇歇……来感受一下?Sodoit如果一个框架或者软件想要被更多人使用,不仅要功能齐全、性能好、易用,而且让用户自己动手DIY,做各种定制也是非常重要的!Dubbo的成功其实离不开它的微内核设计和定制化开发在很多场景下的运用。毕竟要满足公司的一些特殊需求,还要稍微修改一下。当然,并不是所有的东西都需要微内核。微内核看似很方便,但设计起来并不方便。需要仔细设计以抽象各种扩展点。除了自身的功能外,还需要对插件的生命周期进行管理,插件如何连接,如何通信等等。有的还需要沙箱隔离,防止插件污染整个系统等等,原来内部的函数调用变成了插件之间的通信,反正设计起来很复杂。一般微内核适用于框架的设计,或者一些规则引擎的设计。只有复杂多变的需求场景才需要使用微内核。和普通的简单项目一样,直接搞到最后就好了。不要盲目操作,炫耀会摔断腿。最后,微内核其实是一种架构思想,可以是框架层面的,也可以细化到某个模块的设计。说到底就是把变化封装成插件,可以插拔,拥抱变化。当然今天也提到了操作系统的微内核,这和广义上的微内核不是一回事。至于Dubbo的微内核,离不开它的SPI,后面会深入写文章,等我。
