本篇內容介紹了“Arthas定位Dubbo手動注冊Eureka異常怎么解決”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!
創(chuàng)新互聯(lián)于2013年創(chuàng)立,是專業(yè)互聯(lián)網(wǎng)技術服務公司,擁有項目網(wǎng)站建設、成都網(wǎng)站建設網(wǎng)站策劃,項目實施與項目整合能力。我們以讓每一個夢想脫穎而出為使命,1280元贛州做網(wǎng)站,已為上家服務,為贛州各地企業(yè)和個人服務,聯(lián)系電話:18980820575
在一個大的團隊里面,會因為很多歷史原因或客觀因素導致技術棧并不統(tǒng)一,我們就遇到這么一個問題。老項目是使用 Dubbo 框架的 Dubbo 協(xié)議進行服務交互,有新的項目是使用 Springcloud 體系的 Feignclient 框架的 Http 協(xié)議進行交互。那么就需要解決兩個問題。
問題 1 是 Dubbo 服務需要支持 Dubbo 協(xié)議又需要支撐 Http 協(xié)議。
問題 2 是 Feignclient 框架能夠無損調用 Dubbo 服務的 Http 協(xié)議(無損指的是 Dubbo 對 Feignclient 調用方能夠做到服務動態(tài)感知,負載均衡不需要做二次開發(fā))。
有了以上的目標,我們就需要想辦法解決問題。解決第一個問題倒是比較容易,Dubbo 本身就提供的 Http 協(xié)議暴漏。也就是將老工程 Dubbo 升級、配置兩種協(xié)議問題一就這么解決了。
但是針對問題 2,我們可以羅列一下遇到的問題。Dubbo 注冊使用的是 zk 注冊中心,Springcloud 工程使用 Eureka 注冊中心。這里順帶也要贊美一下 Feignclient 框架,F(xiàn)eignclient 接入服務的門檻很低,這樣兼容了很多語言、環(huán)境等帶來的差異,也就是說只要是 http 協(xié)議的接口 Feignclient 就能調用。到這里實際上通過 Feignclient 直接調用 Dubbo 服務暴漏的 Http 協(xié)議接口是能夠走的通,只不過沒法做到負載均衡,失敗轉移等能力。說了這么多總結一下吧。
現(xiàn)在通過 Feignclient 直連 Dubbo 框架工程的 Http 協(xié)議能夠正常執(zhí)行。
分布式環(huán)境下需要解決直連的弊端(無法負載均衡,無法失敗轉移,無法動態(tài)擴容等等) 好在通過分析了 Eureka 源碼以后打開了另一個大門,Eureka 實際上是獨立的組件,而且提供手動注冊服務的能力(即使沒有修改源碼就有了)?,F(xiàn)在解決思路就是在 Dubbo 工程里面引入 Eureka 組件,手動將服務注冊到 Eureak 以便 Feignclient 能夠無損調用。
為了將 Dubbo 框架工程提供注冊 Eureka 的能力,并且能夠做到優(yōu)雅上線和下線。我們主要是借助了 Dubbo 的 Spi 擴展能力中的 Container 擴展。代碼如下:
class EurekaDubboContainer implements Container {...}
有了以上代碼還需要做一件重要的事情,就是聲明 Container 的全路徑。META-INF/dubbo/org.apache.dubbo.container.Container:xxx=com.xxx.XxxContainer
,當時我們配置這里的代碼 spring=com.xxx.EurekaDubboContainer
,當所有準備好了以后我們啟動工程,發(fā)現(xiàn)無異常輸出,進程完美。但是 Deignclient 怎么也無法調用。最主要是啟動過程中沒有任何異常輸出,經(jīng)過大量論證后,就在快絕望的時候,我發(fā)現(xiàn)了 Arthas,Arthas 可以查看內存中對象屬性值以及執(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 隔離所以異常并沒有拋出。當前主要目標還是分析為啥我定義的擴展容易沒有啟動。部署 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 中有聲明。
通過以上分析,問題非常明顯了,在 META-INF 中指定的 Key 重復了。還是沒深入理解 Dubbo 中的 Spi 文檔上的‘xxx’是自定義的意思。到這里修改 Key 以后一切按照計劃執(zhí)行。
“Arthas定位Dubbo手動注冊Eureka異常怎么解決”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關的知識可以關注創(chuàng)新互聯(lián)網(wǎng)站,小編將為大家輸出更多高質量的實用文章!
文章標題:Arthas定位Dubbo手動注冊Eureka異常怎么解決
文章轉載:http://jinyejixie.com/article46/jogehg.html
成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供搜索引擎優(yōu)化、品牌網(wǎng)站設計、商城網(wǎng)站、響應式網(wǎng)站、網(wǎng)站導航、域名注冊
聲明:本網(wǎng)站發(fā)布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經(jīng)允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)