摘要:服務(wù)提供者代碼上面這個類會被封裝成為一個實(shí)例,并新生成一個實(shí)例。這樣當(dāng)網(wǎng)絡(luò)通訊層收到一個請求后,會找到對應(yīng)的實(shí)例,并調(diào)用它所對應(yīng)的實(shí)例,從而真正調(diào)用了服務(wù)提供者的代碼。
這次源碼解析借鑒《肥朝》前輩的dubbo源碼解析,進(jìn)行源碼學(xué)習(xí)。總結(jié)起來就是先總體,后局部.也就是先把需要注意的概念先拋出來,把整體架構(gòu)圖先畫出來.讓讀者拿著"地圖"跟著我的腳步,并且每一步我都提醒,現(xiàn)在我們在哪,我們下一步要做什么,這樣才不會迷失方向。
總體概述
首先是總體出發(fā)了解整體的架構(gòu),涉及到概念,在學(xué)習(xí)dubbo會更加理解透徹。
下面對上面這張圖做簡要的分析:
(1)cluster是集群,主要是
概念:
Invoker 是實(shí)體域,它是 Dubbo 的核心模型,其它模型都向它靠擾,或轉(zhuǎn)換成它,它代表一個可執(zhí)行體,可向它發(fā)起 invoke 調(diào)用,它有可能是一個本地的實(shí)現(xiàn),也可能是一個遠(yuǎn)程的實(shí)現(xiàn),也可能一個集群實(shí)現(xiàn)。它里面有一個很重要的方法 Result invoke(Invocation invocation)。
Invocation是會話域,它持有調(diào)用過程中的變量,比如方法名,參數(shù)等重要信息。
它有2種類型的Invoker
1.本地執(zhí)行類的Invoker server端:比如有一個dubbo接口demoService.sayHello,在本項目中執(zhí)行 demoService.sayHello,就通過InjvmExporter來進(jìn)行反射執(zhí)行demoService.sayHello就可以了。
2.遠(yuǎn)程通信類的Invoker
client端:要執(zhí)行 demoService.sayHello,它封裝了DubboInvoker進(jìn)行遠(yuǎn)程通信,發(fā)送要執(zhí)行的接口給server端。 server端:采用了AbstractProxyInvoker執(zhí)行了DemoServiceImpl.sayHello,然后將執(zhí)行結(jié)果返回發(fā)送給client.
按服務(wù)提供、服務(wù)消費(fèi)分類
引用官方文檔:分為服務(wù)提供 Invoker 和服務(wù)消費(fèi) Invoker
為了更好的解釋上面這張圖,我們結(jié)合服務(wù)消費(fèi)和提供者的代碼示例來進(jìn)行說明:
服務(wù)消費(fèi)者代碼:
public class DemoClientAction { private DemoService demoService; public void setDemoService(DemoService demoService) { this.demoService = demoService; } public void start() { String hello = demoService.sayHello("world" + i); } }
上面代碼中的 DemoService 就是上圖中服務(wù)消費(fèi)端的 proxy,用戶代碼通過這個 proxy 調(diào)用其對應(yīng)的 Invoker [5],而該 Invoker 實(shí)現(xiàn)了真正的遠(yuǎn)程服務(wù)調(diào)用。
服務(wù)提供者代碼:
public class DemoServiceImpl implements DemoService { public String sayHello(String name) throws RemoteException { return "Hello " + name; } }
上面這個類會被封裝成為一個 AbstractProxyInvoker 實(shí)例,并新生成一個 Exporter 實(shí)例。這樣當(dāng)網(wǎng)絡(luò)通訊層收到一個請求后,會找到對應(yīng)的 Exporter 實(shí)例,并調(diào)用它所對應(yīng)的 AbstractProxyInvoker 實(shí)例,從而真正調(diào)用了服務(wù)提供者的代碼。
Invoker繼承關(guān)系
概念
簡單來說,Directory就是裝載invoker的文件目錄
兩個重要Directory
StaticDirectory:靜態(tài)目錄服務(wù),他的Invoker是固定的。
RegistryDirectory:注冊目錄服務(wù),他的Invoker集合數(shù)據(jù)來源于zk注冊中心的,他實(shí)現(xiàn)了NotifyListener接口,這個接口中的notify方法就是注冊中心的回調(diào),也就是它之所以能根據(jù)注冊中心動態(tài)變化的根源所在.。
整個過程有一個重要的map變量,methodInvokerMap(它是數(shù)據(jù)的來源;同時也是notify的重要操作對象,重點(diǎn)是寫操作。)
概念
利用Router,可以從多個服務(wù)提者方中選擇一個進(jìn)行調(diào)用
分類
主要是3個實(shí)現(xiàn)類:
ConditionRouter(條件路由):條件路由主要就是根據(jù)dubbo管理控制臺配置的路由規(guī)則來過濾相關(guān)的invoker
MockInvokersSelector:主要根據(jù)參數(shù),判斷是否需要篩選出正常的(非mock的)invoker 或者 mock的invoker
ScriptRouter(腳本路由):待補(bǔ)充
例子
參考:org.apache.dubbo.rpc.cluster.router.script.ScriptRouterTest
概念
與Router功能類似,利用負(fù)載均衡策略(random,roundrobin,leastactive),從多個服務(wù)提者方中選擇一個進(jìn)行調(diào)用
概念
Protocol 是服務(wù)域,它是 Invoker 暴露和引用的主功能入口,它負(fù)責(zé) Invoker 的生命周期管理。
再接下來給大家一張"地圖","地圖"上我已經(jīng)標(biāo)記了序號,再下面的源碼分析中,我也會實(shí)時提醒我們所在的位置,以至于不會迷失方向.
消費(fèi)方調(diào)用過程中,dubbo究竟做了什么?
a、在Directory中找出本次集群中的全部invokers
b、在Router中,將上一步的全部invokers挑選出滿足條件的invokers
c、在LoadBalance中,將上一步的能正常的執(zhí)行invokers中,根據(jù)配置的負(fù)載均衡策略,挑選出需要執(zhí)行的invoker
后面開始,就是正式的源碼閱讀(環(huán)境搭建這些略過)
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/72101.html
摘要:上一篇源碼解析概要篇中我們了解到中的一些概念及消費(fèi)端總體調(diào)用過程。由于在生成代理實(shí)例的時候,在構(gòu)造函數(shù)中賦值了,因此可以只用該進(jìn)行方法的調(diào)用。 上一篇 dubbo源碼解析——概要篇中我們了解到dubbo中的一些概念及消費(fèi)端總體調(diào)用過程。本文中,將進(jìn)入消費(fèi)端源碼解析(具體邏輯會放到代碼的注釋中)。本文先是對消費(fèi)過程的總體代碼邏輯理一遍,個別需要細(xì)講的點(diǎn),后面會專門的文章進(jìn)行解析。...
摘要:屬性上篇文章中,提到在獲取擴(kuò)展點(diǎn)接口對應(yīng)的的時候,會執(zhí)行私有構(gòu)造函數(shù)。因為此時是,即當(dāng)為時,即我們可以看出,所有非擴(kuò)展點(diǎn)接口都會執(zhí)行對應(yīng)的實(shí)例的方法返回一個實(shí)例,即對象。 spring是如何獲得容器中管理的類的 拿到applicationContext,就可以調(diào)用getBean方法來獲得Spring的bean對象了 public class SpringContextUtil impl...
摘要:二注解該注解為了保證在內(nèi)部調(diào)用具體實(shí)現(xiàn)的時候不是硬編碼來指定引用哪個實(shí)現(xiàn),也就是為了適配一個接口的多種實(shí)現(xiàn),這樣做符合模塊接口設(shè)計的可插拔原則,也增加了整個框架的靈活性,該注解也實(shí)現(xiàn)了擴(kuò)展點(diǎn)自動裝配的特性。 Dubbo擴(kuò)展機(jī)制SPI 前一篇文章《dubbo源碼解析(一)Hello,Dubbo》是對dubbo整個項目大體的介紹,而從這篇文章開始,我將會從源碼來解讀dubbo再各個模塊的實(shí)...
摘要:而存在的意義就是保證請求或響應(yīng)對象可在線程池中被解碼,解碼完成后,就會分發(fā)到的。 2.7大揭秘——服務(wù)端處理請求過程 目標(biāo):從源碼的角度分析服務(wù)端接收到請求后的一系列操作,最終把客戶端需要的值返回。 前言 上一篇講到了消費(fèi)端發(fā)送請求的過程,該篇就要將服務(wù)端處理請求的過程。也就是當(dāng)服務(wù)端收到請求數(shù)據(jù)包后的一系列處理以及如何返回最終結(jié)果。我們也知道消費(fèi)端在發(fā)送請求的時候已經(jīng)做了編碼,所以我...
摘要:作為面試官,我是如何甄別應(yīng)聘者的包裝程度語言和等其他語言的對比分析和主從復(fù)制的原理詳解和持久化的原理是什么面試中經(jīng)常被問到的持久化與恢復(fù)實(shí)現(xiàn)故障恢復(fù)自動化詳解哨兵技術(shù)查漏補(bǔ)缺最易錯過的技術(shù)要點(diǎn)大掃盲意外宕機(jī)不難解決,但你真的懂?dāng)?shù)據(jù)恢復(fù)嗎每秒 作為面試官,我是如何甄別應(yīng)聘者的包裝程度Go語言和Java、python等其他語言的對比分析 Redis和MySQL Redis:主從復(fù)制的原理詳...
閱讀 3869·2021-10-08 10:05
閱讀 2949·2021-09-27 13:57
閱讀 2685·2019-08-29 11:32
閱讀 1010·2019-08-28 18:18
閱讀 1291·2019-08-28 18:05
閱讀 1987·2019-08-26 13:39
閱讀 867·2019-08-26 11:37
閱讀 2047·2019-08-26 10:37