前面咱们已经了解了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();
dubbo源码
最终生成一个代理类Protocol$Adaptive.java
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。