内容简介:尽管在生产环境热更新代码,并不是很好的行为,很可能导致:热更不规范,同事两行泪。但很多时候我们的确希望能热更新代码,比如:线上排查问题,找到修复思路了,但应用重启之后,环境现场就变了,难以复现。怎么验证修复方案?
尽管在生产环境热更新代码,并不是很好的行为,很可能导致:热更不规范,同事两行泪。
但很多时候我们的确希望能热更新代码,比如:
线上排查问题,找到修复思路了,但应用重启之后,环境现场就变了,难以复现。怎么验证修复方案?
又比如:
本地开发时,发现某个开源组件有bug,希望修改验证。如果是自己编译开源组件再发布,流程非常的长,还不一定能编译成功。有没有办法快速测试?
Arthas是阿里巴巴开源的 Java 应用诊断利器,深受开发者喜爱。
下面介绍利用Arthas 3.1.0版本的 jad / mc / redefine 一条龙来热更新代码。
- Arthas: https://github.com/alibaba/arthas
- jad命令: https://alibaba.github.io/arthas/jad.html
- mc命令: https://alibaba.github.io/arthas/mc.html
- redefine命令: https://alibaba.github.io/arthas/redefine.html
Arthas在线教程
下面通过Arthas在线教程演示热更新代码的过程。
在例子里,访问 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
可以发现是spring boot的 LaunchedURLClassLoader@1be6f5c3 加载的。
mc内存编绎代码
保存好 /tmp/UserController.java 之后,使用mc(Memory Compiler)命令来编译,并且通过 -c 参数指定 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
检验热更新结果
再次访问 curl http://localhost/user/0 ,会正常返回:
{
"id": 0,
"name": "name0"
}
总结
Arthas里 jad / mc / redefine 一条龙来线上热更新代码,非常强大,但也很危险,需要做好权限管理。
比如,线上应用启动帐号是 admin,当用户可以切换到admin,那么
- 用户可以修改,获取到应用的任意内存值(不管是否java应用)
- 用户可以attach jvm
- attach jvm之后,利用jvm本身的api可以redefine class
所以:
- 应用的安全主要靠用户权限本身的管理
- Arthas主要是让jvm redefine更容易了。用户也可以利用其它 工具 达到同样的效果
最后,Arthas提醒您: 诊断千万条,规范第一条,热更不规范,同事两行泪 。
Arthas实践系列
以上所述就是小编给大家介绍的《Arthas实践--jad/mc/redefine线上热更新一条龙》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:- Python一条龙:创建、读取、更新、搜索Excel文件
- 揭密黑产“暴力勒索、毁尸灭迹”运作一条龙
- 来~打包实现小程序动态分享图一条龙服务( ¨̮ )
- go语言贪PC蛋蛋搭建一条龙食蛇与C语言的区别
- 陈天奇创业公司首个SaaS产品:快速构建部署ML应用,跨平台优化、基准和封装一条龙
- vue项目实践004~~~一篮子的实践技巧
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
蚁群算法原理及其应用
段海滨 / 科学出版社 / 2005年2月1日 / 48.0
《蚁群算法原理及其应用(精装)》系统、深入地介绍了蚁群算法的原理及其应用,力图概括国内外在这一学术领域的最新研究进展。全书共包括10章,主要内容包括蚁群算法的思想起源、研究现状及机制原理;蚁群算法的复杂度分析;蚁群算法的收敛性证明;蚁群算法参数对其性能的影响;蚁群算法的参数选择原则;离散域和连续域蚁群算法的若干改进策略;蚁群算法在多个优化领域的典型应用;蚁群算法的硬件实现技术;蚁群算法与其他仿生优......一起来看看 《蚁群算法原理及其应用》 这本书的介绍吧!
JSON 在线解析
在线 JSON 格式化工具
html转js在线工具
html转js在线工具