dubbo技術(shù)內(nèi)幕十五 ReferenceBean refer向zk寫了什么

上一章的中有講到ServiceBean在export的過程中向zk寫入的信息窥妇,這一章看下ReferenceBean在refer的過程中,向zk寫的數(shù)據(jù)娩践,已經(jīng)監(jiān)聽了哪些變更活翩。
我們直接的拉到ReferenceBean的getObject方法,如下

 public Object getObject() throws Exception {
        return get();
    }

直接的跟到ReferenceConfig類的init方法里面的最重要的一句

 ref = createProxy(map);

而在createProxy方法里面翻伺,最重要的一句材泄,如下

 invoker = refprotocol.refer(interfaceClass, urls.get(0));

我們直接的跟到RegistryProtocol的refer方法里面的最后一句,如下

return doRefer(cluster, registry, type, url);

而在doRefer里面摘取重要的語句如下

  //構(gòu)造url
  URL subscribeUrl = new URL(Constants.CONSUMER_PROTOCOL, parameters.remove(Constants.REGISTER_IP_KEY), 0, type.getName(), parameters);
        if (!Constants.ANY_VALUE.equals(url.getServiceInterface())
                && url.getParameter(Constants.REGISTER_KEY, true)) {
            URL registeredConsumerUrl = getRegisteredConsumerUrl(subscribeUrl, url);
            //注冊消費(fèi)者信息
            registry.register(registeredConsumerUrl);
            directory.setRegisteredConsumerUrl(registeredConsumerUrl);
        }
        //訂閱指定zk目錄的信息
        directory.subscribe(subscribeUrl.addParameter(Constants.CATEGORY_KEY,
                Constants.PROVIDERS_CATEGORY
                        + "," + Constants.CONFIGURATORS_CATEGORY
                        + "," + Constants.ROUTERS_CATEGORY));

其中

 registry.register(registeredConsumerUrl);

會(huì)調(diào)用到ZookeeperRegistry的doRegister方法吨岭,如下

    protected void doRegister(URL url) {
        try {
            zkClient.create(toUrlPath(url), url.getParameter(Constants.DYNAMIC_KEY, true));
        } catch (Throwable e) {
            throw new RpcException("Failed to register " + url + " to zookeeper " + getUrl() + ", cause: " + e.getMessage(), e);
        }
    }

其中toUrlPath(url)返回如下


image.png

等于說我們在/dubbo/com.starunion.transport.service.TransportService/consumers目錄下添加了該dubbo服務(wù)的消費(fèi)者信息拉宗。

directory.subscribe(subscribeUrl.addParameter(Constants.CATEGORY_KEY,
                Constants.PROVIDERS_CATEGORY
                        + "," + Constants.CONFIGURATORS_CATEGORY
                        + "," + Constants.ROUTERS_CATEGORY));

一直跟到ZookeeperRegistry的doSubscribe方法,核心代碼如下

 for (String path : toCategoriesPath(url)) {
                    ConcurrentMap<NotifyListener, ChildListener> listeners = zkListeners.get(url);
                    if (listeners == null) {
                        zkListeners.putIfAbsent(url, new ConcurrentHashMap<NotifyListener, ChildListener>());
                        listeners = zkListeners.get(url);
                    }
                    ChildListener zkListener = listeners.get(listener);
                    if (zkListener == null) {
                        listeners.putIfAbsent(listener, new ChildListener() {
                            @Override
                            public void childChanged(String parentPath, List<String> currentChilds) {
                                ZookeeperRegistry.this.notify(url, listener, toUrlsWithEmpty(url, parentPath, currentChilds));
                            }
                        });
                        zkListener = listeners.get(listener);
                    }
                    zkClient.create(path, false);
                    List<String> children = zkClient.addChildListener(path, zkListener);
                    if (children != null) {
                        urls.addAll(toUrlsWithEmpty(url, path, children));
                    }
                }
                notify(url, listener, urls);
            }

其中 toCategoriesPath(url)返回如下


image.png

所以消費(fèi)端訂閱的zk節(jié)點(diǎn)為 providers(實(shí)時(shí)的監(jiān)聽providers的變化),
configurators(實(shí)時(shí)的監(jiān)聽配置變化)旦事,routers(實(shí)時(shí)的監(jiān)聽路由配置的變化)

如果打開dubbo的后臺(tái)頁面的話魁巩,ReferenceBean關(guān)注的功能如下


image.png
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市姐浮,隨后出現(xiàn)的幾起案子谷遂,更是在濱河造成了極大的恐慌,老刑警劉巖卖鲤,帶你破解...
    沈念sama閱讀 221,820評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件肾扰,死亡現(xiàn)場離奇詭異,居然都是意外死亡蛋逾,警方通過查閱死者的電腦和手機(jī)集晚,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,648評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來换怖,“玉大人甩恼,你說我怎么就攤上這事〕了蹋” “怎么了条摸?”我有些...
    開封第一講書人閱讀 168,324評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長铸屉。 經(jīng)常有香客問我钉蒲,道長,這世上最難降的妖魔是什么彻坛? 我笑而不...
    開封第一講書人閱讀 59,714評(píng)論 1 297
  • 正文 為了忘掉前任顷啼,我火速辦了婚禮,結(jié)果婚禮上昌屉,老公的妹妹穿的比我還像新娘钙蒙。我一直安慰自己,他們只是感情好间驮,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,724評(píng)論 6 397
  • 文/花漫 我一把揭開白布躬厌。 她就那樣靜靜地躺著,像睡著了一般竞帽。 火紅的嫁衣襯著肌膚如雪扛施。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,328評(píng)論 1 310
  • 那天屹篓,我揣著相機(jī)與錄音疙渣,去河邊找鬼。 笑死堆巧,一個(gè)胖子當(dāng)著我的面吹牛妄荔,可吹牛的內(nèi)容都是我干的泼菌。 我是一名探鬼主播,決...
    沈念sama閱讀 40,897評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼懦冰,長吁一口氣:“原來是場噩夢啊……” “哼灶轰!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起刷钢,我...
    開封第一講書人閱讀 39,804評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤笋颤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后内地,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體伴澄,經(jīng)...
    沈念sama閱讀 46,345評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,431評(píng)論 3 340
  • 正文 我和宋清朗相戀三年阱缓,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了非凌。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,561評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡荆针,死狀恐怖敞嗡,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情航背,我是刑警寧澤喉悴,帶...
    沈念sama閱讀 36,238評(píng)論 5 350
  • 正文 年R本政府宣布,位于F島的核電站玖媚,受9級(jí)特大地震影響箕肃,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜今魔,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,928評(píng)論 3 334
  • 文/蒙蒙 一勺像、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧错森,春花似錦吟宦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,417評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至激挪,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間锋叨,已是汗流浹背垄分。 一陣腳步聲響...
    開封第一講書人閱讀 33,528評(píng)論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留娃磺,地道東北人薄湿。 一個(gè)月前我還...
    沈念sama閱讀 48,983評(píng)論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親豺瘤。 傳聞我的和親對(duì)象是個(gè)殘疾皇子吆倦,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,573評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容