經過解析配置文件,將xml定義的Bean解析並實例化,(涉及重要的類:ServiceBean、RegistryConfig[註冊中心配置]、ProtocolConfig[協議配置]、ApplicationConfig[應用配置]),最終向註冊中心註冊服務提供方的過程。這裏咱們重點分析provider是如何註冊到註冊中心的?註冊了那些內容?html
一、準備工做作好:RegistryConfig、ProtocolConfig、ApplicationConfig類做爲ServiceBean的屬性存在,在export以前先檢查這些屬性有沒有賦值,沒有的話會使用默認的配置實例化並賦值java
二、doExportUrls:組裝須要向註冊中心註冊的URL,根據配置的不一樣協議(默認dubbo),向註冊中心註冊相應的地址app
private void doExportUrls() { List<URL> registryURLs = loadRegistries(true); for (ProtocolConfig protocolConfig : protocols) { doExportUrlsFor1Protocol(protocolConfig, registryURLs); } }
2.一、組裝URL:loadRegistries(true)ide
registry://127.0.0.1:2181/com.alibaba.dubbo.registry.RegistryService?application=demo-provider&dubbo=2.0.0&owner=william&pid=5916®istry=zookeeper×tamp=1496647142958
組裝完成後的URL就是上面那樣。url
2.二、向註冊中心註冊:spa
Invoker<?> invoker = proxyFactory.getInvoker(ref, (Class) interfaceClass, registryURL.addParameterAndEncoded(Constants.EXPORT_KEY, url.toFullString()));
Exporter<?> exporter = protocol.export(invoker);
2.2.一、proxyFactory爲javassist字節碼生成的Adaptive實例,其getInvoker方法經過URL參數調用具體的擴展點(參見擴展點自適應),並調用擴展點的getInvoker方法。.net
2.2.二、protocol也是動態生成的Adaptive實例,由於Url中的protocol屬性爲Registry,因此具體的擴展點實現是RegistryProtocol,又由於Protocol實現了裝飾器模式,code
ProtocolListenerWrapper,ProtocolFilterWrapper是裝飾器模式的2個實現。因此export的調用過程以下:xml
ProtocolFilterWrapper.export()--》ProtocolListenerWrapper.export()--》RegistryProtocol.export()htm
wapper類只是方便咱們本身作些額外的處理,最終向註冊中心註冊的過程在RegistryProtocol中。
2.2.三、在2.2.2步驟中實例化RegistryProtocol後,會檢查屬性中是否有啓用擴展點加載的,有則一併建立對應屬性的Adaptive實例。
A、doLocalExport:建立ExchangeServer綁定回調,開啓Netty鏈接,保持通訊。
B、register:向註冊中心註冊臨時節點:(節點名)
/dubbo/com.alibaba.dubbo.demo.DemoService/providers/dubbo%3A%2F%2F192.168.3.6%3A20880%2Fcom.alibaba.dubbo.demo.DemoService%3Fanyhost%3Dtrue%26application%3Ddemo-provider%26dubbo%3D2.0.0%26generic%3Dfalse%26interface%3Dcom.alibaba.dubbo.demo.DemoService%26loadbalance%3Droundrobin%26methods%3DsayHello%26owner%3Dwilliam%26pid%3D6380%26side%3Dprovider%26timestamp%3D1497161144248
C、建立configurators節點,對該節點添加子節點監聽,當該節點有變化從新暴露,至關於執行A
/dubbo/com.alibaba.dubbo.demo.DemoService/configurators 監聽的節點
建立/dubbo/com.alibaba.dubbo.demo.DemoService/providers/(url)節點
建立/dubbo/com.alibaba.dubbo.demo.DemoService/configurators 節點,並對該節點添加監聽
參考: