實現細節
初始化過程細節
解析服務
- 基於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攔截實現。