dubbo服務發佈二之zookeeper註冊

接着上一篇繼續看。
上一篇服務暴露已經講完RegistryProtocol#doLocalExport的方法了。下面將服務是如何被寫到zookeeper上的。
clipboard.pngjava

一、註冊zookeeper節點,/dubbo/*/providers

RegistryProtocol#getRegistry方法中,從最原始的Invoker裏面拿到url,拿到配置的「zookeeper」註冊協議,從新構造了一個zookeeper協議的registryUrl,並從registryFactory【一個Adaptive類】中拿到一個ZookeeperRegistryFactory實例。
clipboard.png.]設計模式

RegistryFactory$Adpative代碼【獲取方法:把日誌級別調測DEBUG,而後從控制檯裏面找到該端代碼】緩存

package com.alibaba.dubbo.registry;

import com.alibaba.dubbo.common.extension.ExtensionLoader;

public class RegistryFactory$Adpative implements com.alibaba.dubbo.registry.RegistryFactory {
    public com.alibaba.dubbo.registry.Registry getRegistry(com.alibaba.dubbo.common.URL arg0) {
        if (arg0 == null) throw new IllegalArgumentException("url == null");
        com.alibaba.dubbo.common.URL url = arg0;
        String extName = (url.getProtocol() == null ? "dubbo" : url.getProtocol());
        if (extName == null)
            throw new IllegalStateException("Fail to get extension(com.alibaba.dubbo.registry.RegistryFactory) name from url(" + url.toString() + ") use keys([protocol])");
        com.alibaba.dubbo.registry.RegistryFactory extension = (com.alibaba.dubbo.registry.RegistryFactory) ExtensionLoader.getExtensionLoader(com.alibaba.dubbo.registry.RegistryFactory.class).getExtension(extName);
        return extension.getRegistry(arg0);
    }
}

執行ZookeeperRegistryFactory#getRegistry【模板設計模式,對不對?!】方法,並調用ZookeeperRegistryFactory#createRegistry,在ZookeeperRegistryFactory已經利用dubbo的IOC原理,注入了一個ZookeeperTransporter,該對象利用Adaptive機制得到一個zookeeper客戶端的實例,默認使用zkClinet的實現方式。
clipboard.pngide

拿到ZookeeperRegistry實例以後,執行抽象類方法AbstractRegistryFactory.getRegistryurl

clipboard.png

ZookeeperRegistry#doRegistry方法,將服務信息,寫到zk接口上。
clipboard.pngspa

/dubbo/com.alibaba.dubbo.demo.DemoService/providers都是持久化節點,服務信息是零時節點,主要是爲了監聽服務提供方的是否斷開鏈接,作出相應處理。
clipboard.png設計

此時該服務的providers節點已經寫完了。3d

二、訂閱/dubbo/*/configrators節點

紅框框裏面主要作的時候就是
clipboard.png日誌

2.一、建立服務對應的/dubbo/*/configrators節點

建立zk節點【持久型節點】、並監聽以下節點
/dubbo
----/com.alibaba.dubbo.demo.DemoService
--------/configuratorscode

2.二、建立一個OverrideListener的監聽器

對服務提供者的configurators節點配置監聽器。
會觸發AbstractRegistry#notify(URL url, NotifyListener listener, List<URL> urls)去寫緩存文件,這個之後會單獨弄講。

2.三、訂閱/dubbo/*/configrators節點,當有變化時,觸發OverrideListener監聽器,從新執行OverrideListener#notify方法,

首先在服務提供者的節點樹中建立configurators節點,而後配置監聽器OverrideListener,若經過Dubbo管理系統爲服務設置動態參數,則動態配置的參數放在configurators節點目錄下,並通知服務端的OverrideListener監聽器,根據動態參數從新生成服務提供者URL,若URL有變化則從新暴露服務

三、返回Exporter

clipboard.png

相關文章
相關標籤/搜索