摘要:面試題服務提供者能實現失效踢出是什么原理高頻題服務宕機的時候,該節點由于是持久節點會永遠存在,而且當服務再次重啟的時候會將重新注冊一個新節點。
Dubbo 2.7 版本增加新特性,新系統開始使用 Dubbo 2.7.1 嘗鮮新功能。使用過程中不慎踩到這個版本的 Bug。
系統架構Spring Boot 2.14-Release + Dubbo 2.7.1
現象Dubbo 服務者啟動成功,正常提供服務,消費者調用偶現失敗的情況。錯誤如下圖:
可以看出,主要原因為 cause: message can not send, because channel is closed。 但是檢查提供者,卻發現服務進程正常。
登陸 Dubbo admin 查看提供者服務,發現這個服務存在兩個節點。
192.168.164.77 為測試服務器的 ip,提供者位于這臺機器,而另一個 10.20.80.67 卻是本地電腦的 IP,但是此時本地并未運行這個服務。
再次查看服務報錯的原因,可以看到提供者調用l本地提供 RPC 的服務。由于本地服務已停止,導致調用失敗。
這個問題在之前版本從未碰到,剛開始隱約記得 Dubbo 服務提供者注冊使用 ZooKeeper 臨時節點,服務斷開,會刪除該節點。
問題原因在 Dubbo 主頁搜索相關 issue,看到同樣的問題 Dubbo-2.7.1 providers 重復注冊.
查看相關回復,可以看到問題主要由于 dynamic 默認值變成 false ,而 2.7.1 之前版本默認不賦值,初始值為 null。
后續 PR 中已修復該問題 Fix issue 3785,修復代碼將 dynamic 默認設置成 true。但是截止 20190515 該版本暫未發布。
源碼分析知道問題原因,這里我們從源碼分析一下,為什么 dynamic 設置成 false 會導致該問題。
注:下面分析的是 Dubbo 2.7.1 的源碼
下面我們使用 Dubbo xml 配置相關。
在 xml 配置中,可以在以下兩個地方設置 dynamic 屬性。
服務啟動時將會使用 DubboNamespaceHandler 解析,注入 Spring 容器。
其中會將 provider 標簽解析成 ProviderConfig 對象,service 標簽解析成 ServiceBean 對象。
查看繼承關系,可以看到以上兩個類都繼承 AbstractServiceConfig , dynamic 位于這個父對象中。
可以看到該字段默認值為 false。
接著查看 Dubbo 服務導出過程,位于 ServiceBean#export,略過其他代碼,我們直接跳到關鍵 ServiceConfig#doExportUrlsFor1Protocol 。
可以看到這里調用了多次 appendParameters 方法。 這個方法將利用反射,獲取對象的中所有字段信息,然后添加到 map 中。其中字段名字為鍵值,字段實際值為內容。此時 map 鍵值內容為:
可以看到 map 中還有一個 default.dynamic,大家翻看代碼自己思考一下,為什么會出現這個?
接著我們跳到后面:
在這里會將上面得到 map 組裝到 URL 對象中,然后再注冊到注冊中心。。
由于注冊中心使用的是 ZooKeeper,所以這里將會使用 ZookeeperRegistry 實現類。
首先查看 url##getParameter 方法,這里 Constants.DYNAMIC_KEY 值為 dynamic。
該方法會先從 parameters 中根據鍵值取值。若不存在,會再根據 default 作為前綴拼接再次取值。若還不存在則使用傳入的默認值。
查看此時的 parameters 對象。
url.getParameter(Constants.DYNAMIC_KEY, true) 返回為 false。
然后分析 zkClient#create 方法,
由于 ephemeral 為 false,所以這個服務注冊到 ZooKeeper 的節點為持久節點。
臨時節點,客戶端斷開,會話超時后,ZooKeeper 將會自動刪除這個節點。zookeeper-faq
面試題:服務提供者能實現失效踢出是什么原理(高頻題)
服務宕機的時候,該節點由于是持久節點會永遠存在,而且當服務再次重啟的時候會將重新注冊一個新節點。這樣就導致 ZooKeeper 中存在額外失效的節點,且該節點還無法自然消除(除非手動調用 ZooKeeper 刪除節點方法)。
總結由于 Dubbo 2.7.2 暫未發布,所以建議若想使用 Dubbo 2.7 新功能的同學,使用 2.7.0 版本。若現在正在使用 2.7.2 版本,也不要慌張。只要服務不是異常宕機或者使用 kill -9 強制殺死進程,以上的現象將不會碰到。正常服務關閉的時候,Dubbo 服務會主動去 ZooKeeper 注銷該服務,并刪除這個節點。
還未使用該版本的同學們,建議使用 2.7.0 或者等 2.7.2 發布以后,再使用。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/77707.html
最近偶然想學習下webpack的配置,于是走上了webpack4踩坑的不歸路。。。 webpack4默認的特性: 配置默認初始化一些配置, 比如 entry 默認 ./src 開發模式和發布模式, 插件默認內置 CommonsChunk 配置簡化 使用 ES6 語法,比如 Map, Set, includes 新增 WebAssembly 構建支持 如果要使用 webpack cli 命令,...
摘要:本文主要介紹在移動端項目中如何使用及其配置使用腳手架生成的項目,后運行彈出配置項,該命令不可逆哦。使用了作為計算依據,因此需要在中貼上以下代碼,并沒有使用淘寶的方案使用的設計圖是的哦配置的按需加載當然了,你需要先。 本文主要介紹在react移動端項目中如何使用antd-mobile2及其配置 使用 create-react-app腳手架生成的項目,后運行npm run eject 彈出...
摘要:本文主要介紹在移動端項目中如何使用及其配置使用腳手架生成的項目,后運行彈出配置項,該命令不可逆哦。使用了作為計算依據,因此需要在中貼上以下代碼,并沒有使用淘寶的方案使用的設計圖是的哦配置的按需加載當然了,你需要先。 本文主要介紹在react移動端項目中如何使用antd-mobile2及其配置 使用 create-react-app腳手架生成的項目,后運行npm run eject 彈出...
摘要:的使用屬性允許你訪問一個對象。它與相似,不同之處在于里面存儲的數據沒有過期時間設置,而存儲在里面的數據在頁面會話結束時會被清除。頁面會話在瀏覽器打開期間一直保持,并且重新加載或恢復頁面仍會保持原來的頁面會話。 sessionStorge的使用 sessionStorage 屬性允許你訪問一個 session Storage 對象。它與 localStorage 相似,不同之處在于 lo...
閱讀 3723·2021-10-13 09:39
閱讀 3789·2021-09-24 09:48
閱讀 1189·2021-09-01 10:30
閱讀 2526·2019-08-30 15:55
閱讀 1774·2019-08-29 16:39
閱讀 2296·2019-08-26 13:55
閱讀 3050·2019-08-26 12:23
閱讀 1634·2019-08-26 11:59