dubbo spi精析接口实现两极反转量资源.pdfVIP

dubbo spi精析接口实现两极反转量资源.pdf

  1. 1、本文档共9页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多

本文由简悦SimpRead转码,原文地址

Dubbo为了更好地达到OCP原则(即“对扩展开放,对修改封闭”的原则),采用了“微内核+插件”的

架构。那什么是微内核架构呢?微内核架构也被称为插件化架构(Plug-inArchitecture),这是一种面

向功能进行拆分的可扩展性架构。内核功能是比较稳定的,只负责管理插件的生命周期,不会因为系统

功能的扩展而不断进行修改。功能上的扩展全部封装到插件之中,插件模块是独立存在的模块,包含特

定的功能,能拓展内核系统的功能。

微内核架构中,内核通常采用Factory、IoC、OSGi等方式管理插件生命周期,Dubbo最终决定采用

SPI机制来加载插件,DubboSPI参考JDK原生的SPI机制,进行了性能优化以及功能增强。因此,在

讲解DubboSPI之前,我们有必要先来介绍一下JDKSPI的工作原理。

JDKSPI

SPI(ServiceProviderInterface)主要是被框架开发人员使用的一种技术。例如,使用Java语言

数据库时我们会使用到java.sql.Driver接口,不同数据库产品底层的协议不同,提供的java.sql.Driver

实现也不同,在开发java.sql.Driver接口时,开发人员并不清楚用户最终会使用哪个数据库,在这种情

况下就可以使用JavaSPI机制在实际运行过程中,为java.sql.Driver接口寻找具体的实现。

1.JDKSPI机制

当服务的提供者提供了一种接口的实现,需要在Classpath下的META-INF/services/里创建

一个以服务接口命名的文件,此文件记录了该jar包提供的服务接口的具体实现类。当某个应用引入了

该jar包且需要使用该服务时,JDKSPI机制就可以通过查找这个jar包的META-INF/services/中的配

置文件来获得具体的实现类名,进行实现类的加载和实例化,最终使用该实现类完成业务功能。

下面我们通过一个简单的示例演示下JDKSPI的基本使用方式:

首先我们需要创建一个Log接口,来模拟日志打印的功能:

publicinterfaceLog{

voidlog(Stringinfo);

}

接下来提供两个实现——Logback和Log4j,分别代表两个不同日志框架的实现,如下所示:

publicclassLogbackimplementsLog{

@Override

publicvoidlog(Stringinfo){

System.out.println(Logback:+info);

}

}

publicclassLog4jimplementsLog{

@Override

publicvoidlog(Stringinfo){

System.out.println(Log4j:+info);

}

}

在项目的resources/META-INF/services下添加一个名为com.xxx.Log的文件,这是JDKSPI需要

的配置文件,具体内容如下:

com.xxx.impl.Log4j

com.xxx.impl.Logback

最后创建main()方法,其中会加载上述配置文件,创建全部Log接口实现的实例,并执行其log()方

法,如下所示:

publicclassMain{

publicstaticvoidmain(String[]args){

ServiceLoaderLogserviceLoader

ServiceLoader.load(Log.class);

IteratorLogiterator=serviceLoader.iterator();

while(iterator.hasNext()){

Loglog=iterator.next();

log.log(JDKSPI);

}

}

}

//输出如下:

//Log4j:JDKSPI

//Logb

文档评论(0)

zhishifuwu + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档