dubbo rpc顯露服務和引用服務簡析

2021-07-06 01:22:48 字數 2345 閱讀 4906

protocol介面有兩個重要方法,乙個是export()顯露遠端服務,另乙個是refer()引用遠端服務。

/**

* 暴露遠端服務:

* 1. 協議在接收請求時,應記錄請求**方位址資訊:rpccontext.getcontext().setremoteaddress();

* 2. export()必須是冪等的,也就是暴露同乙個url的invoker兩次,和暴露一次沒有區別。

* 3. export()傳入的invoker由框架實現並傳入,協議不需要關心。

* * @param 服務的型別

* @param invoker 服務的執行體

* @return exporter 暴露服務的引用,用於取消暴露

* @throws rpcexception 當暴露服務出錯時丟擲,比如埠已占用

*/@adaptive

exporterexport(invokerinvoker) throws rpcexception;

/*** 引用遠端服務:

* 1. 當使用者呼叫refer()所返回的invoker物件的invoke()方法時,協議需相應執行同url遠端export()傳入的invoker物件的invoke()方法。

* 2. refer()返回的invoker由協議實現,協議通常需要在此invoker中傳送遠端請求。

* 3. 當url中有設定check=false時,連線失敗不能丟擲異常,並內部自動恢復。

* * @param 服務的型別

* @param type 服務的型別

* @param url 遠端服務的url位址

* @return invoker 服務的本地**

* @throws rpcexception 當連線服務提供方失敗時丟擲

*/@adaptive

invokerrefer(classtype, url url) throws rpcexception;

顯露服務和引用服務其實是乙個相反的過程,從下邊**可以看出來。export(invoker),invoker是export的乙個引數; 而在refer()中,它的返回結果是乙個invoker,

protocol.export(proxy.getinvoker(service, demoservice.class, url.valueof("dubbo:" + demoservice.class.getname())));
service = proxy.getproxy(protocol.refer(demoservice.class, url.valueof("dubbo:" + demoservice.class.getname())));

1、export()顯露服務,說白了就是啟動服務,向外提供服務的過程。其中的關鍵方法是openserver(url);如果相應的server已存在,就重新設定一下就行,如果不存在就要去建立這個服務,建立的過程為createserver(url url);

private void openserver(url url)  else 

}}

private exchangeserver createserver(url url)  catch (remotingexception e) 

str = url.getparameter(constants.client_key);

if (str != null && str.length() > 0)

}return server;

}

這個方法的關鍵,就是server = exchangers.bind(url, requesthandler);,通過呼叫remoting包中的exchanger.bind()來啟動乙個網路傳輸服務,並把相應的服務引用返回。

2、refer引用服務,說白了就是通過位址和服務介面,去例項化類,返回結果的過程。

首先將服務的介面和url做為引數傳給refer(),返回乙個具體的協議實現類,

public invokerrefer(classservicetype, url url) throws rpcexception

接著就是根據invoker和介面類去例項化類,並返回具體類的過程

public t getproxy(invokerinvoker, class<?> inte***ces)

最後就可以根據具體返回的類物件,去呼叫相應的方法了。這就是簡單的介紹了暴露服務和引用服務的過程。



OSGI 服務的發布和引用

一 在activator中註冊和引用服務 該方式可以說是最原始的方法,首先在manifest.mf中配置需要匯入的服務介面myservice import package org.jack.myservice 然後採用硬編碼方式註冊服務 public class myactivator implem...

新增web引用和新增服務引用有什麼區別?

新增web引用和新增服務引用有什麼區別,add service references 和 add web references 有啥區別?參考 1 vs2005裡提供的add web reference 新增web服務引用 的功能主要是新增web service引用。2 vs2008保留了add w...

引用 const引用和非const引用

引用構造了物件的乙個同義詞,是c 物件的另乙個名字。在實際程式中,引用的主要作用是作函式的形參。引用是一種復合型別1,它通過在變數名前新增 來定義。在使用引用的情況下,每一種引用型別都關聯到某一其他型別。c 不能定義引用型別的引用,但是可以定義任何其他型別的引用。int a 100 int refa...