首页 > 其他分享 >博学谷学习记录 自我总结 用心分享 | Dubbo SPI机制

博学谷学习记录 自我总结 用心分享 | Dubbo SPI机制

时间:2023-05-14 18:13:19浏览次数:38  
标签:Dubbo java 实现 博学 SPI 机制 加载

SPI简介
SPI 全称为 Service Provider Interface,是一种服务发现机制,刚好与java jdk的类加载机制进行了一个互补。SPI 的本质是将接口实现类的全限定名配置在文件中,并由服务加载器读取配置文件,加载实现类。这样可以在运行时,动态为接口替换实现类。正因此特性,我们可以很容易的通过 SPI 机制为我们的程序提供拓展功能。SPI 机制在第三方框架中也有所应用,比如 Dubbo 就是通过 SPI 机制加载所有的组件。不过,Dubbo 并未使用 Java 原生的 SPI 机制,而是对其进行了增强,使其能够更好的满足需求。在 Dubbo 中,SPI 是一个非常重要的模块。基于 SPI,我们可以很容易的对 Dubbo 进行拓展。如果大家想要学习 Dubbo 的源码,SPI 机制务必弄懂。接下来,我们先来了解一下 Java SPI 与 Dubbo SPI 的用法,然后再来分析 Dubbo SPI 的源码。

Dubbo 并未使用 Java SPI,而是重新实现了一套功能更强的 SPI 机制。Dubbo SPI 的相关逻辑被封装在了 ExtensionLoader 类中,通过 ExtensionLoader,我们可以加载指定的实现类。

 

关于Java SPI
在了解Dubbo的SPI机制之前,我们先了解下Java提供的SPI (service provider interface) 机制,SPI是JDK内置的一种服务提供发现机制。目前市面上很多框架都用它来做服务的扩展发现。简单的说,它是一种动态替换发现的机制。

举个简单的例子,我们想在运行时动态给它添加实现,你只需要添加一个实现,然后把新的实现描述给JDK知道就行了。大家耳熟能详的如JDBC,日志框架都有用到。

实现 SPI 需要遵循的标准
我们如何去实现一个标准的 SPI 发现机制呢?其实很简单,只需要满足以下提交就行了 :

需要在 classpath 下创建一个目录,该目录命名必须是:META-INF/service
在该目录下创建一个 properties 文件,该文件需要满足以下几个条件 :
2.1 文件名必须是扩展的接口的全路径名称
2.2 文件内部描述的是该扩展接口的所有实现类
2.3 文件的编码格式是 UTF-8
通过 java.util.ServiceLoader 的加载机制来发现

 SPI 的实际应用

SPI 在很多地方有应用,可能大家都没有关注,最常用的就是 JDBC 驱动,我们来看看是怎么应用的。

JDK 本身提供了数据访问的 api。在 java.sql 这个包里面 ,我们在连接数据库的时候,一定需要用到 java.sql.Driver 这个接口对吧。然后我好奇的去看了下 java.sql.Driver 的源码,发现 Driver 并没有实现,而是提供了一套标准的 api 接口。大家有兴趣可以去看看,因为我们在实际应用中用的比较多的是 mysql,所以我去 mysql 的包里面看到一个如下的目录结构

 这个文件里面写的就是 mysql 的驱动实现。我恍然大悟,原来通过 SPI 机制把 java.sql.Driver 和 mysql 的驱动做了集成。这样 就达到了各个数据库厂商自己去实现数据库连接,jdk 本身不关心你怎么实现。

SPI 的缺点
JDK 标准的 SPI 会一次性加载实例化扩展点的所有实现,什么意思呢?就是如果你在 META-INF/service 下的文件里面加了 N 个实现类,那么 JDK 启动的时候都会一次性全部加载。那么如果有的扩展点实现初始化很耗时或者如果有些实现类并没有用到, 那么会很浪费资源
如果扩展点加载失败,会导致调用方报错,而且这个错误很难定位到是这个原因

标签:Dubbo,java,实现,博学,SPI,机制,加载
From: https://www.cnblogs.com/LiuLance/p/17399774.html

相关文章

  • 博学谷学习记录 自我总结 用心分享 | Netty框架使用
    Netty框架的作用1.Netty是一款用于快速开发高性能的网络应用程序的Java框架。它封装了网络编程的复杂性,定义了一种架构模型和一套丰富的设计模式。通过Netty框架,可以编写更高效的、可复用的、可维护的代码。有了Netty,你可以实现自己的HTTP服务器,FTP服务器,UDP服务器,RPC服务器,WebSo......
  • FPGA以SPI模式读写SD卡,已经下板验证通过。 可移植到任何FP
    FPGA以SPI模式读写SD卡,已经下板验证通过。可移植到任何FPGA之中。ID:85100653023033019......
  • SPI机制
    SPI机制SPI(ServiceProviderInterface),主要适用于扩展作用,SPI可以很灵活的让接口和实现分离,让api提供者只提供接口,第三方来实现,然后可以使用配置文件的方式来实现替换或者扩展,在框架中比较常见,提高框架的可扩展性。JDK的SPI机制-ServiceLoaderServiceLoader是Java提供的一种......
  • 还在为项目初始化、依赖管理问题困扰?Dubbo Initializer 来了!
    作者:Dubbo社区通过这篇文章,你将学习如何在1分钟内用DubboInitializer模板快速创建DubboSpringBoot项目,帮你解决项目初始化问题。什么是DubboInitializer?DubboInitializer是一款帮助开发者快速生成DubboSpringBoot项目的UI工具,它帮助生成具有基本Dubbo配......
  • SPI方式读写SD卡速度有多快?
    SD卡是一个嵌入式中非常常用的外设,可以用于存储一些大容量的数据。但是,用单片机读写SD卡速度一般都有限(对于高速SD卡,主要是受限于单片机本身的接口速度),在高速、实时数据存储时可能会有影响。那么,具体速度可以达到多少呢?让我们来实际测试一下。SD卡一般有两种常用的接口SPI和SDIO,S......
  • SpringBoot3.x中spring.factories SPI 服务发现机制的改变
    目录一、基础背景二、服务发现接口spring.factories三、服务发现机制调用1.启动SpringApplication2.加载SpringApplication.run1.SpringApplication.createApplicationContext2.SpringApplication.prepareContext3.SpringApplication.refreshContext4.AutoConfigurationImportSele......
  • oracle 开启tnsping trace、sqlnet trace 、event10257
    在sqlnet.ora文件中加入以下参数:TNSPING.TRACE_LEVEL=SUPPORTTNSPING.TRACE_DIRECTORY=d:\oracle\trace“tnsping”工具的预期用途仅仅是测试OracleNet别名中指定的数据库侦听器是up还是down。“tnsping”工具不打算用作OracleNet性能测量工具B.Sql*nettraceSE......
  • Android spinner 的使用
    1.设置下拉框的值1.1通过xml  entries属性配置需要将数据写在xml中,然后设置下拉框的entries属性,则数据自动加载到下拉框中。具体如下: layout布局引用<Spinnerandroid:layout_weight="1.5"android:id="@+id/sp_bound_rate"......
  • Jmeter - dubbo插件测试dubbo接口
    转载:https://blog.csdn.net/baidu_28340727/article/details/125570560一、背景对于如何使用Jmeter测试http接口,大家都已经比较熟悉,网上相关的知识也很多。但随着微服务越来越流行,仅仅会测试http接口已经远远不够。Dubbo作为当下非常流行的RPC接口,学习如何测试Dubbo接口已经成为......
  • (转)Dubbox Dubbo 扩展
    Dubbo 是一个被国内很多互联网公司广泛使用的开源分布式服务框架,即使从国际视野来看应该也是一个非常全面的SOA基础框架。作为一个重要的技术研究课题,在当当网我们根据自身的需求,为Dubbo实现了一些新的功能,并将其命名为Dubbox(即DubboeXtensions)。主要的新功能包括:支持......