一、前言
在Duboo剖析-整体架构分析中介绍了dubbo中除了Service 和 Config 层为 API外,其他各层均为SPI,为SPI意味着下面各层都是组件化可以被替换的,这也是dubbo比较好的一点。

二、JDK中标准SPI
JDK 中的 SPI(Service Provider Interface)是面向接口编程的,服务规则提供者会在 JRE 的核心 API 里面提供服务访问接口,而具体实现则由其他开发商提供。

JDBC 4 是基于 SPI 机制来发现驱动提供商提供的实现类,提供者只需在 JDBC 驱动实现的Jar 的 META-INF/services/java.sql.Driver 文件里指定实现类的方式暴露驱动提供者。例如规范制定者在rt.jar包里面定义了 数据库 的驱动接口 java.sql.Driver。 MySQL 实现的 Jar,如下:

public class com.mysql.jdbc.Driver extends com.mysql.jdbc.NonRegisteringDriver implements java.sql.Driver

下面我们写个测试代码,看看具体是如何工作的。

然后引入 MySQL 驱动的 Jar 包,执行结果如下。

driver:class com.mysql.jdbc.Driver,loader:sun.misc.Launcher$AppClassLoader@4554617ccurrent thread contextloader:sun.misc.Launcher$AppClassLoader@4554617c
ServiceLoader loader:null

可知找到了mysql的驱动,如果你在引入Oracle的驱动的jar包后在运行,则会输出找到了mysql和Oracle的驱动,这也说明了,JDK标准的SPI会同时把spi接口的所有的实现类都提前加载好。

关于JDK中SPI的原理和具体使用可以参考 Java 类加载器揭秘 中
一种特殊的类加载器 ContextClassLoader 章节。

三、Dubbo增强的SPI
Dubbo 的扩展点加载是基于JDK 标准的 SPI 扩展点发现机制增强而来的,Dubbo 改进了 JDK 标准的 SPI 的以下问题:

  • JDK 标准的 SPI 会一次性实例化扩展点所有实现,如果有扩展实现初始化很耗时,但如果没用上也加载,会很浪费资源。

  • 如果扩展点加载失败,就失败了,给用户没有任何通知。比如:JDK 标准的ScriptEngine,如果Ruby ScriptEngine 因为所依赖的 jruby.jar 不存在,导致 Ruby ScriptEngine 类加载失败,这个失败原因被吃掉了,当用户执行 ruby 脚本时,会报空指针异常,而不是报Ruby ScriptEngine不存在。

  • 增加了对扩展点 IoC 和 AOP 的支持,一个扩展点可以直接 setter 注入其它扩展点。

下面看看Dubbo增强的SPI实现的时序图:

  • 其中代码(1)获取当前SPI接口对应的ExtensionLoader

  • 代码(2)获取适配器实例,内部首先获取该spi对应的所有实现类的Class对象,然后创建适配器实例,最后注入该适配器依赖的其他扩展点。

  • 代码(8)根据名称获取具体的spi实现类,内部是创建一个实现类的实例,并使用warp类进行包装后返回。

Dubbo——增强SPI的实现相关推荐

  1. 分布式面试 - dubbo 的 spi 思想是什么?

    分布式面试 - dubbo 的 spi 思想是什么? 面试题 dubbo 的 spi 思想是什么? 面试官心理分析 继续深入问呗,前面一些基础性的东西问完了,确定你应该都 ok,了解 dubbo 的一 ...

  2. Dubbo的SPI机制对比传统的SPI做了哪些改进?Dubbo的IOC和AOP

    文章目录 1. JAVA的SPI机制 2. Dubbo的SPI机制 3. Dubbo的SPI源码解析 3.1 获取接口对应的 ExtensionLoader 3.2 根据入参的http获取对应的htt ...

  3. dubbo之SPI Wrapper分析

    写在前面 本文需要dubbo SPI的简单基础知识,对dubbo SPI不了解的朋友可以参考dubbo之SPI分析 . 源码!!!. 在dubbo之SPI分析 文章中我们分析了SPI机制,其中有种SP ...

  4. Dubbo - Dubbo的SPI机制

    国庆期间闲来无事,写了一个简单的小程序,小程序名称叫做 IT藏经楼.目的是分享这些年自己积累的一些学习材料,方面大家查找使用,包括电子书.案例项目.学习视频.面试题和一些PPT模板.里面所有材料都免费 ...

  5. Dubbo服务Spi机制和原理

    ​ 什么是Dubbo的spi机制? SPI 全称为 Service Provider Interface,是一种服务发现机制.SPI 的本质是将接口实现类的全限定名配置在文件中,并由服务加载器读取配置 ...

  6. Dubbo的SPI实现

    在Dubbo中,例如protocol的选择都是通过@SPI来实现的. 以ReferenceConfig获取相应配置的协议protocol作为扩展点为例子. private static final P ...

  7. 阿里面试真题:Dubbo的SPI机制

    点赞再看,养成习惯,微信搜一搜[三太子敖丙]关注这个喜欢写情怀的程序员. 本文 GitHub https://github.com/JavaFamily 已收录,有一线大厂面试完整考点.资料以及我的系 ...

  8. dubbo 自定义路由_高性能可扩展分布式RPC框架Dubbo内核原理揭秘

    一.前言 整体来说,一个公司业务系统的演进流程基本都是从单体应用到多体应用.在单体应用时,不同业务模块相互调用直接在本地 JVM 进程内就可以完成;而变为多个应用时,相互之间进行通信的方式就不能简单的 ...

  9. 高性能可扩展分布式RPC框架Dubbo-内核原理揭秘

    一.前言 整体来说,一个公司业务系统的演进流程基本都是从单体应用到多体应用.在单体应用时,不同业务模块相互调用直接在本地 JVM 进程内就可以完成;而变为多个应用时,相互之间进行通信的方式就不能简单的 ...

最新文章

  1. C#鼠标右键弹出菜单
  2. error: RPC failed; curl 56 GnuTLS recv error (-54): Error in the pull function.
  3. IBM® Bluemix 上运行ASP.NET Core
  4. 高晓松侃5G!2019开年大讲揭示运营商的秘密
  5. 卡尔曼滤波原理(二):扩展卡尔曼
  6. 孙鑫VC学习笔记:第十七讲 (一) 用剪贴板实现进程间的通信
  7. 在Vue中使用Aliplayer,做视频播放或者视频监控
  8. 计算机应用专业配置标准,计算机应用专业技能抽查考试标准.doc
  9. python识别图片表格内容
  10. 各种串口助手工具分享
  11. 动作游戏设计三部曲 之一 交互至上
  12. 夜雨数竞笔记-中值问题(5)-泰勒中值定理
  13. mysql 8.0 如何改密码(转载
  14. 小学期 BlueSky学长与友人帐
  15. GateWay简单的使用、集群搭建和数据库动态配置
  16. class_weights的计算方式
  17. mysql日期函数之DATEDIFF() if()用法 case when用法
  18. Switch可以用string做参数吗
  19. 使用Socket实现类似微信群聊的功能
  20. 怎么用matlab算磁滞,磁性材料磁化曲线和磁滞回线的Matlab绘制与拟合.doc

热门文章

  1. 【iVX 初级工程师培训教程 10篇文拿证】07 08 新闻页制作
  2. sql limit不接具体数字_这21个写SQL的好习惯,你要养成呀
  3. 少女为什么会身上香香的?
  4. 落在我手里,今天你能嫁出去算我输!
  5. 叫板BBC!80后湖南姑娘,花3年首次拍出水下的中国,惊艳了全世界
  6. 只有学霸才懂的学习技巧,看完脑洞大开,绝对涨姿势!
  7. 像小猪佩奇那样生活,需要多少钱?
  8. 美国硅谷预测10年后的世界,再不懂你就落伍了
  9. 阅读Java_如何阅读 Java 开源代码?
  10. qdialog 只有点击才能获得焦点_4 个突破点,让你的 Banner 点击率提升10倍