架构模式 - 微内核模式

1. 微内核模式简介

微内核(Microkernel)架构模式结构如下图所示,有时也被称为插件架构模式(Plug-in Architecture Pattern),通过插件向核心应用添加额外的功能,可以实现功能的独立和分离。

微内核架构包含两部分组件,即内核系统(Core system)和插件(Plug-in Component)。微内核架构的内核系统通常提供系统运行所需的最小功能集,插件是独立的组件,包含特定的处理、额外的功能和自定义代码,用来向内核系统增强或扩展额外的业务能力。

微内核是内核的一种精简形式。将通常与内核集成在一起的系统服务层被分离出来,变成可以根据需求加入选件  这样就可提供更好的可扩展性和更加有效的应用环境。使用微内核设计,对系统进行升级,显然只要用新模块替换旧模块,不需要改变整个系统架构。

那么插件是什么?插件一般由以下几部分组成:插件暴露的接口(一般称为叫API),插件内部实现,插件扩展点以及插件配置。其中插件扩展点我们一般设计为SPI(Service Provider Interface,服务提供接口)。

微内核模式的本质是管理插件以及协调插件之间的调用。插件插件本身是一个很大粒度的扩展点,可以整个被替换。同时插件可以提供自己的小粒度扩展点。这样整个系统就是由一个微内核加很多插件组成一个具备很强扩展性的系统。

2. 微内核模式在Dubbo中的应用

微内核架构风格在Dubbo中应用广泛,通信框架Mina、Netty和Grizzly,序列化方式Hession、JSON,传输协议Dubbo、RMI等都是这一架构风格的体现。我们可以通过简单的配置就能对这些具体实现进行排列组合构成丰富的运行时环境。       微内核架构风格提供的是一种解决扩展性问题的思路,Dubbo中实现这一思路的是SPI(Service Provider Interface)机制。

JDK提供了服务实现查找的一个工具类java.util.ServiceLoader来实现SPI机制。当服务的提供者提供了服务接口的一种实现之后,在jar包的META-INF/services/目录同时创建一个以服务接口命名的文件,该文件里配置着实现该服务接口的具体实现类。而当外部程序装配这个模块的时候,就能通过该jar包META-INF/services/里的配置文件找到具体的实现类名,并装载实例化,完成模块的注入。基于这样一个约定就能很好的找到服务接口的实现类,而不需要在代码里硬编码指定。Dubbo基于JDK中的SPI机制并做了优化,不会一次性实例化扩展点的所有实现并做了异常处理。

Dubbo提供专门的@SPI注解,只有添加@SPI注解的接口类才会去查找扩展点实现,查找位置包括META-INF/dubbo/和META-INF/services/,而META-INF/dubbo/internal/中则定义了各项用于供Dubbo本身使用的内部扩展。举例来说,前面提到Dubbo对传输协议提供了Hessian、Dubbo等多种实现,Dubbo内部通过扩展点的配置确定使用何种机制。在dubbo-rpc-default工程和dubbo-rpc-hessian工程中,我们在META-INF/dubbo/internal/目录下都发现了com.alibaba.dubbo.rpc. Protocol配置文件,但里面的内容分别指向了com.alibaba.dubbo.rpc.protocol.dubbo.DubboProtocol和com.alibaba.dubbo.rpc.protocol.hessian.HessianProtocol类,意味着当我们引用某个具体工程时,通过该工程中的配置项就可以找到相应的扩展点实现。dubbo-rpc-default工程的配置见下图。

ExtensionLoader是实现扩展点加载的核心类,我们在上面例子的配置中确定了protocol的实现类,然后ExtensionLoader通过以下方式获取该类的实例:

我们注意到ExtensionLoader有个getAdaptiveExtension方法,该方法的命名源于@Adaptive注解。ExtensionLoader注入的扩展点是一个Adaptive实例,直到扩展点方法执行时才决定调用哪一个扩展点实现。Dubbo使用URL对象传递配置信息,扩展点方法调用会根据URL参数中包含的Key-Value实现自适应,而URL的Key通过@Adaptive注解在接口方法上提供。如在下面的例子中,对于bind方法定义,Adaptive实现先查找"server" Key,如果该Key没有值则找“transport” Key值,从而决定加载哪个具体扩展点:

而在Dubbo配置模块中,扩展点均有对应配置属性或标签,通过配置指定使用哪个扩展实现,如<dubbo:protocol name= "dubbo" />即代表应该获取dubbo协议扩展点,在调用过程中,Dubbo会在URL中自动加入相应的Key-Value对。

对于Dubbo的整体架构,Microkernel作为一种架构风格只负责组装功能而所有功能通过扩展点实现。Dubbo自身功能也是基于这一机制实现,所有功能点都可被用户自定义扩展和替换。所有扩展点定义都通过传递携带配置信息的方式在运行时传入Dubbo,确保整个框架采用一致性数据模型。

如果对文章感兴趣,可以关注我的微信公众号:程序员向架构师转型,或扫描下面的二维码。

我出版了《系统架构设计:程序员向架构师转型之路》、《向技术管理者转型:软件开发人员跨越行业、技术、管理的转型思维与实践》、《微服务设计原理与架构》、《微服务架构实战》等书籍,并翻译有《深入RabbitMQ》和《Spring5响应式编程实战》,欢迎交流。

发布了92 篇原创文章 · 获赞 9 · 访问量 11万+

猜你喜欢

转载自blog.csdn.net/lantian08251/article/details/99294265
今日推荐