- 1、本文档共9页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 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
您可能关注的文档
最近下载
- 中国“一带一路”贸易投资发展报告2021.docx VIP
- 中国与“一带一路”国家和地区贸易、投资互补关系.docx VIP
- smt生产主管年度工作总结.pptx
- 新人音版小学音乐一年级上册全册教案(新课标核心素养).docx
- 2023年上海电力大学计算机科学与技术专业《计算机网络》科目期末试卷B(有答案).docx VIP
- 2023年上海电力大学计算机科学与技术专业《计算机网络》科目期末试卷A(有答案).docx VIP
- 2023年上海电力大学计算机科学与技术专业《操作系统》科目期末试卷A(有答案).docx VIP
- 发电机并网瞬间运行工况分析及措施.docx
- 2023年上海电力大学计算机科学与技术专业《操作系统》科目期末试卷B(有答案).docx VIP
- 中式面点三级测试题及答案.doc
文档评论(0)