dubbo原始碼解析(四) 幾個重要介面
阿新 • • 發佈:2018-12-21
協議介面: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