分布式的几件小事(五)dubbo的spi思想是什么

1.什么是SPI机制

SPI 全称为 Service Provider Interface,是一种服务发现机制。
SPI 的本质是将接口实现类的全限定名配置在文件中,并由服务加载器读取配置文件,加载实现类。这样可以在运行时,动态为接口替换实现类。
正因此特性,我们可以很容易的通过 SPI 机制为我们的程序提供拓展功能。SPI 机制在第三方框架中也有所应用,比如jdbc。

java定义了一套jdbc的接口,但是java是没有提供jdbc的实现类。
但是实际上项目跑的时候,要使用jdbc接口的哪些实现类呢?一般来说,我们要根据自己使用的数据库,比如msyql,你就将mysql-jdbc-connector.jar,引入进来;oracle,你就将oracle-jdbc-connector.jar,引入进来。
在系统运行的时候,碰到你使用jdbc的接口,他会在底层使用你引入的那个jar中提供的实现类。

2.dubbo的SPI机制

Dubbo 并未使用 Java 原生的 SPI 机制,而是对其进行了增强,使其能够更好的满足需求。在 Dubbo 中,SPI 是一个非常重要的模块。基于 SPI,我们可以很容易的对 Dubbo 进行拓展。

dubbo的设计原则
采用 Microkernel + Plugin 模式,Microkernel 只负责组装 Plugin,Dubbo 自身的功能也是通过扩展点实现的,也就是 Dubbo 的所有功能点都可被用户自定义扩展所替换。

3.dubbo spi使用

Protocol protocol = ExtensionLoader.getExtensionLoader(Protocol.class).getAdaptiveExtension();

Protocol接口,dubbo要判断一下,在系统运行的时候,应该选用这个Protocol接口的哪个实现类来实例化对象来使用呢?

他会去找一个你配置的Protocol,他就会将你配置的Protocol实现类,加载到jvm中来,然后实例化对象,就用你的那个Protocol实现类就可以了

微内核,可插拔,大量的组件,Protocol负责rpc调用的东西,你可以实现自己的rpc调用组件,实现Protocol接口,给自己的一个实现类即可。

这行代码就是dubbo里大量使用的,就是对很多组件,都是保留一个接口和多个实现,然后在系统运行的时候动态根据配置去找到对应的实现类。如果你没配置,那就走默认的实现好了,没问题。

@SPI("dubbo")
public interface Protocol {  

    int getDefaultPort();  

    @Adaptive
    <T> Exporter<T> export(Invoker<T> invoker) throws RpcException;  

    @Adaptive
    <T> Invoker<T> refer(Class<T> type, URL url) throws RpcException;  

    void destroy();  

}  

在dubbo自己的jar里,在/META_INF/dubbo/internal/com.alibaba.dubbo.rpc.Protocol文件中:

dubbo=com.alibaba.dubbo.rpc.protocol.dubbo.DubboProtocol
http=com.alibaba.dubbo.rpc.protocol.http.HttpProtocol
hessian=com.alibaba.dubbo.rpc.protocol.hessian.HessianProtocol

所以说,这就看到了dubbo的spi机制默认是怎么使用的了,其实就是Protocol接口,@SPI(“dubbo”)说的是,通过SPI机制来提供实现类,实现类是通过dubbo作为默认key去配置文件里找到的,配置文件名称与接口全限定名一样的,通过dubbo作为key可以找到默认的实现了就是com.alibaba.dubbo.rpc.protocol.dubbo.DubboProtocol。

dubbo的默认网络通信协议,就是dubbo协议,用的DubboProtocol

如果想要动态替换掉默认的实现类,需要使用@Adaptive接口,Protocol接口中,有两个方法加了@Adaptive注解,就是说那俩接口会被代理实现。

什么意思呢?

比如这个Protocol接口搞了俩@Adaptive注解标注了方法,在运行的时候会针对Protocol生成代理类,这个代理类的那俩方法里面会有代理代码,代理代码会在运行的时候动态根据url中的protocol来获取那个key,默认是dubbo,你也可以自己指定,你如果指定了别的key,那么就会获取别的实现类的实例了。

通过这个url中的参数不通,就可以控制动态使用不同的组件实现类

4.怎么来自己扩展dubbo中的组件

自己写个工程,要是那种可以打成jar包的,里面的src/main/resources目录下,搞一个META-INF/services,里面放个文件叫:com.alibaba.dubbo.rpc.Protocol,文件里搞一个my=com.zhss.MyProtocol。自己把jar弄到nexus私服里去。

然后自己搞一个dubbo provider工程,在这个工程里面依赖你自己搞的那个jar,然后在spring配置文件里给个配置:

<dubbo:protocol name=”my” port=”20000” />

这个时候provider启动的时候,就会加载到我们jar包里的my=com.zhss.MyProtocol这行配置里,接着会根据你的配置使用你定义好的MyProtocol了,这个就是简单说明一下,你通过上述方式,可以替换掉大量的dubbo内部的组件,就是扔个你自己的jar包,然后配置一下即可。

dubbo里面提供了大量的类似上面的扩展点,就是说,你如果要扩展一个东西,只要自己写个jar,让你的consumer或者是provider工程,依赖你的那个jar,在你的jar里指定目录下配置好接口名称对应的文件,里面通过key=实现类。

然后对对应的组件,用类似用你的哪个key对应的实现类来实现某个接口,你可以自己去扩展dubbo的各种功能,提供你自己的实现。

原文地址:https://www.cnblogs.com/jack1995/p/10921146.html

时间: 2024-10-21 13:47:17

分布式的几件小事(五)dubbo的spi思想是什么的相关文章

分布式的几件小事(四)dubbo负载均衡策略和集群容错策略

1.dubbo负载均衡策略 ①random loadbalance 策略 默认情况下,dubbo是random loadbalance 随机调用实现负载均衡,可以对provider不同实例设置不同的权重,会按照权重来进行负载均衡,权重越大分配的流量越高,一般就用这个默认的就可以了. ②roundrobin loadbalance策略 这个策略默认会将请求均匀的分布到各个provider上面,但是如果各个机器的性能不一样,很容易到杭州性能差 的机器负载过高. ③leastactive loadba

分布式的几件小事(二)dubbo的工作原理

1.dubbo的工作原理 ①整体设计 图例说明: 图中左边淡蓝背景的为服务消费方使用的接口,右边淡绿色背景的为服务提供方使用的接口,位于中轴线上的为双方都用到的接口. 图中从下至上分为十层,各层均为单向依赖,右边的黑色箭头代表层之间的依赖关系,每一层都可以剥离上层被复用,其中,Service 和 Config 层为 API,其它各层均为 SPI. 图中绿色小块的为扩展接口,蓝色小块为实现类,图中只显示用于关联各层的实现类. 图中蓝色虚线为初始化过程,即启动时组装链,红色实线为方法调用过程,即运行

分布式的几件小事(三)dubbo的通信协议与序列化

1.dubbo的通信协议 ①dubbo协议 Dubbo缺省协议采用单一长连接和NIO异步通讯,适合于小数据量大并发的服务调用,以及服务消费者机器数远大于服务提供者机器数的情况. 特点 : dubbo缺省协议,使用的是基于netty+hessian的tbremoting交互. 连接个数:单连接. 连接方式:长连接. 传输协议:TCP. 传输方式:NIO异步传输. 使用范围:传入传出数据包较小,消费者数据比提供者多,单一消费者无法压满提供者,尽量不要用来传输超大数据. 使用场景:常规远程服务方法调用

分布式的几件小事(六)dubbo如何做服务治理、服务降级以及重试

1.服务治理 服务治理主要作用是改变运行时服务的行为和选址逻辑,达到限流,权重配置等目的. ①调用链路自动生成 一个大型的分布式系统,会由大量的服务组成,那么这些服务之间的依赖关系和调用链路会很复杂,这就需要dubbo对多个服务之间的调用自动记录下来,生成一张图,显示出来. ②服务反复问压力以及时长统计 需要自动统计各个接口和服务之间的调用次数以及访问延时,而且要分成两个级别.一个级别是接口粒度,就是每个服务的每个接口每天被调用多少次,TP50,TP90,TP99,三个档次的请求延时分别是多少:

Android高级控件(五)——如何打造一个企业级应用对话列表,以QQ,微信为例

Android高级控件(五)--如何打造一个企业级应用对话列表,以QQ,微信为例 看标题这么高大上,实际上,还是运用我么拿到listview去扩展,我们讲什么呢,就是研究一下QQ,微信的这种对话列表,我们先看一个传统的ListView是怎么样的,我们做一个通讯录吧,通讯录的组成就是一个头像,一个名字,一个电话号码,一个点击拨打的按钮,既然这样,那我们的item就出来了 call_list_item.xml <?xml version="1.0" encoding="ut

一件小事引发纯属自我的调节,于是有了这篇随笔

只能说今天运气差到极点了吧,也是因此,晚上十点半的现在的我也只能在word上把随笔先写好,等网好了再发出去. 原定的计划是先把周末的网页先写得差不多再直接睡觉的,结果先是PS运行不了,再是快把PS安装包下载完的时候网络又出问题了.弄来弄去结果就把心态搞炸了.在写这篇随笔的时候网络还是忽好忽坏,PS还是没有下下来.这么早就睡觉肯定是睡不着的,也是想借写随笔的过程来平复下烦躁的心情吧. 学习日近尾声,老师的节奏加快的同时,自己的节奏越发受到外界因素的影响,许久未曾谋面的烦躁又开始活跃起来了.而且由于

《一件小事.呐喊》--鲁迅 词语解释

<一件小事> -出自鲁迅小说集<呐喊>. 伊:彼,他,她. 装腔作势:故意装出一种腔调,做出一种姿势,用来比喻故意做作. 威压:表现出使人敬畏的气魄.威:表现出来使人敬畏的气魄:威力,威风,权威:凭借力量或势力:威胁,威逼. 压:从上面加力:压住:用威力制服.镇服:镇压,压服,压迫:逼近:大兵压境.

单例模式不是一件小事,快回来看看

上次写了一篇<单例模式那件小事,看了你不会后悔>的文章,总结了常用的单例模式的实现.本文是上文的延续,单例模式绝不是一件小事,想弄清楚,真不是那么简单的.上文提到了常用的三种单例模式的实现方法:饿汉式(除了提前占用资源,没毛病.),懒汉式(DCL优化过后,没毛病?),静态内部类式(优雅的方法,没毛病.).文末最后还提到,反射会破坏单例. 本文继续,双重检查锁定优化过后的懒汉式,真的没毛病吗?其实不是,这里涉及到java编译器编译时的一些细节,对象初始化时的写操作与写入 sSingleton 字

【转载】deep learning这件小事……

deep learning这件小事…… (2013-03-30 16:35:17) 转载▼ 标签: deep-learning 机器学习 深度神经网络 监督学习 非监督学习 分类: 机器学习 「深度神经网络」(deep neural network)具体是怎样工作的? 多层的好处是可以用较少的参数表示复杂的函数. 在监督学习中,以前的多层神经网络的问题是容易陷入局部极值点.如果训练样本足够充分覆盖未来的样本,那么学到的多层权重可以很好的用来预测新的测试样本.但是很多任务难以得到足够多的标记样本,