日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

阿里巴巴Arthas實(shí)踐--jad/mc/redefine線上熱更新一條龍

 印度阿三17 2019-02-21

背景

盡管在生產(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進(jìn)階教程

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,那么

  • 用戶可以修改,獲取到應(yīng)用的任意內(nèi)存值(不管是否java應(yīng)用)

  • 用戶可以attach jvm

  • attach jvm之后,利用jvm本身的api可以redefine class

所以:

  • 應(yīng)用的安全主要靠用戶權(quán)限本身的管理

  • Arthas主要是讓jvm redefine更容易了。用戶也可以利用其它工具達(dá)到同樣的效果

最后,Arthas提醒您:?診斷千萬條,規(guī)范第一條,熱更不規(guī)范,同事兩行淚。


來源:http://www./content-4-119451.html

    本站是提供個(gè)人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多