1. 程式人生 > >dubbo原始碼解析(四) 幾個重要介面

dubbo原始碼解析(四) 幾個重要介面

協議介面:Protocol

介面匯出介面:Exporter

介面執行:Invoker

看一下這幾個介面的定義

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(); }

這個接口裡面我們最關注的是export和refer,一個是暴露本地介面,一個是引用遠端介面。

export暴露本地介面時需要傳入Invoker,這樣就可以通過呼叫invoker.invoke方法執行本地方法了

refer遠端呼叫介面時需要傳入服務型別和遠端服務的url,返回生成的本地代理物件,這樣當發起請求呼叫遠端介面時首先呼叫本地的代理物件,本地代理物件再發送請求到遠端。

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;

}

這個介面就兩個方法,一個invoke,一個getInterface.還有幾個從Node繼承來的getUrl、isAvailable、destroy