概述
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框架思想。
最后
以上就是疯狂萝莉为你收集整理的掌握Dubbo:从认识SPI开始的全部内容,希望文章能够帮你解决掌握Dubbo:从认识SPI开始所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复