Dubbo——增强SPI的实现

一、前言
在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类进行包装后返回。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/313492.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【 .NET Core 3.0 】框架之二 || 后端项目搭建

前言至于为什么要搭建.Net Core 平台,这个网上的解释以及铺天盖地,想了想,还是感觉重要的一点,跨平台,嗯!没错,而且比.Net 更容易搭建,速度也更快,所有的包均由Nuget提供…

怎样打造一个分布式数据库

本文来自:https://www.infoq.cn/article/how-to-build-a-distributed-database 文章写得很好,备份防丢失 在技术方面,我自己热衷于 Open Source,写了很多 Open Source 的东西,擅长的是 Infrastructure 领域。Infrastru…

向net core 3.0进击——Swagger的改变

前言十一小长假在不知不觉间可都没了,在这个小尾巴的空隙,把这两天鼓捣的net core 3.0升级过程记录一下,首先还是根据之前的顺序一个个补充进来,先从Swagger的变化说起(新建工程什么的不多说了,就是选择的时…

Dubbo——面试问题集(1~3)

1、默认使用的是什么通信框架&#xff0c;还有别的选择吗? Dubbo默认使用netty&#xff0c;还支持mina, grizzy 配置方式&#xff1a; <dubbo:protocol name“dubbo” port“9090” server“netty” client“netty” codec“dubbo” serialization“hessian2” charset…

Dubbo——面试问题集(4~14)

4、默认使用什么序列化框架&#xff0c;你知道的还有哪些&#xff1f; 在Dubbo RPC中&#xff0c;同时支持多种序列化方式&#xff1a; dubbo序列化&#xff0c;阿里尚不成熟的java序列化实现。 hessian2序列化&#xff1a;hessian是一种跨语言的高效二进制的序列化方式&…

向net core 3.0进击——April.WebApi从2.2爬到3.0

前言在之前对Swagger的变化做了调整后&#xff0c;就开始想着要不把之前的工程升级得了&#xff0c;这样就还是个demo工程&#xff0c;来做各种测试&#xff08;当然还是因为懒&#xff09;&#xff0c;这就有了今天这个比较折腾的一步。升级之路首先&#xff0c;April.WebApi工…

共识与拜占庭将军问题

1、共识基础 人们对共识机制的研究其实由来已久&#xff0c;从上世纪70年代就开始了相关研究&#xff0c;其目的是为了解决分布式系统中的一致性问题。Fischer, Lynch 和 Patterson在1985年发表的论文中提出了可以说是最重要的分布式系统定理&#xff1a;FLP不可能定理&#x…

C#刷遍Leetcode面试题系列连载(2): No.38 - 报数

前言前文传送门&#xff1a;上篇文章中我们主要科普了刷 LeetCode 对大家的作用&#xff0c;今天咱们就正式进行 LeetCode 算法题分析。很多人都知道计算机中有种思想叫 递归&#xff0c;相应地也出现了很多算法。解决递归问题的要点有如下几个:找出递归的关系比如&#xff0c;…

Bumblebee微服务网关之负载策略

作为一个微服务网关&#xff0c;提供不同负载策略配置是一项非常重要的主要功能&#xff1b;在这方向Bumblebee提供了非常好的支持。Bumblebee可以针对不同路径制定各自的负载策略&#xff0c;更重要的是这些调整都可以在网关运行过程动态调整&#xff01;动态策略调整可以更好…

FastDFS分布式文件系统设计原理

FastDFS是一个开源的轻量级分布式文件系统&#xff0c;由跟踪服务器&#xff08;tracker server&#xff09;、存储服务器&#xff08;storage server&#xff09;和客户端&#xff08;client&#xff09;三个部分组成&#xff0c;主要解决了海量数据存储问题&#xff0c;特别适…

14年百度深度学习校招题目

一、简答题1.深度神经网络目前有哪些成功的应用&#xff1f;简述原因。(10分) 2.列举不同进程共享数据的方式&#xff08;至少三种&#xff09;。(10分) 3.对于N个样本&#xff0c;每个样本为D维向量&#xff0c;采用欧式距离使用KNN做类预测。(10分) 1).给出预测时间复杂度。 …

HDFS分布式文件系统设计原理

Hadoop分布式文件系统(HDFS)是一种被设计成适合运行在通用硬件上的分布式文件系统。HDFS是一个高度容错性的系统&#xff0c;适合部署在廉价的机器上。它能提供高吞吐量的数据访问&#xff0c;非常适合大规模数据集上的应用。要理解HDFS的内部工作原理&#xff0c;首先要理解什…

Magicodes.IE已支持导出Word、Pdf和Html

关于Magicodes.IE导入导出通用库&#xff0c;通过导入导出DTO模型来控制导入和导出&#xff0c;支持Excel、Word、Pdf和Html。GitHub地址&#xff1a;https://github.com/xin-lai/Magicodes.IE特点需配合相关导入导出的DTO模型使用&#xff0c;支持通过DTO以及相关特性控制导入…

AOP框架Dora.Interception 3.0 [1]: 编程体验

.NET Core正式发布之后&#xff0c;我为.NET Core度身定制的AOP框架Dora.Interception也升级到3.0。这个版本除了升级底层类库&#xff08;.NET Standard 2.1&#xff09;之外&#xff0c;我还对它进行大范围的重构甚至重新设计。这次重构大部分是在做减法&#xff0c;其目的在…

分布式缓存——一致性哈希算法

本文主要来自&#xff1a;http://www.zsythink.net/archives/1182 摘录防丢失 一致性哈希算法定义 一致性哈希算法在1997年由麻省理工学院提出的一种分布式哈希&#xff08;DHT&#xff09;实现算法&#xff0c;设计目标是为了解决因特网中的热点(Hot spot)问题&#xff0c;初…

H264学习_基本数据结构

&#xfeff;&#xfeff;原文地址:http://blog.csdn.net/yangzhongxuan/article/details/8003494 名词解释 场和帧 &#xff1a; 视频的一场或一帧可用来产生一个编码图像。在电视中&#xff0c;为减少大面积闪烁现象&#xff0c;把一帧分成两个隔行的场。 片&#xff1a…

【巴马火麻茶】调节三高、治疗失眠、排毒减肥,轻松get长寿的秘密!

水&#xff0c;无色无味&#xff0c;是人类的生命源泉对于长期坐办公室的程序员朋友来说每日都得喝水但又觉得寡淡的白开水缺少点乐趣于是&#xff0c;茶叶就成了大家泡水的首选今天&#xff0c;队长要为大家介绍一款养生好茶巴马火麻茶每天一杯&#xff0c;轻松get长寿的秘密火…

「合规」震惊!地图可视化竟能如此玩,零门槛,全免费,效果远胜主流作图工具!...

在数据可视化领域&#xff0c;早晚会遇上地图可视化的需求&#xff0c;一个高大上的地图可视化&#xff0c;瞬间拔高整个报告的层次。Excel催化剂有幸接触并将地图可视化完全落地于Excel中完成。相对主流Python、R、PowerBI等作图工具&#xff0c;在易用性、灵活性和功能的强大…

Opencv SVM demo

&#xfeff;&#xfeff;转载自http://www.opencv.org.cn/opencvdoc/2.3.2/html/doc/tutorials/ml/introduction_to_svm/introduction_to_svm.html 支持向量机 (SVM) 是一个类分类器&#xff0c;正式的定义是一个能够将不同类样本在样本空间分隔的超平面。 换句话说&#xff…

BeetleX之FastHttpApi服务使用详解

BeetleX是一个轻量级高性能的开源TCP通讯应用框架&#xff0c;通过BeetleX可以轻松扩展不同场的TCP应用服务和客户端组件。框架开源地址:https://github.com/IKende/BeetleX组件特点高性能TCP通讯组件,轻易实现百万级RPS通讯交互提供完善的会话管理机制和协议分析规则提供简洁的…