真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

Dubbo源碼如何解析服務(wù)引用原理

Dubbo源碼如何解析服務(wù)引用原理,針對這個問題,這篇文章詳細(xì)介紹了相對應(yīng)的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。

10年積累的網(wǎng)站設(shè)計、做網(wǎng)站經(jīng)驗,可以快速應(yīng)對客戶對網(wǎng)站的新想法和需求。提供各種問題對應(yīng)的解決方案。讓選擇我們的客戶得到更好、更有力的網(wǎng)絡(luò)服務(wù)。我雖然不認(rèn)識你,你也不認(rèn)識我。但先網(wǎng)站制作后付款的網(wǎng)站建設(shè)流程,更有集美免費網(wǎng)站建設(shè)讓你可以放心的選擇與我們合作。

我認(rèn)為學(xué)習(xí)一個框架,無非就三個步驟.

掌握基本使用

看過源碼,知道其中原理

臨摹源碼,自己仿寫一個簡易的框架

其實大家都清楚,編程這東西,最關(guān)鍵是多動手.也就是,第三步才是最關(guān)鍵的.但是現(xiàn)實也是非常殘酷的,絕大多數(shù)人都停留在第一步.光是第二步,都有些讓人產(chǎn)生的心里恐懼.所以在寫服務(wù)引用的時候,我就想到了小時候看紀(jì)曉嵐的一個片段.當(dāng)時紅樓夢是禁書,紀(jì)曉嵐為了讓太后看紅樓夢,就把紅樓夢這個名字換成了石頭記.這樣太后自然就沒有心里負(fù)擔(dān).我覺得用一個圖來描述可能更貼切

當(dāng)然臨摹源碼的這個過程,依肥朝拙見,也需要分為三個過程,分別是入門版(用最簡單的代碼表達(dá)出框架原理)、進階版(加入設(shè)計模式等思想,在入門版的基礎(chǔ)上優(yōu)化代碼)、高級版(和框架代碼基本一致).

插播面試題
描述一下dubbo服務(wù)引用的過程,原理

既然你提到了dubbo的服務(wù)引用中封裝通信細(xì)節(jié)是用到了動態(tài)代理,那請問創(chuàng)建動態(tài)代理常用的方式有哪些,他們又有什么區(qū)別?dubbo中用的是哪一種?(高頻題)

除了JDK動態(tài)代理和CGLIB動態(tài)代理外,還知不知道其他實現(xiàn)代理的方式?(區(qū)分度高)

原諒他
看源碼對于大多數(shù)人來說,最難的一點莫過于"從源碼的哪個地方開始看".雖然我之前數(shù)十篇dubbo源碼解析都在回答這個問題,但是每發(fā)出一篇,都還是有小伙伴私信問我同樣的問題.對此,我當(dāng)然是選擇"原諒他".因此,本篇我又再次粗暴式的點題,"怎么看源碼".就把本篇來說,這個服務(wù)引用的原理,我們要從哪里開始看呢?我們一起看一下官方文檔
Dubbo源碼如何解析服務(wù)引用原理

如果你在上一篇中把我貼出來的demo都實現(xiàn)過一遍,再看到這個圖,就不難總結(jié)出服務(wù)引用無非就是做了兩件事

將spring的schemas標(biāo)簽信息轉(zhuǎn)換bean,然后通過這個bean的信息,連接、訂閱zookeeper節(jié)點信息創(chuàng)建一個invoker

將invoker的信息創(chuàng)建一個動態(tài)代理對象

溫馨提示:除了看官方文檔入手,在dubbo源碼解析-服務(wù)暴露原理中我還提到了從輸出日志入手.當(dāng)然,我這里列舉了兩種方式只是給你提供參考,并不是說一共就只有這兩種方式,也不是說,這兩種就是最優(yōu)的.

時序圖
Dubbo源碼如何解析服務(wù)引用原理
直入主題
有部分朋友反饋說代碼貼圖手機閱讀不友好,但是如果不貼圖的話,很多朋友看完文章自己debug的時候找相應(yīng)的類和方法又要花費大量時間,所以折中一下,貼圖和貼代碼結(jié)合
Dubbo源碼如何解析服務(wù)引用原理

public  Invoker refer(Class type, URL url) throws RpcException {
    url = url.setProtocol(url.getParameter(Constants.REGISTRY_KEY, Constants.DEFAULT_REGISTRY)).removeParameter(Constants.REGISTRY_KEY);
    //序號2,這里的邏輯和之前分享的'zookeeper連接'基本一致,不熟悉的可以回去看看
    Registry registry = registryFactory.getRegistry(url);
    if (RegistryService.class.equals(type)) {
        return proxyFactory.getInvoker((T) registry, type, url);
    }
    // group="a,b" or group="*"
    Map qs = StringUtils.parseQueryString(url.getParameterAndDecoded(Constants.REFER_KEY));
    String group = qs.get(Constants.GROUP_KEY);
    if (group != null && group.length() > 0 ) {
        if ( ( Constants.COMMA_SPLIT_PATTERN.split( group ) ).length > 1
                || "*".equals( group ) ) {
            return doRefer( getMergeableCluster(), registry, type, url );
        }
    }
    return doRefer(cluster, registry, type, url);
}
private  Invoker doRefer(Cluster cluster, Registry registry, Class type, URL url) {
    RegistryDirectory directory = new RegistryDirectory(type, url);
    directory.setRegistry(registry);
    directory.setProtocol(protocol);
    URL subscribeUrl = new URL(Constants.CONSUMER_PROTOCOL, NetUtils.getLocalHost(), 0, type.getName(), directory.getUrl().getParameters());
    if (! Constants.ANY_VALUE.equals(url.getServiceInterface())
            && url.getParameter(Constants.REGISTER_KEY, true)) {
        registry.register(subscribeUrl.addParameters(Constants.CATEGORY_KEY, Constants.CONSUMERS_CATEGORY,
                Constants.CHECK_KEY, String.valueOf(false)));
    }
    //序號3,這里的邏輯和之前分享的'zookeeper訂閱'基本一致,不熟悉的可以回去看看
    directory.subscribe(subscribeUrl.addParameter(Constants.CATEGORY_KEY, 
            Constants.PROVIDERS_CATEGORY 
            + "," + Constants.CONFIGURATORS_CATEGORY 
            + "," + Constants.ROUTERS_CATEGORY));
    //序號4,cluster關(guān)鍵字在集群容錯系列也提到過,不熟悉的可以回去看看
    return cluster.join(directory);
}

上面的這4步,就完成了schemas標(biāo)簽信息到invoker的轉(zhuǎn)換,那么下面就是創(chuàng)建代理對象了(序號5)

private T createProxy(Map map) {
    //......(省略部分代碼)
    // 創(chuàng)建服務(wù)代理
    return (T) proxyFactory.getProxy(invoker);
}

我們知道,要封裝這個通信細(xì)節(jié),讓用戶像以本地調(diào)用方式調(diào)用遠(yuǎn)程服務(wù),就必須使用代理,然后說到動態(tài)代理,一般我們就想到兩種,一種是JDK的動態(tài)代理,一種是CGLIB的動態(tài)代理,那我們看看兩者有什么特點.

JDK的動態(tài)代理代理的對象必須要實現(xiàn)一個接口,而針對于沒有接口的類,則可用CGLIB.要明白兩者區(qū)別必須要了解原理,之前反復(fù)強調(diào),明白了原理自然一通百通.CGLIB其原理也很簡單,對指定的目標(biāo)類生成一個子類,并覆蓋其中方法實現(xiàn)增強,但由于采用的是繼承,所以不能對final修飾的類進行代理.

除了以上兩種大家都很熟悉的方式外,其實還有一種方式,就是javassist生成字節(jié)碼來實現(xiàn)代理(后面會詳細(xì)講,dubbo多處用到了javassist).那dubbo究竟用到了哪種方式實現(xiàn)代理呢?我們往下看

Dubbo源碼如何解析服務(wù)引用原理
Dubbo源碼如何解析服務(wù)引用原理

關(guān)于Dubbo源碼如何解析服務(wù)引用原理問題的解答就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道了解更多相關(guān)知識。


當(dāng)前題目:Dubbo源碼如何解析服務(wù)引用原理
URL網(wǎng)址:http://weahome.cn/article/gspics.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部