背景盡管在生產(chǎn)環(huán)境熱更新代碼,并不是很好的行為,很可能導(dǎo)致:熱更不規(guī)范,同事兩行淚。 但很多時(shí)候我們的確希望能熱更新代碼,比如: 線上排查問題,找到修復(fù)思路了,但應(yīng)用重啟之后,環(huán)境現(xiàn)場就變了,難以復(fù)現(xiàn)。怎么驗(yàn)證修復(fù)方案?
又比如: 本地開發(fā)時(shí),發(fā)現(xiàn)某個(gè)開源組件有bug,希望修改驗(yàn)證。如果是自己編譯開源組件再發(fā)布,流程非常的長,還不一定能編譯成功。有沒有辦法快速測試?
Arthas是阿里巴巴開源的Java應(yīng)用診斷利器,深受開發(fā)者喜愛。 下面介紹利用Arthas 3.1.0版本的?jad /mc /redefine ?一條龍來熱更新代碼。 Arthas: https://github.com/alibaba/arthas jad命令: https://alibaba./arthas/jad.html mc命令: https://alibaba./arthas/mc.html redefine命令: https://alibaba./arthas/redefine.html
Arthas在線教程下面通過Arthas在線教程演示熱更新代碼的過程。 
arthas-online-hotswap 在例子里,訪問?curl http://localhost/user/0 ,會返回500錯(cuò)誤: { ????"timestamp":?1550223186170, ????"status":?500, ????"error":?"Internal?Server?Error", ????"exception":?"java.lang.IllegalArgumentException", ????"message":?"id?<?1", ????"path":?"/user/0" }
下面通過熱更新代碼,修改這個(gè)邏輯。 jad反編譯代碼反編譯UserController ,保存到?/tmp/UserController.java 文件里。 jad?--source-only?com.example.demo.arthas.user.UserController?>?/tmp/UserController.java
修改反編繹出來的代碼用文本編輯器修改/tmp/UserController.java ,把拋出異常改為正常返回: ????@GetMapping(value={"/user/{id}"}) ????public?User?findUserById(@PathVariable?Integer?id)?{ ????????logger.info("id:?{}",?(Object)id); ????????if?(id?!=?null?&&?id?<?1)?{ ????????????return?new?User(id,?"name"? ?id); ????????????//?throw?new?IllegalArgumentException("id?<?1"); ????????} ????????return?new?User(id.intValue(),?"name"? ?id); ????}
sc查找加載UserController的ClassLoader$?sc?-d?*UserController?|?grep?classLoaderHash ?classLoaderHash???1be6f5c3
可以發(fā)現(xiàn)是spring boot的?LaunchedURLClassLoader@1be6f5c3 ?加載的。 mc內(nèi)存編繹代碼保存好/tmp/UserController.java 之后,使用mc(Memory Compiler)命令來編譯,并且通過-c 參數(shù)指定ClassLoader : $?mc?-c?1be6f5c3?/tmp/UserController.java?-d?/tmp Memory?compiler?output: /tmp/com/example/demo/arthas/user/UserController.class Affect(row-cnt:1)?cost?in?346?ms
redefine熱更新代碼再使用redefine命令重新加載新編譯好的UserController.class : $?redefine?/tmp/com/example/demo/arthas/user/UserController.class redefine?success,?size:?1
檢驗(yàn)熱更新結(jié)果再次訪問?curl http://localhost/user/0 ,會正常返回: { ????"id":?0, ????"name":?"name0" }
總結(jié)Arthas里?jad /mc /redefine ?一條龍來線上熱更新代碼,非常強(qiáng)大,但也很危險(xiǎn),需要做好權(quán)限管理。 比如,線上應(yīng)用啟動賬號是 admin,當(dāng)用戶可以切換到admin,那么 所以: 最后,Arthas提醒您:?診斷千萬條,規(guī)范第一條,熱更不規(guī)范,同事兩行淚。
來源:http://www./content-4-119451.html
|