Dubbo源碼分析系列---服務的發布


摘要:

   通過解析配置文件,將xml定義的Bean解析並實例化,(涉及重要的類:ServiceBean、RegistryConfig[注冊中心配置]、ProtocolConfig[協議配置]、ApplicationConfig[應用配置]),最終向注冊中心注冊服務提供方的過程。這里我們重點分析provider是如何注冊到注冊中心的?注冊了那些內容?

如何注冊到注冊中心:

  1、准備工作做好:RegistryConfig、ProtocolConfig、ApplicationConfig類作為ServiceBean的屬性存在,在export之前先檢查這些屬性有沒有賦值,沒有的話會使用默認的配置實例化並賦值

  2、doExportUrls:組裝需要向注冊中心注冊的URL,根據配置的不同協議(默認dubbo),向注冊中心注冊相應的地址

private void doExportUrls() {
        List<URL> registryURLs = loadRegistries(true);
        for (ProtocolConfig protocolConfig : protocols) {
            doExportUrlsFor1Protocol(protocolConfig, registryURLs);
        }
    }

   2.1、組裝URL:loadRegistries(true)

registry://127.0.0.1:2181/com.alibaba.dubbo.registry.RegistryService?application=demo-provider&dubbo=2.0.0&owner=william&pid=5916&registry=zookeeper&timestamp=1496647142958

   組裝完成后的URL就是上面那樣。

   2.2、向注冊中心注冊:

 Invoker<?> invoker = proxyFactory.getInvoker(ref, (Class) interfaceClass, registryURL.addParameterAndEncoded(Constants.EXPORT_KEY, url.toFullString()));

                        Exporter<?> exporter = protocol.export(invoker);

     2.2.1、proxyFactory為javassist字節碼生成的Adaptive實例,其getInvoker方法通過URL參數調用具體的擴展點(參見擴展點自適應),並調用擴展點的getInvoker方法。

     2.2.2、protocol也是動態生成的Adaptive實例,因為Url中的protocol屬性為Registry,所以具體的擴展點實現是RegistryProtocol,又因為Protocol實現了裝飾器模式,

     ProtocolListenerWrapper,ProtocolFilterWrapper是裝飾器模式的2個實現。所以export的調用過程如下:

     ProtocolFilterWrapper.export()--》ProtocolListenerWrapper.export()--》RegistryProtocol.export()

     wapper類只是方便我們自己做些額外的處理,最終向注冊中心注冊的過程在RegistryProtocol中。

     2.2.3、在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 節點,並對該節點添加監聽

發布活動圖(轉):

            

參考:

 Dubbo原理解析-服務發布    

      

      


免責聲明!

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



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