说到微内核架构,大家首先会想到的是Eclips、IDEA、OSGI、Spring Plugin、SPI等,这些都是我们熟知的微内核架构。

        微内核架构实现主要是插件化思想(Plug-in),是一套插件体系,最早的插件化方法是应用在操作系统之上,久而久之就有了微内核设计这一思想。

        了解微内核,需要先了解这个“内核”。

        在操作系统中,内核围绕于操作系统的核心功能,比如时钟中断、进程创建与销毁、进程调度、进程间通信等内核态的动作。而文件系统、内存管理、设备驱动等都被视为非内核能力,这部分会被放在用户态空间。

        微内核是相对于宏内核而言,宏内核包含了很多的底层程序功能,做的事情非常多,而且不是可拔插的,修改任意一个功能点,都需要整个程序联动,而且有可能引入一个bug,导致整个内核不可用,类似于一个功能复杂的单体系统,每次变更和交付成本都非常高,风险也非常大。

        而微内核只围绕于核心功能设计,他的功能实现都是相互独立的,其他非核心功能是通过用户态的独立进程以插件的方式加入进来的,微内核引擎负责管理进程、调度进程、进程之间通信。某一个功能出现问题时,由于其是独立的进程,不会对其他进程产生影响,也不会导致内核不可用。        

        微内核中,多个进程协调通信,需要进行系统调用,系统调用需要切换堆栈及保护进程现场,过程比较耗时。宏内核(也就是用户态)中,是通过函数调用完成各个模块之间合作,所以宏内核较微内核效率更高。

        通过操作系统微内核概念,可以类比到业务系统。一个系统,特别是经过微服务拆分之后的系统,都会服务于某个“内核”,多个核心功能通过微服务的方式拆分,服务之间通过通信交换数据。通过微内核解决了快速交付问题,实现了代码隔离,控制风险点的目的。

        Dubbo 采用微内核(Microkernel) + 插件(Plugin) 模式,简单来说就是微内核架构。微内核只负责组装插件。

        核心系统提供系统所需核心能力,插件模块可以扩展系统的功能。因此, 基于微内核架构的系统,非常易于扩展功能。

        我们常见的一些IDE,都可以看作是基于微内核架构设计的。绝大多数 IDE比如IDEA、VSCode都提供了插件来丰富自己的功能。

        正是因为Dubbo基于微内核架构,才使得我们可以随心所欲替换Dubbo的功能点。比如你觉得Dubbo 的序列化模块实现的不满足自己要求,没关系啊!你自己实现一个序列化模块就好了啊!

        通常情况下,微核心都会采用 Factory、IoC、OSGi 等方式管理插件生命周期。Dubbo 不想依赖 Spring 等 IoC 容器,也不想自已造一个小的 IoC 容器(过度设计),因此采用了一种最简单的 Factory 方式管理插件 :JDK 标准的 SPI 扩展机制java.util.ServiceLoader)。