资讯动态

掌握Dubbo:从认识SPI开始

发布时间:2026/9/11 10:50:15 来源:尧图企业网站定制
Dubbo是一个出名的分布式框架其使用广泛很多公司直接使用或者进行封装成自己的框架。其架构较为复杂学习成本比spring cloud要高。针对想要快速掌握该框架的使用我觉得可以从高频出现的SPI入手。一、SPI是什么SPI,全称service provider interface中文含义是服务发现机制。对于有分布式开发经验的小伙伴应该对概念相当熟悉对于服务调用者来说需要先得到服务的信息方可进行有效的调用。SPI是通过接口全限定名找到指定目录下对应文件并获取文件中的具体实现类信息并进行加载这样就可以达到灵活替换具体实现类。也许上面的描述比较干巴巴我们就用通俗的话来说在常规情况下接口的规范和实现是实现方来决定调用方没法选择不同的实现。而SPI则对此进行一定程度的反转让调用方来指定接口规范并提供外部实现在此基础上调用方可以根据自己的需要来选择自己所需的具体实现。Java为框架拓展人员提供了一套接口API用来启用框架的扩展和替换组件而SPI可以是则是用来帮助这些的API寻找服务实现。二、Java SPI的机制Java 实现SPI的核心类是ServiceLoader通过它加载类加载器然后创建LazyIteator用于扫描Meta-INF/services这个目录下所有配置文件并解析文件中配置的服务名最后通过反射的方式把服务名对应的类进行加载完成实例化后将它们加载到缓存中。从上述过程来看Java spi机制的优缺点均比较明显1、优点实现解耦让接口定义和具体实现进行分离。2、缺点a.不能按需加载只能把所有配置的服务实现都加载到缓存浪费空间。b.获取服务实现类方式不灵活只能是通过LayzIterator去获取而非通过参数来获取。c.ServiceLoaderx非线程安全。三、Duboo SPI机制Duboo作为一款高可扩展的RPC框架其SPI机制在Java SPI的基础上进行了改造。主要的改造点带有明显的IOC和AOP的痕迹。首先我们要掌握其中几个重要的概念1.扩展点对应一个接口2.扩展扩展点/接口的实现3.扩展自适应实例就是一个扩展Extension的代理,其实现了扩展点的接口。在调用扩展点方法的时候由传入的参数来决定使用哪个扩展。而duboo框架会根据接口的参数来自动选择所需的实现。4.SPI作用于扩展点接口上的注解表明该接口是一个扩展点。5.Adaptive该注解于扩展接口的方法上表明该接口是一个自适应方法。duboo会在扩展点生成自适应实例时把带有该注释的方法生成 类型对应的代码。其次duboo读取配置文件duboo spi基于Java spi因此也是从某个固定的路径去进行配置文件的加载和解析。不过其配置与property文件类似内容key-value形式。最后duboo spi的主要流程如下图当中ExtensionLoader与ServiceLoader类似封装了duboo的spi实现逻辑大家可以从该类的源码入手根据给出的流程图去体会下其编码思想。关于SPI就介绍到这里deboo框架分层较细达10层大致可以分为API和SPI两部分API层是最上的两层主要给开发人员进行编码使用。而SPI层则封装了很多RPC服务调用的核心建议大家先对duboo SPI有所了解才能更好地掌握duboo框架思想。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价