Dubbo——消費端調用

消費端調用


1、在業務層代碼中調用遠程接口的方法時,實際上是調用的本地創建的代理對象。即在《4.4.3 創建服務類的本地代理》中創建的代理對象。

2、在該代理對象中,調用了InvokerInvocationHander.invoke方法。遠程調用以InvcationResult爲中心,在這個方法中根據調用的遠程方法和傳入的參數構建RpcInvcation對象,該對象中的成員變量包括遠程調用的方法名、方法參數類型、參數值等值,該RpcInvcation對象作爲後續invoke方法的請求參數。

3、根據《4.4.2 遠程引用服務》中對Invoker對象的封裝順序,首先調用MockClusterInvoker.invoke方法,根據url中的參數mock提供了三種策略。

       1)若mock的參數值爲空或者爲“false”,則不需要mock,直接調用FailoverClusterInvoker

       2)若mock參數值以“force”開頭,則調用MockInvoker,根據mock參數值後面的字符串,分幾種情況:

       2.1)若是“return”,則直接返回RpcResult對象,value=null

       2.2)若是“return”開頭,也返回RpcResult對象,但value值根據參數值來定:先獲取遠程方法的返回值類型,然後根據後面字符串來確定value的值:若是“empty”則value等於返回值類型實例;若是null,則value=null;若是turevalue=true;若是false,則value=false;若是\開頭,\結尾的字符串,則將該字符串賦值給value;若是數字,則將數字賦值給value;若是{開頭,則將內容初始化爲Map對象賦值給value;若是[開頭,則將內容初始化爲List對象賦值給value;否則將剩餘的參數值賦值給value

   3)不是以上兩種情況的,則先執行FailoverClusterInvoker,若出現RpcException異常再執行MockInvoker

4、在執行FailoverClusterInvoker.invoke方法(默認調用策略),在該方法中完成集羣路由策略的選擇。

1)通過目錄服務(RegistryDirectory)查找所有訂閱的服務提供者的Invoker對象列表,其中調用AbstractDirectory.list(Invocation)方法,在該方法中根據Dubbo管理系統設置的路由信息調用Router.route方法篩選Invoker對象列表;

2)若Invoker對象列表中存在記錄,則根據列表中第一個Invoker對象中URL中的參數loadbalance的值決定選擇哪個負載均衡策略類(該參數在標籤<dubbo:method>loadbalance中配置,目前支持randomroundrobinleastactiveconsistenthash四種負載均衡策略);若沒有配置該loadbalance參值,則默認選擇RandomLoadBalance類作爲負載均衡策略;

3)根據上一步選擇負載均衡策略類選擇一個Invoker

5、以Dubbo協議爲例,調用DubboInvoker.invoke方法。在Dubbo協議的服務引用邏輯中,創建了DubboInvoker對象,並封裝了ExchangeClient對象,該對象是與服務端建立的鏈接對象。利用該對象進行遠程請求消息的發送。首先判斷遠程調用類型是同步、異步還是oneway模式;

       1<dubbo:method>標籤的return屬性配置爲false,則是oneway模式,利用ExchangeClient對象向服務端發送請求消息之後,立即返回空RpcResult對象;

       2)若是<dubbo:method>標籤的async屬性配置爲ture,則是異步模式,直接返回空RpcResult對象,由FutureFilterDefaultFuture完成異步處理工作;

       3)若是同步,則發送請求之後線程進入等待狀態,直到收到服務端的響應消息或者超時。

       消費端的調用流程圖如下:




發佈了59 篇原創文章 · 獲贊 56 · 訪問量 16萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章