乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

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

       印度阿三17 2019-02-21

      背景

      盡管在生產(chǎn)環(huán)境熱更新代碼,并不是很好的行為,很可能導(dǎo)致:熱更不規(guī)范,同事兩行淚。

      但很多時候我們的確希望能熱更新代碼,比如:

      線上排查問題,找到修復(fù)思路了,但應(yīng)用重啟之后,環(huán)境現(xiàn)場就變了,難以復(fù)現(xiàn)。怎么驗證修復(fù)方案?

      又比如:

      本地開發(fā)時,發(fā)現(xiàn)某個開源組件有bug,希望修改驗證。如果是自己編譯開源組件再發(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進階教程

      arthas-online-hotswap

      在例子里,訪問?curl http://localhost/user/0,會返回500錯誤:

      {
      ????"timestamp":?1550223186170,
      ????"status":?500,
      ????"error":?"Internal?Server?Error",
      ????"exception":?"java.lang.IllegalArgumentException",
      ????"message":?"id?<?1",
      ????"path":?"/user/0"
      }

      下面通過熱更新代碼,修改這個邏輯。

      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

      檢驗熱更新結(jié)果

      再次訪問?curl http://localhost/user/0,會正常返回:

      {
      ????"id":?0,
      ????"name":?"name0"
      }

      總結(jié)

      Arthas里?jad/mc/redefine?一條龍來線上熱更新代碼,非常強大,但也很危險,需要做好權(quán)限管理。

      比如,線上應(yīng)用啟動賬號是 admin,當用戶可以切換到admin,那么

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

      • 用戶可以attach jvm

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

      所以:

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

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

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


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

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

        0條評論

        發(fā)表

        請遵守用戶 評論公約

        類似文章 更多