dubbo源碼淺析-開篇
- 架構介紹
-
- 全局元件
- 服務端相關元件(provider)
- 用戶端相關元件(consumer)
- 注冊中心相關元件
- 文末
-
- 關于交流
這裡我主要是大概的介紹一些dubbo中相關的概念,讀者也盡量去自行深入了解,因為接下來的分析我會比較詳細的介紹整個流程,我覺得隻有這樣才能讓我們有更深的體會。*
架構介紹
全局元件
- ExtensionLoader : 為dubbo的核心元件提供ioc和aop的支援,類似于spring容器的ioc、aop功能,至于為什麼dubbo不直接用spring現有的容器功能,官方可能想盡量避免依賴第三方。ExtensionLoader 的ioc差別于spring的ioc,ExtensionLoader 的ioc是基于java中spi的機制,也是對java原生spi機制的一個擴充,即通過key,value的方式去配置服務,在運作時根據key動态的擷取需要依賴的具體服務。ExtensionLoader 的aop是基于工廠模式(預設内部實作涉及到spi的工廠和spring的工廠),然後運作時通過反射為具體對象的成員變量指派。
- Protocol: dubbo的服務域,服務暴露和引用的關鍵,約定了各種協定需要實作各自的暴露和引用部分;内部提供了一個Protocol骨架AbstractProtocol,用來抽象與協定無關的公用的邏輯,比如說維護一個服務暴露的map,以及提供了取消暴露(服務銷毀)的方法-》将map周遊移除。AbstractProxyProtocol 是Protocol的另外一個擴充,dubbo内部維護的協定要麼繼承AbstractProxyProtocol,要麼繼承AbstractProxyProtocol,我們自己可以繼承AbstractProxyProtocol,實作doExport和doRefer方法實作自定義的協定(AbstractProxyProtocol和AbstractProtocol的差別在以後的文章中會分析),已知實作包含InjvmProtocol、DubboProtocol等。預設在運作時通過spi擷取到的Protocol是ProtocolListenerWrapper包裝類。
- ProxyFactory: 通過具體的動态代理方式,在服務暴露過程中具備擷取Invoker的能力,在服務引用過程中,具備通過Invoker得到代理引用對象的能力。預設情況下,擷取Invoker 以及擷取Proxy的ProxyFactory是一個StubProxyFactoryWrapper的執行個體,StubProxyFactoryWrapper是ProxyFactory的包裝類(spi會展開說明),而StubProxyFactoryWrapper隻有在ProxyFactory擷取Proxy(執行getProxy方法)時,才會起作用;簡言之StubProxyFactoryWrapper是實作dubbo stub(存根服務)的關鍵。stub類似于mock,他提供了一種用戶端可以自己實作服務提供方服務的能力(具體在接下來的文章中展開)。
- Exporter : 服務暴露資料結構,規定了通常暴露某個協定的服務時,exporter具有擷取該服務可執行對象Invoker的能力,以及取消暴露的能力;Invoker轉化為Exporter 時服務暴露的關鍵, 将該協定下的Exporter維護到exporterMap中将完成整個服務的暴露,往往每一種協定都會生成與之對應的Exporter 。
- Invoker :dubbo的實體域,可執行對象,通過ProxyFactory動态生成,由一個代理類來維護執行。
- Invocation : dubbo的會話域,可以了解為Invoker 的資料源
- URL : dubbo的通用資料模型
- Node : 抽象服務節點
- Result : 傳回結果
服務端相關元件(provider)
- ServiceBean : 是服務暴露的核心元件,也是服務暴露的入口;暫時不讨論具體服務暴露的具體流程,其實真正處理服務暴露的元件是ServiceBean 的"父親"ServiceConfig,而ServiceBean我了解的是一方面為了解耦服務具體暴露邏輯和服務暴露入口(spring的事件機制,具體會在後面的文章中介紹);
用戶端相關元件(consumer)
- ReferenceBean : 是服務引用的核心元件,結構類似于ServiceBean ,ReferenceBean 的“父親”ReferenceConfig實作具體的引用邏輯,ReferenceBean 實作了FactoryBean、ApplicationContextAware,InitializingBean這三個接口,其中引用的關鍵是FactoryBean的getObject()方法,在此之前還做了一些别的動作,包括将spring容器儲存到SpringExtensionFactory(這個SpringExtensionFactory以後會作為擴充spring ioc的工具,分析spi時可以具體展開);在屬性設定之後,初始化之前,将consumer、application、module、registries,monitor這些配置資訊進入初始化,最後生成代理類,儲存起來完成引用。
注冊中心相關元件
- RegistryService : 負責服務注冊元件的頂級抽象,主要擴充有DubboRegistry即Dubbo協定注冊中心、FailbackRegistry,即失敗重試等。
文末
關于交流
鑒于本人才疏學淺,談到的内容若有不對的地方煩請告知~也期望與大家一起交流共同進步。
*下一篇—服務暴露流程分析*