Dubbo系列<10>-Dubbo SPI

前面咱们已经了解了JDK SPI的原理、实现、优缺点。

dubbo在JDK SPI基础之上做了一些优化。

大部分的思想都是和 SPI 是一样,只是下面两个地方有差异。

1. 需要在 resource 目录下配置 meta-inf/dubbo 或者Meta-NF/dubbo/internal 或者 meta-inf/services,并基于 SPI 接口去创建一个文件

2. 文件名称和接口名称保持一致,文件内容和 SPI 有差异,内容是 KEY 对应 Value


基于上面所说咱们自己来实现一个MyProtocol

第一步自定义一个类Protocl,并且实现com.alibaba.dubbo.rpc.Protocol。

package com.tian.dubbo.protocol;

import com.alibaba.dubbo.common.URL;
import com.alibaba.dubbo.rpc.Exporter;
import com.alibaba.dubbo.rpc.Invoker;
import com.alibaba.dubbo.rpc.Protocol;
import com.alibaba.dubbo.rpc.RpcException;

/**
 * 自定义协议
 *  (这里只是做一个演示,所以只是把端口调整了)
 * @Author tianweichang
 * @Date 2018-08-16 14:50
 **/
public class MyProtocol implements Protocol{
@Override
    public int getDefaultPort() {
//自定义协议端口为10009
        return 10009;
    }

@Override
    public <T> Exporter<T> export(Invoker<T> invoker) throws RpcException {
return null;
    }

@Override
    public <T> Invoker<T> refer(Class<T> type, URL url) throws RpcException {
return null;
    }

@Override
    public void destroy() {

    }
}

第二步:

然后就是配置MATE-IN/dubbo/com.alibaba.dubbo.rpc.Protocol。内容就是myProtocol作为kay,com.tian.dubbo.protocol.MyProtocol为value


第三步:

在provider.xml中

<dubbo:protocol name="myProtocol"/>

最后启动dubbo服务


可以看出我们自定义的协议已经生效,端口10009


1. Protocol  protocol  =  ExtensionLoader.getExtensionLoader(Protocol.class).

getExtension("myProtocol");

2. Protocol  protocol  =ExtensionLoader.getExtensionLoader(Protocol.class).

getAdaptiveExtension();

  1.  通 过 一 个 Class 参 数 去 获 得 一 个ExtensionLoader 对象,有点类似一个工厂模式。

  2.  getAdaptiveExtension,去获得一个自适应的扩展点


dubbo源码

最终生成一个代理类Protocol$Adaptive.java


相关文章

在网络请求时,总会有各种异常情况出现,我们需要提前处理这...
作者:宇曾背景软件技术的发展历史,从单体的应用,逐渐演进...
hello,大家好呀,我是小楼。最近一个技术群有同学at我,问我...
 一个软件开发人员,工作到了一定的年限(一般是3、4年左右...
当一个服务调用另一个远程服务出现错误时的外观Dubbo提供了多...
最近在看阿里开源RPC框架Dubbo的源码,顺带梳理了一下其中用...