Dubbo系列<10>-Dubbo SPI

前面我們已經瞭解了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();

  1.  通 過 一 個 Class 參 數 去 獲 得 一 個ExtensionLoader 對象,有點相似一個工廠模式。

  2.  getAdaptiveExtension,去得到一個自適應的擴展點


dubbo源碼

最終生成一個代理類Protocol$Adaptive.java

相關文章
相關標籤/搜索