1. 程式人生 > >Dubbo框架學習-重要概念理解

Dubbo框架學習-重要概念理解

ProxyFactory

  1. ProxyFactory是代理工廠,在dubbo中主要有兩個作用,我們可以通過原始碼來分析介面作用
@SPI("javassist")
public interface ProxyFactory {

    /**
     * create proxy.
     * 針對Client端,建立服務端介面的代理物件,例如DemoService的代理物件
     * 一個Invoker物件
     * @param invoker
     * @return proxy
     */
    @Adaptive({Constants.PROXY_KEY})
    <T> T getProxy(Invoker<T> invoker) throws
RpcException; /** * create invoker. * 針對server端,將服務物件的具體實現,例如DemoServiceImpl包裝成 * @param <T> * @param proxy:服務的具體實現型別引用 DemoServiceImpl * @param type:介面的Class型別 * @param url:URL物件,如果是遠端服務暴露,則為服務介面名,註冊中心URL,埠,協議(dubbo)等資訊 * @return invoker */ @Adaptive
({Constants.PROXY_KEY}) <T> Invoker<T> getInvoker(T proxy, Class<T> type, URL url) throws RpcException; }

Invoker

  1. Invoker是指可執行的物件,在dubbo中是由代理工廠ProxyFactory的getInvoker生成的。根據上述方法getInvoker(T proxy, Class type, URL url)可以看出,Invoker物件在dubbo框架中主要分為三類(後續詳細講解):
    1.1. 本地執行Invoker,服務在本地暴露時,則Invoker是指本地執行的。
    1.2. 遠端通訊Invoker,服務進行遠端暴露,ProxyFactory生成遠端Invoker。
    1.3. 多個遠端通訊的Invoker聚合成叢集版的Invoker。
  2. Invoker是指可執行的物件,則呼叫Invoker的invoke方法則能獲得執行結果。該介面的原始碼如下:
public interface Invoker<T> extends Node {

    /**
     * get service interface.
     *
     * @return service interface.
     */
    Class<T> getInterface();

    /**
     * invoke.
     * @param invocation
     * @return result
     * @throws RpcException
     */
    Result invoke(Invocation invocation) throws RpcException;

}

Protocol

  1. protocol在dubbo中是協議的意思,該介面主要有兩個方面的功能。
    1.1. 服務端通過Protocol的export(Invoker)方法將ProxyFactory生成的Invoker物件暴露成遠端服務或本地服務的引用Exporter。
    1.2. 客戶端consumer通過Protocol的refer(Invoker,Url)方法引用遠端服務。
@SPI("dubbo")
public interface Protocol {

    /**
     * 獲取預設埠,當用戶沒有配置埠時使用。
     *
     * @return 預設埠
     */
    int getDefaultPort();

    /**
     * 暴露遠端服務:<br>
     * 1. 協議在接收請求時,應記錄請求來源方地址資訊:RpcContext.getContext().setRemoteAddress();<br>
     * 2. export()必須是冪等的,也就是暴露同一個URL的Invoker兩次,和暴露一次沒有區別。<br>
     * 3. export()傳入的Invoker由框架實現並傳入,協議不需要關心。<br>
     *
     * @param <T>     服務的型別
     * @param invoker 服務的執行體
     * @return exporter 暴露服務的引用,用於取消暴露
     * @throws RpcException 當暴露服務出錯時丟擲,比如埠已佔用
     */
    @Adaptive
    <T> Exporter<T> export(Invoker<T> invoker) throws RpcException;

    /**
     * 引用遠端服務:<br>
     * 1. 當用戶呼叫refer()所返回的Invoker物件的invoke()方法時,協議需相應執行同URL遠端export()傳入的Invoker物件的invoke()方法。<br>
     * 2. refer()返回的Invoker由協議實現,協議通常需要在此Invoker中傳送遠端請求。<br>
     * 3. 當url中有設定check=false時,連線失敗不能丟擲異常,並內部自動恢復。<br>
     *
     * @param <T>  服務的型別
     * @param type 服務的型別
     * @param url  遠端服務的URL地址
     * @return invoker 服務的本地代理
     * @throws RpcException 當連線服務提供方失敗時丟擲
     */
    @Adaptive
    <T> Invoker<T> refer(Class<T> type, URL url) throws RpcException;

    /**
     * 釋放協議:<br>
     * 1. 取消該協議所有已經暴露和引用的服務。<br>
     * 2. 釋放協議所佔用的所有資源,比如連線和埠。<br>
     * 3. 協議在釋放後,依然能暴露和引用新的服務。<br>
     */
    void destroy();

}
  1. 通過export暴露服務的引用exporter,其中exporter負責管理Invoker的宣告週期。
  2. 遠端服務暴露時,使用DubboProtocol進行具體服務暴露。呼叫DubboProtocol的export(Invoker)將Invoker進行暴露成Exporter。這個方法的核心就是將暴露的exporter放入到ConcurrentHashMap中。
    4.原始碼如下:
public <T> Exporter<T> export(Invoker<T> invoker) throws RpcException {
        URL url = invoker.getUrl();

        // export service.
        String key = serviceKey(url);
        /**
        key是指com.xxx.DemoService:20880
        ***DubboExporter,返回出去。
        **/
        DubboExporter<T> exporter = new DubboExporter<T>(invoker, key, exporterMap);
        // 將exporter放入map中,key是com.xxx.DemoService:20880
        exporterMap.put(key, exporter);
        // 省略部分非核心程式碼
        // 開啟服務
        openServer(url);

        return exporter;
    }

Exchanger

  1. 資訊交換層,封裝請求,響應資訊。同步轉非同步。

Transporter

  1. 抽象Mina和Netty通訊統一介面。