<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          如何使用Arthas提高日常開發(fā)效率?

          共 4016字,需瀏覽 9分鐘

           ·

          2021-05-05 08:01

          1. Arthas有什么功能,怎么用,請(qǐng)看:Arthas使用手冊

          2. Arthas命令比較復(fù)雜,一個(gè)幫助生成命令的IDEA插件:arthas idea plugin 使用文檔

          3. 基于Arthas實(shí)現(xiàn)的簡單好用的熱部署插件:ArthasHotSwap


          一  引言


          首先我們應(yīng)該拋棄面向debug編程的思維,debug不一定是最高效的方法,遇到線上問題不能debug了怎么辦。本文介紹如何使用Arthas代替debug提高日常開發(fā)效率。


          開始之前,可以先瀏覽下上面推薦的這些文章,下面所使用到的東西在以上的文章都有詳細(xì)的講解。大家也可以先瀏覽下面的內(nèi)容,確定所描述的確實(shí)可以提高開發(fā)效率,再去看上面的文章也是可以的。


          首先我們要安裝兩個(gè)插件“arthas idea” 和 “ArthasHotSwap”,IDEA可以直接安裝使用。“arthas idea”是為了高效率生成Arthas命令,“ArthasHotSwap”可以實(shí)現(xiàn)簡單快捷的熱部署。接下來我們通過幾個(gè)場景來看如何使用Arthas提高日開發(fā)常效率。


          二  5分鐘解決一個(gè)問題


          1  問題表象


          問題的表象是預(yù)發(fā)接口返回參數(shù)為空,不知道為什么為空,關(guān)鍵地方又沒有打日志。怎么辦,debug?debug端口不好申請(qǐng),而且一直占用環(huán)境引起公憤。加日志重新部署?部署時(shí)間太長,而且不一定查看日志就能發(fā)現(xiàn)問題。接下去我將使用Arthas排查問題。



          2  如何發(fā)現(xiàn)問題


          第一步:定位相關(guān)方法


          首先定位到相關(guān)的代碼,代碼如下圖所示,方法執(zhí)行結(jié)果應(yīng)該要返回一個(gè)map,也就是上面問題的extraData,返回為空,肯定是這里有問題,但不知道那行代碼的問題。借助Arthas可以想到的是,我能觀測這個(gè)方法的出參和入?yún)ⅲf不定能發(fā)現(xiàn)問題。于是使用Arthas的watch命令觀測方法執(zhí)行情況。



          第二步:生成方法觀測命令


          安裝了“arthas idea”插件之后,在方法名上面單擊右鍵,選擇watch,如下圖所示。



          第三步:登錄應(yīng)用服務(wù)器


          一般應(yīng)用都部署在云上或其他遠(yuǎn)程服務(wù)器,我們需要登錄應(yīng)用部署的服務(wù)器。


          第四步:安裝Arthas


          Arthas 支持在 Linux/Unix/Mac 等平臺(tái)上一鍵安裝,請(qǐng)復(fù)制以下內(nèi)容,并粘貼到命令行中,敲 回車 執(zhí)行即可。


          curl -L https://arthas.aliyun.com/install.sh | sh


          第五步:運(yùn)行Arthas


          上述命令會(huì)下載啟動(dòng)腳本文件 as.sh 到當(dāng)前目錄,直接在shell下面執(zhí)行./as.sh,就會(huì)進(jìn)入交互界面。


          第六步:執(zhí)行觀測方法命令


          第二步執(zhí)行完后,觀測方法的命令已經(jīng)在粘貼板了,粘貼執(zhí)行就行,示例命令如下:


          watch com.**.**.endpoint.BargainPlayApplyCycleEndPoint fetchPlayDetailRenderData '{params,returnObj,throwExp}' -n 5 -x 3 'params[0].getPlayToolDO().getId()==588'


          命令解釋:'{params,returnObj,throwExp}' 表示觀測對(duì)象,這里選擇了入?yún)ⅰ⒊鰠⒑彤惓#?/span>-n 5 表示觀測到5次后停止,-x 3 表示打印觀測對(duì)象的時(shí)候只打印3層嵌套結(jié)構(gòu),'params[0].getPlayToolDO().getId()==588' 為條件表達(dá)式,滿足該條件的才會(huì)被觀測到。


          第七步:查看觀測結(jié)果


          前端重新觸發(fā)執(zhí)行后,得到觀測結(jié)果如下所示,從入?yún)⒖梢钥吹絧layActivityApplyRequest中的targetId為null,實(shí)際上應(yīng)該要取playActivityRecordDO中的targetId。從返回結(jié)果可以看到確實(shí)是因?yàn)樯唐稩D不存在原因。



          3  更進(jìn)一步解決問題


          截止目前已經(jīng)發(fā)現(xiàn)了問題所在,一般的同學(xué)都是修改代碼重新部署,等上10多分鐘。我們要做不一般的同學(xué),接下去就輪到ArthasHotSwap熱部署插件上場了。在IDEA的插件倉庫搜索并安裝ArthasHotSwap。


          ArthasHotSwap 熱部署


          修改代碼 -> maven編譯 -> 單擊右鍵選擇swap this class -> 熱部署命令已經(jīng)復(fù)制到粘貼板 -> 登錄遠(yuǎn)程服務(wù)器粘貼并執(zhí)行熱部署命令 -> 熱部署成功



          問題解決


          熱部署成功,問題解決,前端重新請(qǐng)求,前端展示正常。



          雖然整個(gè)鏈路看上去很長,但是都是一些很簡單的復(fù)制粘貼操作,這是我在聯(lián)調(diào)過程中處理的實(shí)際問題,整個(gè)過程差不多就是5分鐘左右,切身感受到Arthas的便利,忍不住分享一下。


          4  一些限制


          arthas redefine有一些限制導(dǎo)致熱部署也有同樣的限制。熱部署時(shí)候,不能修改方法名、屬性字段,只能修改方法體里面的代碼。


          redefine 命令和 jad/watch/trace/monitor/tt 等命令會(huì)沖突。執(zhí)行完 redefine 之后,如果再執(zhí)行上面提到的命令,則會(huì)把 redefine 的字節(jié)碼重置。也就是說,熱部署執(zhí)行完成之后,再執(zhí)行 jad/watch/trace/monitor/tt 等命令,會(huì)使熱部署失效,所以在適當(dāng)?shù)臅r(shí)候還是需要重新部署下。我們也可以采用其他方法規(guī)避,比如使用watch的時(shí)候,觀測其他類的方法,而不是熱部署的那個(gè)類。


          三  方法執(zhí)行的時(shí)間隧道


          上面的場景講到了使用watch命令觀測方法執(zhí)行參數(shù),但是watch是觀測方法執(zhí)行瞬間的情況。如果我們想重現(xiàn)上次的調(diào)用該怎么辦呢。


          在日常開發(fā)過程中,環(huán)境問題是非常影響開發(fā)效率的,特別是涉及其他團(tuán)隊(duì)的應(yīng)用的時(shí)候,有時(shí)候希望上游再次觸發(fā)一次調(diào)用都是很困難的一件事情。當(dāng)你用上面的方法解決了你的問題之后,你想調(diào)試一下,發(fā)現(xiàn)已經(jīng)夜深了,不好意思再讓上游應(yīng)用觸發(fā)一次調(diào)用,該怎么辦呢,自己根據(jù)watch觀測的方法入?yún)⒔M裝參數(shù)使用hsf控制臺(tái)調(diào)用?我們要做不一般的同學(xué),用工具解放生產(chǎn)力。


          1  獲取tt命令


          Arthas的tt命令可以獲取方法執(zhí)行數(shù)據(jù)的時(shí)空隧道,記錄下指定方法每次調(diào)用的入?yún)⒑头祷匦畔ⅲ⒛軐?duì)這些不同的時(shí)間下調(diào)用進(jìn)行觀測。


          安裝好arthas idea插件之后,在需要記錄執(zhí)行的方法上面單擊右鍵,選擇TimeTunnel Tt,出現(xiàn)下面的選擇框,第一個(gè)紅框是獲取記錄方法執(zhí)行的命令。第二個(gè)紅框是記錄方法執(zhí)行之后需要對(duì)記錄進(jìn)行的操作,包括查看記錄列表、查看記錄執(zhí)行情況、重現(xiàn)調(diào)用等。



          2  記錄方法執(zhí)行


          登錄遠(yuǎn)程服務(wù)器,運(yùn)行以下兩條運(yùn)行arthas,然后執(zhí)行從idea插件復(fù)制的tt -t命令來記錄方法執(zhí)行,如下圖所示。如果想停止記錄可以輸入q,查看記錄使用tt -l。


          curl -L https://arthas.aliyun.com/install.sh | sh./as.sh



          3  搜索方法執(zhí)行記錄


          tt -l可以查看所有的方法執(zhí)行記錄,但是我們要和我們相關(guān)的執(zhí)行記錄,那么可以使用tt -s命令進(jìn)行搜索。tt -s 命令后面需要攜帶過濾條件。條件表達(dá)式是使用OGNL編寫,下面介紹幾個(gè)通常的過濾表達(dá)式。首先介紹下幾個(gè)對(duì)象,params表示入?yún)ⅲ琾arams[0]表示第一個(gè)參數(shù),params[1]表示第二個(gè)參數(shù),returnObj表示返回對(duì)象。


          • 根據(jù)入?yún)⑦^濾:tt -s 'params[2].getRecordId() == 110213603'
          • 根據(jù)返回結(jié)果過濾:tt -s 'returnObj.isSuccess() == false'
          • 根據(jù)入?yún)⒑头祷亟Y(jié)果過濾:tt -s 'returnObj.isSuccess() == true && params[2].getRecordId() == 110213603'

          4  查看方法執(zhí)行情況

          tt -w 相當(dāng)于tt下面的watch命令,可以用來查看方法執(zhí)行情況。使用idea插件獲取tt -w 命令更方便。

          5  重新觸發(fā)

          如果需要重新觸發(fā)某條記錄也是可行的,因?yàn)閠t命令記錄當(dāng)時(shí)調(diào)用的情況,所以可以本地發(fā)起一次調(diào)用,tt -p -i 1000 命令的意思重新觸發(fā)idex=1000的那條記錄。不僅僅可以重新觸發(fā),還可以間隔時(shí)間內(nèi)多次觸發(fā),tt -p --replay-times 5 --replay-interval 2000 -i 1000 表示重新觸發(fā)5次,每次間隔2s。

          重新觸發(fā)的時(shí)候我們可能還想再watch下方法執(zhí)行情況,怎么辦呢,另外再打開一個(gè)頁面登錄遠(yuǎn)程服務(wù)器,運(yùn)行arthas,執(zhí)行 watch 命令。

          6  一些限制

          ThreadLocal 信息丟失

          很多框架偷偷的將一些環(huán)境變量信息塞到了發(fā)起調(diào)用線程的 ThreadLocal 中,由于調(diào)用線程發(fā)生了變化,這些 ThreadLocal 線程信息無法通過 Arthas 保存,所以這些信息將會(huì)丟失。一些常見的 CASE 比如:鷹眼的 TraceId 等。

          引用的對(duì)象

          需要強(qiáng)調(diào)的是,tt 命令是將當(dāng)前環(huán)境的對(duì)象引用保存起來,但僅僅也只能保存一個(gè)引用而已。如果方法內(nèi)部對(duì)入?yún)⑦M(jìn)行了變更,或者返回的對(duì)象經(jīng)過了后續(xù)的處理,那么在 tt 查看的時(shí)候?qū)o法看到當(dāng)時(shí)最準(zhǔn)確的值。這也是為什么 watch 命令存在的意義。


          有道無術(shù),術(shù)可成;有術(shù)無道,止于術(shù)

          歡迎大家關(guān)注Java之道公眾號(hào)


          好文章,我在看??

          瀏覽 35
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  特级大胆西西4444人体 | 青娱乐国产精品天堂视频 | 精品久久久久久久久久久久久久 | 国产色噜噜在线 | 菠萝内射视频在线 |