前面咱们已经了解了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 Exporter export(Invoker invoker) throws RpcException {
return null;
}
@Override
public Invoker refer(Class 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服务
可以看出我们自定义的协议已经生效,端口10009
1. Protocol protocol = ExtensionLoader.getExtensionLoader(Protocol.class).
getExtension(“myProtocol”);
2. Protocol protocol =ExtensionLoader.getExtensionLoader(Protocol.class).
getAdaptiveExtension();
- 通 过 一 个 Class 参 数 去 获 得 一 个ExtensionLoader 对象,有点类似一个工厂模式。
- getAdaptiveExtension,去获得一个自适应的扩展点
dubbo源码
最终生成一个代理类Protocol$Adaptive.java
服务器托管,北京服务器托管,服务器租用 http://www.fwqtg.net
机房租用,北京机房租用,IDC机房托管, http://www.e1idc.net