成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

Dubbo 2.7.1 踩坑記

wudengzan / 3489人閱讀

摘要:面試題服務(wù)提供者能實(shí)現(xiàn)失效踢出是什么原理高頻題服務(wù)宕機(jī)的時(shí)候,該節(jié)點(diǎn)由于是持久節(jié)點(diǎn)會(huì)永遠(yuǎn)存在,而且當(dāng)服務(wù)再次重啟的時(shí)候會(huì)將重新注冊一個(gè)新節(jié)點(diǎn)。

Dubbo 2.7 版本增加新特性,新系統(tǒng)開始使用 Dubbo 2.7.1 嘗鮮新功能。使用過程中不慎踩到這個(gè)版本的 Bug。

系統(tǒng)架構(gòu)

Spring Boot 2.14-Release + Dubbo 2.7.1

現(xiàn)象

Dubbo 服務(wù)者啟動(dòng)成功,正常提供服務(wù),消費(fèi)者調(diào)用偶現(xiàn)失敗的情況。錯(cuò)誤如下圖:

可以看出,主要原因?yàn)?cause: message can not send, because channel is closed。 但是檢查提供者,卻發(fā)現(xiàn)服務(wù)進(jìn)程正常。

登陸 Dubbo admin 查看提供者服務(wù),發(fā)現(xiàn)這個(gè)服務(wù)存在兩個(gè)節(jié)點(diǎn)。

192.168.164.77 為測試服務(wù)器的 ip,提供者位于這臺(tái)機(jī)器,而另一個(gè) 10.20.80.67 卻是本地電腦的 IP,但是此時(shí)本地并未運(yùn)行這個(gè)服務(wù)。

再次查看服務(wù)報(bào)錯(cuò)的原因,可以看到提供者調(diào)用l本地提供 RPC 的服務(wù)。由于本地服務(wù)已停止,導(dǎo)致調(diào)用失敗。

這個(gè)問題在之前版本從未碰到,剛開始隱約記得 Dubbo 服務(wù)提供者注冊使用 ZooKeeper 臨時(shí)節(jié)點(diǎn),服務(wù)斷開,會(huì)刪除該節(jié)點(diǎn)。

問題原因

在 Dubbo 主頁搜索相關(guān) issue,看到同樣的問題 Dubbo-2.7.1 providers 重復(fù)注冊.

查看相關(guān)回復(fù),可以看到問題主要由于 dynamic 默認(rèn)值變成 false ,而 2.7.1 之前版本默認(rèn)不賦值,初始值為 null。

后續(xù) PR 中已修復(fù)該問題 Fix issue 3785,修復(fù)代碼將 dynamic 默認(rèn)設(shè)置成 true。但是截止 20190515 該版本暫未發(fā)布。

源碼分析

知道問題原因,這里我們從源碼分析一下,為什么 dynamic 設(shè)置成 false 會(huì)導(dǎo)致該問題。

注:下面分析的是 Dubbo 2.7.1 的源碼
下面我們使用 Dubbo xml 配置相關(guān)。

在 xml 配置中,可以在以下兩個(gè)地方設(shè)置 dynamic 屬性。

服務(wù)啟動(dòng)時(shí)將會(huì)使用 DubboNamespaceHandler 解析,注入 Spring 容器。

其中會(huì)將 provider 標(biāo)簽解析成 ProviderConfig 對(duì)象,service 標(biāo)簽解析成 ServiceBean 對(duì)象。

查看繼承關(guān)系,可以看到以上兩個(gè)類都繼承 AbstractServiceConfig , dynamic 位于這個(gè)父對(duì)象中。

可以看到該字段默認(rèn)值為 false。

接著查看 Dubbo 服務(wù)導(dǎo)出過程,位于 ServiceBean#export,略過其他代碼,我們直接跳到關(guān)鍵 ServiceConfig#doExportUrlsFor1Protocol 。

可以看到這里調(diào)用了多次 appendParameters 方法。 這個(gè)方法將利用反射,獲取對(duì)象的中所有字段信息,然后添加到 map 中。其中字段名字為鍵值,字段實(shí)際值為內(nèi)容。此時(shí) map 鍵值內(nèi)容為:

可以看到  map 中還有一個(gè) default.dynamic,大家翻看代碼自己思考一下,為什么會(huì)出現(xiàn)這個(gè)?

接著我們跳到后面:

在這里會(huì)將上面得到 map 組裝到 URL 對(duì)象中,然后再注冊到注冊中心。。

由于注冊中心使用的是 ZooKeeper,所以這里將會(huì)使用 ZookeeperRegistry 實(shí)現(xiàn)類。

首先查看 url##getParameter 方法,這里 Constants.DYNAMIC_KEY 值為 dynamic。

該方法會(huì)先從 parameters 中根據(jù)鍵值取值。若不存在,會(huì)再根據(jù) default 作為前綴拼接再次取值。若還不存在則使用傳入的默認(rèn)值。

查看此時(shí)的 parameters 對(duì)象。

url.getParameter(Constants.DYNAMIC_KEY, true) 返回為 false。

然后分析 zkClient#create 方法,

由于 ephemeral 為 false,所以這個(gè)服務(wù)注冊到 ZooKeeper 的節(jié)點(diǎn)為持久節(jié)點(diǎn)。

臨時(shí)節(jié)點(diǎn),客戶端斷開,會(huì)話超時(shí)后,ZooKeeper 將會(huì)自動(dòng)刪除這個(gè)節(jié)點(diǎn)。zookeeper-faq
面試題:服務(wù)提供者能實(shí)現(xiàn)失效踢出是什么原理(高頻題)

服務(wù)宕機(jī)的時(shí)候,該節(jié)點(diǎn)由于是持久節(jié)點(diǎn)會(huì)永遠(yuǎn)存在,而且當(dāng)服務(wù)再次重啟的時(shí)候會(huì)將重新注冊一個(gè)新節(jié)點(diǎn)。這樣就導(dǎo)致 ZooKeeper 中存在額外失效的節(jié)點(diǎn),且該節(jié)點(diǎn)還無法自然消除(除非手動(dòng)調(diào)用 ZooKeeper 刪除節(jié)點(diǎn)方法)。

總結(jié)

由于 Dubbo 2.7.2 暫未發(fā)布,所以建議若想使用 Dubbo 2.7 新功能的同學(xué),使用 2.7.0 版本。若現(xiàn)在正在使用 2.7.2 版本,也不要慌張。只要服務(wù)不是異常宕機(jī)或者使用 kill -9 強(qiáng)制殺死進(jìn)程,以上的現(xiàn)象將不會(huì)碰到。正常服務(wù)關(guān)閉的時(shí)候,Dubbo 服務(wù)會(huì)主動(dòng)去 ZooKeeper 注銷該服務(wù),并刪除這個(gè)節(jié)點(diǎn)。

還未使用該版本的同學(xué)們,建議使用 2.7.0 或者等 2.7.2 發(fā)布以后,再使用。

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/77707.html

相關(guān)文章

  • webpack4 坑記

    最近偶然想學(xué)習(xí)下webpack的配置,于是走上了webpack4踩坑的不歸路。。。 webpack4默認(rèn)的特性: 配置默認(rèn)初始化一些配置, 比如 entry 默認(rèn) ./src 開發(fā)模式和發(fā)布模式, 插件默認(rèn)內(nèi)置 CommonsChunk 配置簡化 使用 ES6 語法,比如 Map, Set, includes 新增 WebAssembly 構(gòu)建支持 如果要使用 webpack cli 命令,...

    lookSomeone 評(píng)論0 收藏0
  • react使用坑記(一)

    摘要:本文主要介紹在移動(dòng)端項(xiàng)目中如何使用及其配置使用腳手架生成的項(xiàng)目,后運(yùn)行彈出配置項(xiàng),該命令不可逆哦。使用了作為計(jì)算依據(jù),因此需要在中貼上以下代碼,并沒有使用淘寶的方案使用的設(shè)計(jì)圖是的哦配置的按需加載當(dāng)然了,你需要先。 本文主要介紹在react移動(dòng)端項(xiàng)目中如何使用antd-mobile2及其配置 使用 create-react-app腳手架生成的項(xiàng)目,后運(yùn)行npm run eject 彈出...

    toddmark 評(píng)論0 收藏0
  • react使用坑記(一)

    摘要:本文主要介紹在移動(dòng)端項(xiàng)目中如何使用及其配置使用腳手架生成的項(xiàng)目,后運(yùn)行彈出配置項(xiàng),該命令不可逆哦。使用了作為計(jì)算依據(jù),因此需要在中貼上以下代碼,并沒有使用淘寶的方案使用的設(shè)計(jì)圖是的哦配置的按需加載當(dāng)然了,你需要先。 本文主要介紹在react移動(dòng)端項(xiàng)目中如何使用antd-mobile2及其配置 使用 create-react-app腳手架生成的項(xiàng)目,后運(yùn)行npm run eject 彈出...

    _ang 評(píng)論0 收藏0
  • sessionStorge和localStorage的使用-坑記_09

    摘要:的使用屬性允許你訪問一個(gè)對(duì)象。它與相似,不同之處在于里面存儲(chǔ)的數(shù)據(jù)沒有過期時(shí)間設(shè)置,而存儲(chǔ)在里面的數(shù)據(jù)在頁面會(huì)話結(jié)束時(shí)會(huì)被清除。頁面會(huì)話在瀏覽器打開期間一直保持,并且重新加載或恢復(fù)頁面仍會(huì)保持原來的頁面會(huì)話。 sessionStorge的使用 sessionStorage 屬性允許你訪問一個(gè) session Storage 對(duì)象。它與 localStorage 相似,不同之處在于 lo...

    Jochen 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<