溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Arthas定位Dubbo手動注冊Eureka異常怎么解決

發(fā)布時間:2021-12-15 16:20:17 來源:億速云 閱讀:146 作者:iii 欄目:云計算

本篇內(nèi)容介紹了“Arthas定位Dubbo手動注冊Eureka異常怎么解決”的有關(guān)知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細閱讀,能夠?qū)W有所成!

使用背景

在一個大的團隊里面,會因為很多歷史原因或客觀因素導(dǎo)致技術(shù)棧并不統(tǒng)一,我們就遇到這么一個問題。老項目是使用 Dubbo 框架的 Dubbo 協(xié)議進行服務(wù)交互,有新的項目是使用 Springcloud 體系的 Feignclient 框架的 Http 協(xié)議進行交互。那么就需要解決兩個問題。

  • 問題 1 是 Dubbo 服務(wù)需要支持 Dubbo 協(xié)議又需要支撐 Http 協(xié)議。

  • 問題 2 是 Feignclient 框架能夠無損調(diào)用 Dubbo 服務(wù)的 Http 協(xié)議(無損指的是 Dubbo 對 Feignclient 調(diào)用方能夠做到服務(wù)動態(tài)感知,負載均衡不需要做二次開發(fā))。

解決思路

有了以上的目標,我們就需要想辦法解決問題。解決第一個問題倒是比較容易,Dubbo 本身就提供的 Http 協(xié)議暴漏。也就是將老工程 Dubbo 升級、配置兩種協(xié)議問題一就這么解決了。

但是針對問題 2,我們可以羅列一下遇到的問題。Dubbo 注冊使用的是 zk 注冊中心,Springcloud 工程使用 Eureka 注冊中心。這里順帶也要贊美一下 Feignclient 框架,F(xiàn)eignclient 接入服務(wù)的門檻很低,這樣兼容了很多語言、環(huán)境等帶來的差異,也就是說只要是 http 協(xié)議的接口 Feignclient 就能調(diào)用。到這里實際上通過 Feignclient 直接調(diào)用 Dubbo 服務(wù)暴漏的 Http 協(xié)議接口是能夠走的通,只不過沒法做到負載均衡,失敗轉(zhuǎn)移等能力。說了這么多總結(jié)一下吧。

  • 現(xiàn)在通過 Feignclient 直連 Dubbo 框架工程的 Http 協(xié)議能夠正常執(zhí)行。

  • 分布式環(huán)境下需要解決直連的弊端(無法負載均衡,無法失敗轉(zhuǎn)移,無法動態(tài)擴容等等) 好在通過分析了 Eureka 源碼以后打開了另一個大門,Eureka 實際上是獨立的組件,而且提供手動注冊服務(wù)的能力(即使沒有修改源碼就有了)。現(xiàn)在解決思路就是在 Dubbo 工程里面引入 Eureka 組件,手動將服務(wù)注冊到 Eureak 以便 Feignclient 能夠無損調(diào)用。

主角(Arthas)登場

為了將 Dubbo 框架工程提供注冊 Eureka 的能力,并且能夠做到優(yōu)雅上線和下線。我們主要是借助了 Dubbo 的 Spi 擴展能力中的 Container 擴展。代碼如下:

class EurekaDubboContainer implements Container {...}

有了以上代碼還需要做一件重要的事情,就是聲明 Container 的全路徑。META-INF/dubbo/org.apache.dubbo.container.Container:xxx=com.xxx.XxxContainer,當(dāng)時我們配置這里的代碼 spring=com.xxx.EurekaDubboContainer,當(dāng)所有準備好了以后我們啟動工程,發(fā)現(xiàn)無異常輸出,進程完美。但是 Deignclient 怎么也無法調(diào)用。最主要是啟動過程中沒有任何異常輸出,經(jīng)過大量論證后,就在快絕望的時候,我發(fā)現(xiàn)了 Arthas,Arthas 可以查看內(nèi)存中對象屬性值以及執(zhí)行對象的方法,我欣喜若狂。通過之前對 Dubbo 注冊過程源碼分析:

com.alibaba.dubbo.common.extension.ExtensionLoader#loadFile
} catch (Throwable t) {
  IllegalStateException e = new IllegalStateException("Failed to load extension class(interface: " + type + ", class line: " + line + ") in " + url + ", cause: " + t.getMessage(), t);
  exceptions.put(line, e);
}

在 Dubbo 啟動過程,會從 Jar 包中掃描配置的 META-INF 中配置的 Container,在加載的時候這個異常是直接存放在了 Loader 類的域中,猜測可能是為了解決 Container 隔離所以異常并沒有拋出。當(dāng)前主要目標還是分析為啥我定義的擴展容易沒有啟動。部署 Arthas 以后我開始了分析之路。

  • sc -d *.EurekaDubboContainer 發(fā)現(xiàn)類已經(jīng)正常加載,說明有被 Load 加載。

  • jad *.EurekaDubboContainer 發(fā)現(xiàn)加載的類代碼也是在正常(排除包不對的可能)。

  • ognl '#loader=@com.alibaba.dubbo.container.Main@loader,#loader.cachedInstances' 這里發(fā)現(xiàn)了問題,如果是正常被 Load 的 Container 會被存在到 ExtensionLoader 的 CachedInstances 域中(默認的 Spring,log4j存在),但是我自定義的 Container 竟然沒找到。

  • ognl '#loader=@com.alibaba.dubbo.container.Main@loader,#loader.exceptions' 這里發(fā)現(xiàn)了之所有沒有加載成功的原因,在 Exceptions 中有聲明。

Arthas定位Dubbo手動注冊Eureka異常怎么解決

通過以上分析,問題非常明顯了,在 META-INF 中指定的 Key 重復(fù)了。還是沒深入理解 Dubbo 中的 Spi 文檔上的‘xxx’是自定義的意思。到這里修改 Key 以后一切按照計劃執(zhí)行。

“Arthas定位Dubbo手動注冊Eureka異常怎么解決”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識可以關(guān)注億速云網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實用文章!

向AI問一下細節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI