×

Dubbo源碼解析實(shí)戰(zhàn) - 服務(wù)暴露原理

分類:互聯(lián)網(wǎng)熱點(diǎn) 編輯:聊聊云計(jì)算 瀏覽量:2
2020-07-20 13:33:06
dubbo面試中比較喜歡問(wèn)的兩個(gè)點(diǎn):服務(wù)發(fā)布和服務(wù)引用. # 人性的拷問(wèn) - 服務(wù)發(fā)布過(guò)程中做了哪些事 - dubbo都有哪些協(xié)議,他們之間有什么特點(diǎn),缺省值是什么 - 什么是本地暴露和遠(yuǎn)程暴露,他們的區(qū)別 直入主題 從啟動(dòng)日志說(shuō)起 ![](https://img-blog.csdnimg.cn/20191124151625334.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9qYXZhZWRnZS5ibG9nLmNzZG4ubmV0,size_1,color_FFFFFF,t_70) 這里不同顏色的框?qū)㈥P(guān)鍵的地方畫(huà)了出來(lái),一共有6種顏色, 從上到下 1. 暴露本地服務(wù) 2. 暴露遠(yuǎn)程服務(wù) 3. 啟動(dòng)netty 4. 連接zookeeper 5. 到zookeeper注冊(cè) 6. 監(jiān)聽(tīng)zookeeper # 全局總覽 先看官方文檔說(shuō)明 ## 服務(wù)提供者暴露一個(gè)服務(wù)的詳細(xì)過(guò)程 - 服務(wù)提供者暴露服務(wù)的主過(guò)程 ![](https://img-blog.csdnimg.cn/20191124160150667.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9qYXZhZWRnZS5ibG9nLmNzZG4ubmV0,size_1,color_FFFFFF,t_70) 首先 `ServiceConfig` 類拿到對(duì)外提供服務(wù)的實(shí)際類 ref(如:HelloWorldImpl),然后通過(guò) `ProxyFactory` 類的 `getInvoker` 方法使用 ref 生成一個(gè) `AbstractProxyInvoker` 實(shí)例,到這一步就完成具體服務(wù)到 Invoker 的轉(zhuǎn)化。 接下來(lái)就是 Invoker 轉(zhuǎn)換到 Exporter 的過(guò)程。 ![](https://img-blog.csdnimg.cn/20191124161756667.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9qYXZhZWRnZS5ibG9nLmNzZG4ubmV0,size_1,color_FFFFFF,t_70) 看源碼,很多人最常問(wèn)的一句話就是,怎么入手,也就是切入點(diǎn).那么我們還是以開(kāi)頭的日志為例,來(lái)找一個(gè)這個(gè)切入點(diǎn) 仔細(xì)看輸出日志,就會(huì)發(fā)現(xiàn)在暴露本地服務(wù)之前,有一句很重要的日志,就是 ```bash The service ready on spring started. service: com.alibaba.dubbo.demo.DemoService, dubbo version: 2.0.0, current host: 127.0.0.1 ``` > 該打印在今年八月被移除,具體原因不明, 留待日后分析,先繼續(xù)經(jīng)典版本源碼 > ![] > ![](https://img-blog.csdnimg.cn/2019112416565177.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9qYXZhZWRnZS5ibG9nLmNzZG4ubmV0,size_1,color_FFFFFF,t_70) 定位到了`ServiceBean`這個(gè)類 - 繼承體系圖 ![](https://img-blog.csdnimg.cn/20191124165857776.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9qYXZhZWRnZS5ibG9nLmNzZG4ubmV0,size_1,color_FFFFFF,t_70) > 繼續(xù)按照經(jīng)典版本源碼講解,這里最新版源碼由于刪除了相關(guān)接口 從這個(gè)圖我們看到了許多和spring有關(guān)的東西,還發(fā)現(xiàn)了一個(gè)重要的接口,那就是`ApplicationListener` 就是spring的事件機(jī)制(event).什么是事件機(jī)制呢? 就比如監(jiān)聽(tīng)spring容器初始化完成.那我們就定位到這行日志的位置,往下debug ![](https://img-blog.csdnimg.cn/20191124170659797.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9qYXZhZWRnZS5ibG9nLmNzZG4ubmV0,size_1,color_FFFFFF,t_70) ![](https://img-blog.csdnimg.cn/20191124170708847.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9qYXZhZWRnZS5ibG9nLmNzZG4ubmV0,size_1,color_FFFFFF,t_70) ![](https://img-blog.csdnimg.cn/20191124170721312.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9qYXZhZWRnZS5ibG9nLmNzZG4ubmV0,size_1,color_FFFFFF,t_70) 重點(diǎn)!!! ![](https://img-blog.csdnimg.cn/20191124171616267.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9qYXZhZWRnZS5ibG9nLmNzZG4ubmV0,size_1,color_FFFFFF,t_70) ![](https://img-blog.csdnimg.cn/20191124171851867.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9qYXZhZWRnZS5ibG9nLmNzZG4ubmV0,size_1,color_FFFFFF,t_70) 這個(gè)dubbo.properties文件是怎么時(shí)候加載的,好像我根本沒(méi)有設(shè)置,另外這個(gè)dubbo.properties文件的名字能不能改? ![](https://img-blog.csdnimg.cn/20191124195126940.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9qYXZhZWRnZS5ibG9nLmNzZG4ubmV0,size_1,color_FFFFFF,t_70) - 同理,對(duì)于log4j.xml文件 ![](https://img-blog.csdnimg.cn/20191124195351829.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9qYXZhZWRnZS5ibG9nLmNzZG4ubmV0,size_16,color_FFFFFF,t_70) 接下來(lái)繼續(xù)往下走,下面這里就是我們的第二道面試題 ![](https://img-blog.csdnimg.cn/20191124195620539.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9qYXZhZWRnZS5ibG9nLmNzZG4ubmV0,size_1,color_FFFFFF,t_70) - 因?yàn)閐ubbo是支持多協(xié)議的,看文檔原話 ![](https://img-blog.csdnimg.cn/20191124195642846.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9qYXZhZWRnZS5ibG9nLmNzZG4ubmV0,size_1,color_FFFFFF,t_70) - Dubbo支持多種協(xié)議,默認(rèn)使用的是dubbo協(xié)議 (https://blog.csdn.net/qq_33589510/article/details/103108713) 到了第三個(gè)面試題,也是服務(wù)發(fā)布的重點(diǎn),`本地暴露和遠(yuǎn)程暴露` ![](https://img-blog.csdnimg.cn/20191124201218464.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9qYXZhZWRnZS5ibG9nLmNzZG4ubmV0,size_1,color_FFFFFF,t_70) 為什么會(huì)有本地暴露和遠(yuǎn)程暴露呢? 不從場(chǎng)景考慮討論技術(shù)的沒(méi)有意義是.在dubbo中我們一個(gè)服務(wù)可能既是Provider,又是Consumer,因此就存在他自己調(diào)用自己服務(wù)的情況,如果再通過(guò)網(wǎng)絡(luò)去訪問(wèn),那自然是舍近求遠(yuǎn) 因此他是有本地暴露服務(wù)的這個(gè)設(shè)計(jì) - 本地暴露是暴露在JVM中,不需要網(wǎng)絡(luò)通信 - 遠(yuǎn)程暴露是將ip,端口等信息暴露給遠(yuǎn)程客戶端,調(diào)用時(shí)需要網(wǎng)絡(luò)通信 ![](https://img-blog.csdnimg.cn/20191124202252323.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9qYXZhZWRnZS5ibG9nLmNzZG4ubmV0,size_1,color_FFFFFF,t_70) ![](https://img-blog.csdnimg.cn/20191124202414239.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9qYXZhZWRnZS5ibG9nLmNzZG4ubmV0,size_1,color_FFFFFF,t_70) 從上圖可知,這里用到了Adaptive, - 點(diǎn)進(jìn)ProxyFactory查看源碼 ![](https://img-blog.csdnimg.cn/20191124201927649.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9qYXZhZWRnZS5ibG9nLmNzZG4ubmV0,size_1,color_FFFFFF,t_70) @Adaptive注解打在類上和方法上,他們是有區(qū)別的 在方法上,就會(huì)生成動(dòng)態(tài)編譯的Adaptive類,下面就介紹一下怎么看這個(gè)動(dòng)態(tài)編譯類的源碼 - 首先要將這個(gè)log4j的level調(diào)整為DEBUG ![](https://img-blog.csdnimg.cn/20191124202701924.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9qYXZhZWRnZS5ibG9nLmNzZG4ubmV0,size_1,color_FFFFFF,t_70) 為什么需要調(diào)整成DEBUG, 比如下圖 ![](https://img-blog.csdnimg.cn/20191124203107893.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9qYXZhZWRnZS5ibG9nLmNzZG4ubmV0,size_1,color_FFFFFF,t_70) 打開(kāi)DEBUG后,我們重新啟動(dòng),就會(huì)看到日志有如下輸出,這段就是相關(guān)代碼,我們根據(jù)包名新建文件,如下 ![](https://img-blog.csdnimg.cn/20191124203137536.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9qYXZhZWRnZS5ibG9nLmNzZG4ubmV0,size_1,color_FFFFFF,t_70) ![](https://img-blog.csdnimg.cn/20191124203245946.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9qYXZhZWRnZS5ibG9nLmNzZG4ubmV0,size_1,color_FFFFFF,t_70) 我們?cè)趃etInvoker方法上打上斷點(diǎn),重啟一下. ![](https://img-blog.csdnimg.cn/2019112420331334.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9qYXZhZWRnZS5ibG9nLmNzZG4ubmV0,size_1,color_FFFFFF,t_70) ![](https://img-blog.csdnimg.cn/20191124203346500.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9qYXZhZWRnZS5ibG9nLmNzZG4ubmV0,size_1,color_FFFFFF,t_70) ![](https://img-blog.csdnimg.cn/20191124203355960.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9qYXZhZWRnZS5ibG9nLmNzZG4ubmV0,size_1,color_FFFFFF,t_70) 由上圖知道,本地暴露的url是以injvm開(kāi)頭的,下面來(lái)看下遠(yuǎn)程暴露,其實(shí)這個(gè)也是回答本地暴露和遠(yuǎn)程暴露區(qū)別的一個(gè)回答點(diǎn).面試回答要的并不是一個(gè)滿分的答案,而是從一些細(xì)節(jié)中,看出一個(gè)人,是否真的研究過(guò)源碼. ![](https://img-blog.csdnimg.cn/20191124203417820.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9qYXZhZWRnZS5ibG9nLmNzZG4ubmV0,size_1,color_FFFFFF,t_70) 還是回到開(kāi)頭那句話,dubbo命名是很規(guī)范的,從Wrapper這個(gè)命名,其實(shí)可以和Spring的Bean Wrapper,以及裝飾者設(shè)計(jì)模式聯(lián)系起來(lái).同時(shí)可以看看文檔中的編碼約定 # 參考 - https://www.jianshu.com/p/60a9263f2ee2 -

聲明:免責(zé)聲明:本文內(nèi)容由互聯(lián)網(wǎng)用戶自發(fā)貢獻(xiàn)自行上傳,本網(wǎng)站不擁有所有權(quán),也不承認(rèn)相關(guān)法律責(zé)任。如果您發(fā)現(xiàn)本社區(qū)中有涉嫌抄襲的內(nèi)容,請(qǐng)發(fā)

送郵件至:operations@xinnet.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),本站將立刻刪除涉嫌侵權(quán)內(nèi)容。本站原創(chuàng)內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)

需注明出處:新網(wǎng)idc知識(shí)百科

免費(fèi)咨詢獲取折扣

Loading