前面我們已經瞭解了JDK SPI的原理、實現、優缺點。java
Dubbo在JDK SPI基礎之上作了一些優化。app
大部分的思想都是和 SPI 是同樣,只是下面兩個地方有差別。ide
1. 須要在 resource 目錄下配置 META-INF/dubbo 或者META-NF/dubbo/internal 或者 META-INF/services,並基於 SPI 接口去建立一個文件優化
2. 文件名稱和接口名稱保持一致,文件內容和 SPI 有差別,內容是 KEY 對應 Valueurl
基於上面所說我們本身來實現一個MyProtocolspa
第一步自定義一個類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() { } }
第二步:orm
而後就是配置MATE-IN/dubbo/com.alibaba.dubbo.rpc.Protocol。內容就是myProtocol做爲kay,com.tian.dubbo.protocol.MyProtocol爲valuexml
第三步:對象
在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();
通 過 一 個 Class 參 數 去 獲 得 一 個ExtensionLoader 對象,有點相似一個工廠模式。
getAdaptiveExtension,去得到一個自適應的擴展點
dubbo源碼
最終生成一個代理類Protocol$Adaptive.java