天天看點

dubbo源碼淺析-開篇架構介紹

dubbo源碼淺析-開篇

  • 架構介紹
    • 全局元件
    • 服務端相關元件(provider)
    • 用戶端相關元件(consumer)
    • 注冊中心相關元件
    • 文末
      • 關于交流

   這裡我主要是大概的介紹一些dubbo中相關的概念,讀者也盡量去自行深入了解,因為接下來的分析我會比較詳細的介紹整個流程,我覺得隻有這樣才能讓我們有更深的體會。*

架構介紹

全局元件

  1. 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的工廠),然後運作時通過反射為具體對象的成員變量指派。
  2. Protocol: dubbo的服務域,服務暴露和引用的關鍵,約定了各種協定需要實作各自的暴露和引用部分;内部提供了一個Protocol骨架AbstractProtocol,用來抽象與協定無關的公用的邏輯,比如說維護一個服務暴露的map,以及提供了取消暴露(服務銷毀)的方法-》将map周遊移除。AbstractProxyProtocol 是Protocol的另外一個擴充,dubbo内部維護的協定要麼繼承AbstractProxyProtocol,要麼繼承AbstractProxyProtocol,我們自己可以繼承AbstractProxyProtocol,實作doExport和doRefer方法實作自定義的協定(AbstractProxyProtocol和AbstractProtocol的差別在以後的文章中會分析),已知實作包含InjvmProtocol、DubboProtocol等。預設在運作時通過spi擷取到的Protocol是ProtocolListenerWrapper包裝類。
  3. ProxyFactory: 通過具體的動态代理方式,在服務暴露過程中具備擷取Invoker的能力,在服務引用過程中,具備通過Invoker得到代理引用對象的能力。預設情況下,擷取Invoker 以及擷取Proxy的ProxyFactory是一個StubProxyFactoryWrapper的執行個體,StubProxyFactoryWrapper是ProxyFactory的包裝類(spi會展開說明),而StubProxyFactoryWrapper隻有在ProxyFactory擷取Proxy(執行getProxy方法)時,才會起作用;簡言之StubProxyFactoryWrapper是實作dubbo stub(存根服務)的關鍵。stub類似于mock,他提供了一種用戶端可以自己實作服務提供方服務的能力(具體在接下來的文章中展開)。
  4. Exporter : 服務暴露資料結構,規定了通常暴露某個協定的服務時,exporter具有擷取該服務可執行對象Invoker的能力,以及取消暴露的能力;Invoker轉化為Exporter 時服務暴露的關鍵, 将該協定下的Exporter維護到exporterMap中将完成整個服務的暴露,往往每一種協定都會生成與之對應的Exporter 。
  5. Invoker :dubbo的實體域,可執行對象,通過ProxyFactory動态生成,由一個代理類來維護執行。
  6. Invocation : dubbo的會話域,可以了解為Invoker 的資料源
  7. URL : dubbo的通用資料模型
  8. Node : 抽象服務節點
  9. Result : 傳回結果

服務端相關元件(provider)

  1. ServiceBean : 是服務暴露的核心元件,也是服務暴露的入口;暫時不讨論具體服務暴露的具體流程,其實真正處理服務暴露的元件是ServiceBean 的"父親"ServiceConfig,而ServiceBean我了解的是一方面為了解耦服務具體暴露邏輯和服務暴露入口(spring的事件機制,具體會在後面的文章中介紹);

用戶端相關元件(consumer)

  1. ReferenceBean : 是服務引用的核心元件,結構類似于ServiceBean ,ReferenceBean 的“父親”ReferenceConfig實作具體的引用邏輯,ReferenceBean 實作了FactoryBean、ApplicationContextAware,InitializingBean這三個接口,其中引用的關鍵是FactoryBean的getObject()方法,在此之前還做了一些别的動作,包括将spring容器儲存到SpringExtensionFactory(這個SpringExtensionFactory以後會作為擴充spring ioc的工具,分析spi時可以具體展開);在屬性設定之後,初始化之前,将consumer、application、module、registries,monitor這些配置資訊進入初始化,最後生成代理類,儲存起來完成引用。

注冊中心相關元件

  1. RegistryService : 負責服務注冊元件的頂級抽象,主要擴充有DubboRegistry即Dubbo協定注冊中心、FailbackRegistry,即失敗重試等。

文末

關于交流

鑒于本人才疏學淺,談到的内容若有不對的地方煩請告知~也期望與大家一起交流共同進步。

*下一篇—服務暴露流程分析*

繼續閱讀