當(dāng)Dubbo遇上Arthas着绷,會(huì)碰撞出什么樣的火花呢?

Apache Dubbo是Alibaba開源的高性能RPC框架锌云,在國(guó)內(nèi)有非常多的用戶荠医。

當(dāng)Dubbo遇上Arthas,會(huì)碰撞出什么樣的火花呢攻冷?下面來(lái)分享Arthas排查Dubbo問(wèn)題的一些經(jīng)驗(yàn)娃胆。

之前,分享過(guò)如何使用Arthas等曼,見:阿里的Java調(diào)試神器遇到這款I(lǐng)DEA插件里烦,超神!

dubbo-arthas-demo

下面的排查分享基于這個(gè)dubbo-arthas-demo禁谦,非常簡(jiǎn)單的一個(gè)應(yīng)用胁黑,瀏覽器請(qǐng)求從Spring MVC到Dubbo Client,再發(fā)送到Dubbo Server枷畏。

Demo里有兩個(gè)spring boot應(yīng)用别厘,可以先啟動(dòng)server-demo,再啟動(dòng)client-demo拥诡。


Server端:


Arthas快速開始

-https://alibaba.github.io/arthas/install-detail.html


啟動(dòng)后触趴,會(huì)列出所有的java進(jìn)程,選擇1渴肉,然后回車冗懦,就會(huì)連接上ServerDemoApplication

Dubbo線上服務(wù)拋出異常,怎么獲取調(diào)用參數(shù)仇祭?

-https://alibaba.github.io/arthas/watch.html
當(dāng)線上服務(wù)拋出異常時(shí)披蕉,最著急的是什么參數(shù)導(dǎo)致了拋異常?

在demo里,

訪問(wèn)http://localhost:8080/user/0,UserServiceImpl就會(huì)拋出一個(gè)異常,因?yàn)閡ser id不合法乌奇。

在Arthas里執(zhí)行 watch com.example.UserService * -e -x 2 '{params,throwExp}' 没讲,然后再次訪問(wèn),就可以看到watch命令把參數(shù)和異常都打印出來(lái)了礁苗。


怎樣線上調(diào)試Dubbo服務(wù)代碼?

-https://alibaba.github.io/arthas/redefine.html
在本地開發(fā)時(shí)爬凑,可能會(huì)用到熱部署工具,直接改代碼试伙,不需要重啟應(yīng)用嘁信。但是在線上環(huán)境于样,有沒有辦法直接動(dòng)態(tài)調(diào)試代碼?比如增加日志潘靖。

在Arthas里穿剖,可以通過(guò)redefine命令來(lái)達(dá)到線上不重啟,動(dòng)態(tài)更新代碼的效果卦溢。

比如我們修改下UserServiceImpl糊余,用System.out打印出具體的User對(duì)象來(lái):



本地編繹后,把

server-demo/target/classes/com/example/UserServiceImpl.class

傳到線上服務(wù)器,然后用redefine命令來(lái)更新代碼:


這樣子更新成功之后,訪問(wèn) http://localhost:8080/user/1,在ServerDemoApplication的控制臺(tái)里就可以看到打印出了user信息既绕。

怎樣動(dòng)態(tài)修改Dubbo的logger級(jí)別?

-https://alibaba.github.io/arthas/ognl.html
-https://alibaba.github.io/arthas/sc.html
-https://commons.apache.org/proper/commons-ognl/language-guide.html
在排查問(wèn)題時(shí)啄刹,需要查看到更多的信息,如果可以把logger級(jí)別修改為DEBUG凄贩,就非常有幫助。

ognl是apache開源的一個(gè)輕量級(jí)表達(dá)式引擎袱讹。下面通過(guò)Arthas里的ognl命令來(lái)動(dòng)態(tài)修改logger級(jí)別疲扎。

首先獲取Dubbo里TraceFilter的一個(gè)logger對(duì)象,看下它的實(shí)現(xiàn)類捷雕,可以發(fā)現(xiàn)是log4j椒丧。



再用sc命令來(lái)查看具體從哪個(gè)jar包里加載的:



可以看到log4j是通過(guò)slf4j代理的。

那么通過(guò)org.slf4j.LoggerFactory獲取root logger救巷,再修改它的level:



可以看到修改之后壶熏,root logger的level變?yōu)镈EBUG。

怎樣減少測(cè)試小姐姐重復(fù)發(fā)請(qǐng)求的麻煩?

-https://alibaba.github.io/arthas/tt.html
在平時(shí)開發(fā)時(shí)浦译,可能需要測(cè)試小姐姐發(fā)請(qǐng)求過(guò)來(lái)聯(lián)調(diào)棒假,但是我們?cè)赿ebug時(shí),可能不小心直接跳過(guò)去了精盅。這樣子就尷尬了帽哑,需要測(cè)試小姐姐再發(fā)請(qǐng)求過(guò)來(lái)。

Arthas里提供了tt命令叹俏,可以減少這種麻煩妻枕,可以直接重放請(qǐng)求。



上面的tt -t命令捕獲到了3個(gè)請(qǐng)求粘驰。然后通過(guò)tt --play可以重放請(qǐng)求:



Dubbo運(yùn)行時(shí)有哪些Filter? 耗時(shí)是多少?

-https://alibaba.github.io/arthas/trace.html
Dubbo運(yùn)行時(shí)會(huì)加載很多的Filter屡谐,那么一個(gè)請(qǐng)求會(huì)經(jīng)過(guò)哪些Filter處理,F(xiàn)ilter里的耗時(shí)又是多少呢蝌数?

通過(guò)Arthas的trace命令愕掏,可以很方便地知道Filter的信息,可以看到詳細(xì)的調(diào)用棧和耗時(shí)籽前。


Dubbo動(dòng)態(tài)代理是怎樣實(shí)現(xiàn)的?

-.github.io/arthas/jad.html
-com.alibaba.dubbo.common.bytecode.Wrapper
通過(guò)Arthas的jad命令亭珍,可以看到Dubbo通過(guò)javaassist動(dòng)態(tài)生成的Wrappr類的代碼:



獲取Spring context

除了上面介紹的一些排查技巧敷钾,下面分享一個(gè)獲取Spring Context,然后“為所欲為”的例子肄梨。

在Dubbo里有一個(gè)擴(kuò)展

com.alibaba.dubbo.config.spring.extension.SpringExtensionFactory,把Spring Context保存到了里面阻荒。

因此,我們可以通過(guò)ognl命令獲取到众羡。



-SpringExtensionFactory@contexts.iterator.next 獲取到SpringExtensionFactory里保存的spring context對(duì)象
-#context.getBean("userServiceImpl").findUser(1) 獲取到userServiceImpl再執(zhí)行一次調(diào)用

只要充分發(fā)揮想像力侨赡,組合Arthas里的各種命令,可以發(fā)揮出神奇的效果粱侣。

最后

感謝大家看到這里羊壹,如果本文有什么不足之處,歡迎多多指教齐婴;如果你覺得對(duì)你有幫助油猫,請(qǐng)給我點(diǎn)個(gè)贊。
也歡迎大家關(guān)注我的公眾號(hào):程序員麥冬柠偶,每天更新行業(yè)資訊情妖!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市诱担,隨后出現(xiàn)的幾起案子毡证,更是在濱河造成了極大的恐慌,老刑警劉巖蔫仙,帶你破解...
    沈念sama閱讀 222,590評(píng)論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件料睛,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡摇邦,警方通過(guò)查閱死者的電腦和手機(jī)恤煞,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,157評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)涎嚼,“玉大人阱州,你說(shuō)我怎么就攤上這事》ㄌ荩” “怎么了苔货?”我有些...
    開封第一講書人閱讀 169,301評(píng)論 0 362
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)立哑。 經(jīng)常有香客問(wèn)我夜惭,道長(zhǎng),這世上最難降的妖魔是什么铛绰? 我笑而不...
    開封第一講書人閱讀 60,078評(píng)論 1 300
  • 正文 為了忘掉前任诈茧,我火速辦了婚禮,結(jié)果婚禮上捂掰,老公的妹妹穿的比我還像新娘敢会。我一直安慰自己曾沈,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,082評(píng)論 6 398
  • 文/花漫 我一把揭開白布鸥昏。 她就那樣靜靜地躺著塞俱,像睡著了一般。 火紅的嫁衣襯著肌膚如雪吏垮。 梳的紋絲不亂的頭發(fā)上障涯,一...
    開封第一講書人閱讀 52,682評(píng)論 1 312
  • 那天,我揣著相機(jī)與錄音膳汪,去河邊找鬼唯蝶。 笑死,一個(gè)胖子當(dāng)著我的面吹牛遗嗽,可吹牛的內(nèi)容都是我干的粘我。 我是一名探鬼主播,決...
    沈念sama閱讀 41,155評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼媳谁,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼涂滴!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起晴音,我...
    開封第一講書人閱讀 40,098評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎缔杉,沒想到半個(gè)月后锤躁,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,638評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡或详,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,701評(píng)論 3 342
  • 正文 我和宋清朗相戀三年系羞,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片霸琴。...
    茶點(diǎn)故事閱讀 40,852評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡椒振,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出梧乘,到底是詐尸還是另有隱情澎迎,我是刑警寧澤,帶...
    沈念sama閱讀 36,520評(píng)論 5 351
  • 正文 年R本政府宣布选调,位于F島的核電站夹供,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏仁堪。R本人自食惡果不足惜哮洽,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,181評(píng)論 3 335
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望弦聂。 院中可真熱鬧鸟辅,春花似錦氛什、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,674評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至洒缀,卻和暖如春瑰谜,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背树绩。 一陣腳步聲響...
    開封第一講書人閱讀 33,788評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工萨脑, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人饺饭。 一個(gè)月前我還...
    沈念sama閱讀 49,279評(píng)論 3 379
  • 正文 我出身青樓渤早,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親瘫俊。 傳聞我的和親對(duì)象是個(gè)殘疾皇子鹊杖,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,851評(píng)論 2 361