架构模式 - 微内核模式
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响应式编程实战》,欢迎交流。
架构模式 - 微内核模式相关推荐
- 针对架构设计的几个痛点,我总结出的架构原则和模式
本文作者介绍了架构设计的原则以及什么是架构,并分析了4种常用的软件架构模式,分别是分层架构.事件驱动架构.微内核架构和微服务架构.点击阅读原文可查看完整PPT. 分层架构 分层架构是最常见的架构,也被 ...
- Serverless:微服务架构的终极模式(文末赠书)
微服务的生态和实践已经比较成熟,其设计方法.开发框架.CI/CD工具.基础设施管理工具等,都可以帮助企业顺利实施微服务.然而,微服务远没有达到完美,它在架构.开发.基础设施方面仍然面临新的挑战. 微服 ...
- 浅析三层架构与MVC模式的区别
浅析三层架构与MVC模式的区别 三层架构介绍: (点击链接即可见三层架构) MVC模式介绍: MVC全名是Model ViewController,是模型(model)-视图(view)-控制器(co ...
- 三层架构和MVC模式
1.三层架构 三层架构(3-tier application) 通常意义上的三层架构就是将整个业务应用划分为:表现层(UI).业务逻辑层(BLL).数据访问层(DAL).区分层次的目的即为了" ...
- 微服务架构的终极模式?
点击上方"朱小厮的博客",选择"设为星标" 后台回复"书",获取 后台回复"k8s",可领取k8s资料 微服务的生态和实 ...
- Atitit. 数据约束 校验 原理理论与 架构设计 理念模式java php c#.net js javascript mysql oracle...
Atitit. 数据约束 校验 原理理论与 架构设计 理念模式java php c#.net js javascript mysql oracle 1. 主键1 2. uniq index2 3. ...
- android 通知写法_Android架构设计MVP模式第(二)篇,如何减少类爆炸
code小生 一个专注大前端领域的技术平台公众号回复Android加入安卓技术群 作者:LooperJing 链接:https://www.jianshu.com/p/3a17382d44de 声明: ...
- 从零开始学架构——FMEA故障模式与影响分析
1 FMEA介绍 FMEA(Failure mode and effects analysis,故障模式与影响分析)又称为失效模式与后果分析.失效模式与效应分析.故障模式与后果分析等,专栏采用&quo ...
- Serverless:微服务架构的终极模式
微服务的生态和实践已经比较成熟,其设计方法.开发框架.CI/CD工具.基础设施管理工具等,都可以帮助企业顺利实施微服务.然而,微服务远没有达到完美,它在架构.开发.基础设施方面仍然面临新的挑战. 微服 ...
最新文章
- 中国研制量子计算机成功,中国宣布研发量子计算机,这次很可能真的要领先世界!速度太快!...
- springmvc框架介绍_Java修行第071天 ---SpringMVC(上)
- vue-textarea 自适应高度
- Python 中的用户自定义类型
- node 压缩图片_为了你安全压缩图片我操碎了心
- VMware Workstation Pro 14.1.1 正式版
- jzoj4788-[NOIP2016提高A组模拟9.17]序列【差分,贪心】
- mybatis学习(11): sql server配置管理器请求失败或服务未及时响应
- PDS+VL Motion对发动机曲轴系统不平衡载荷进行仿真分析
- Bolt界面引擎中XLUE布局XML文件节点属性配置详解
- 输出100以内的素数
- 通过Java实现恩尼格玛密码机
- 解决centos 7 打开php文件直接下载问题
- 有道云脑图 mindmap文件必须会员才能导出
- 2021年全球及中国酒店行业发展现状及竞争格局分析,全球酒店行业景气度大幅回暖「图」
- 微积分小糊涂,国庆节大快乐!
- 如何解决“'mvn' 不是内部或外部命令,也不是可运行的程序或批处理文件。”问题
- 关于Gateway实现JWT登陆拦截过滤器
- 介绍理想工作计算机 英语作文,我的理想工作(My Ideal Job)
- 如何理解柯里化|函数式编程
热门文章
- Delphi 编写数字签名验证并获取签名信息
- node JS獲取GPS_node学习笔记(三十八)
- python数据分析及可视化(九)pandas数据规整(分组聚合、数据透视表、时间序列、数据分析流程)
- Java PDF数字签名(五)—Java 给PDF签名时添加可信时间戳
- Xmanager Enterprise 5破解版
- strassen矩阵乘法 java_矩阵乘法Strassen算法
- 【342期】SpringBoot + Redis 布隆过滤器防恶意流量击穿缓存的正确姿势!
- 2020东南大学网络空间安全保研夏令营(预推免)经验
- sql injection violation, syntax error: ERROR
- 程序员每天每周每月每年应该做的事