(轉)Dubbo擴展點實現細節


實現細節

(+) (#)

初始化過程細節

(+) (#)

解析服務

  • 基於dubbo.jar內的META-INF/spring.handlers配置,Spring在遇到dubbo名稱空間時,會回調DubboNamespaceHandler。
  • 所有dubbo的標簽,都統一用DubboBeanDefinitionParser進行解析,基於一對一屬性映射,將XML標簽解析為Bean對象。
  • 在ServiceConfig.export()或ReferenceConfig.get()初始化時,將Bean對象轉換URL格式,所有Bean屬性轉成URL的參數。
  • 然后將URL傳給Protocol擴展點,基於擴展點的Adaptive機制,根據URL的協議頭,進行不同協議的服務暴露或引用。

暴露服務

(1) 只暴露服務端口:

  • 在沒有注冊中心,直接暴露提供者的情況下,即:
    • <dubbo:service regisrty="N/A" /> or <dubbo:registry address="N/A" />
  • ServiceConfig解析出的URL的格式為:
    • dubbo://service-host/com.foo.FooService?version=1.0.0
  • 基於擴展點的Adaptive機制,通過URL的"dubbo://"協議頭識別,直接調用DubboProtocol的export()方法,打開服務端口。

(2) 向注冊中心暴露服務:

  • 在有注冊中心,需要注冊提供者地址的情況下,即:
    • <dubbo:registry address="zookeeper://10.20.153.10:2181" />
  • ServiceConfig解析出的URL的格式為:
    • registry://registry-host/com.alibaba.dubbo.registry.RegistryService?export=URL.encode("dubbo://service-host/com.foo.FooService?version=1.0.0")
  • 基於擴展點的Adaptive機制,通過URL的"registry://"協議頭識別,就會調用RegistryProtocol的export()方法,將export參數中的提供者URL,先注冊到注冊中心,再重新傳給Protocol擴展點進行暴露:
    • dubbo://service-host/com.foo.FooService?version=1.0.0
  • 基於擴展點的Adaptive機制,通過提供者URL的"dubbo://"協議頭識別,就會調用DubboProtocol的export()方法,打開服務端口。

引用服務

(1) 直連引用服務:

  • 在沒有注冊中心,直連提供者的情況下,即:
    • <dubbo:reference url="dubbo://service-host/com.foo.FooService?version=1.0.0" />
  • ReferenceConfig解析出的URL的格式為:
    • dubbo://service-host/com.foo.FooService?version=1.0.0
  • 基於擴展點的Adaptive機制,通過URL的"dubbo://"協議頭識別,直接調用DubboProtocol的refer()方法,返回提供者引用。

(2) 從注冊中心發現引用服務:

  • 在有注冊中心,通過注冊中心發現提供者地址的情況下,即:
    • <dubbo:registry address="zookeeper://10.20.153.10:2181" />
  • ReferenceConfig解析出的URL的格式為:
    • registry://registry-host/com.alibaba.dubbo.registry.RegistryService?refer=URL.encode("consumer://consumer-host/com.foo.FooService?version=1.0.0")
  • 基於擴展點的Adaptive機制,通過URL的"registry://"協議頭識別,就會調用RegistryProtocol的refer()方法,基於refer參數中的條件,查詢提供者URL,如:
    • dubbo://service-host/com.foo.FooService?version=1.0.0
  • 基於擴展點的Adaptive機制,通過提供者URL的"dubbo://"協議頭識別,就會調用DubboProtocol的refer()方法,得到提供者引用。
  • 然后RegistryProtocol將多個提供者引用,通過Cluster擴展點,偽裝成單個提供者引用返回。

攔截服務

  • 基於擴展點的Wrapper機制,所有的Protocol擴展點都會自動套上Wrapper類。
  • 基於ProtocolFilterWrapper類,將所有Filter組裝成鏈,在鏈的最后一節調用真實的引用。
  • 基於ProtocolListenerWrapper類,將所有InvokerListener和ExporterListener組裝集合,在暴露和引用前后,進行回調。
  • 包括監控在內,所有附加功能,全部通過Filter攔截實現。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM