Su的技术博客

  • 首页
  • 原创
  • 视频
  • Java
  • MySQL
  • DDD
  • 事故复盘
  • 架构方案
  • AI
  • Other
  • 工具
    • AI工具集
    • 工具清单
    • JSON在线格式化
    • JSON在线比较
    • SQL在线格式化
  • 打赏
  • 关于
路很长,又很短
  1. 首页
  2. Java
  3. 正文
                           

【原创】Arthas实战-线上热更新代码只需3步

2020-02-26 1997点热度 0人点赞 0条评论
点击上方蓝色字关注我们~


当我们发现线上出现bug,如何进行不停机热更新代码?


1

问题背景


当我们发现线上出现bug,在排查时可能不是很好确认问题,并且最好保留现场,才能重现问题,或者需要快速修复bug,才能比较快速或者方便的临时解决紧急问题。这时,热更新就能很好的帮助我们了。虽然可以通过发版进行解决生产问题,但是项目频繁发版会存在一定的风险:


比如用户正在使用对应功能,会影响用户的使用体验。

紧急版本上线可能还需要领导的特别审核。

等到下一版本再修复,等待的时间可能太久了。


这时如果能热更新线上的部分代码,协助我们尽早的找到问题,并且快速解决bug,快速解决问题也能得到领导和同事的认可,所以需要掌握一定的救火技能是极其必须的。


这里就分享下我的使用经验:最近在排查一个生产线程安全问题,在获取主机连接时,出现不能确定是否获取准确的对应连接,即当前连接的机器是否正确的。

大致流程如下:



这里你可以不理解我的场景需求,只需要看我是怎么使用热更新解决问题即可。



2

排查解决:热更新


我这边需要增加日志打印来确定获取的连接是否正确。那么怎样将线上代码进行热更新呢?
这里还是使用阿里提供的强大工具Arthas帮我们解决问题。


1)第一步,修改代码

在代码中增加相应的日志代码,并且将相应的Java代码文件编译成class字节码文件HostFactoryImpl.class。将字节码文件上传到生产服务器。


2)第二步,获取类加载哈希值
启用Arthas,只需要使用java -jar  arthas-boot.jar即可,并且使用sc命令查找对应的字节码文件(因为我们要替换它),并且要找到它的类加载哈希码,因为是类加载器加载类,所以我们需要使用同一个类加载器才行。

以上就是目标类的相关信息。


筛选出我们关注的类加载器哈希值。这里为什么有两个?一个是接口,一个是实现类。找到对应的类加载哈希:38af3868。


3)第三步,替换字节码文件
将刚才上传到服务器的字节码文件加载到JVM中。使用redefine命令进行替换:

返回success,说明替换成功!


马上去观察日志打印,确实生效了。

但是这是针对新的请求执行才会生效,正在执行的代码还是跟之前一样。


注意:Arthas热更新目前不支持在类增加/删除属性field或方法method操作。

假如你增加了属性或者方法则会出现下面的提示:



3

总结


1)使用Arthas命令:sc和redefine。
2)正在执行的代码不会生效,新的请求执行才会生效。
3)不支持增加或删除属性field和方法method。



往期Arthas生产实战:
Arthas排查生产问题:实例方法接口调用
Arthas 实战生产问题:真的别再使用TimerTask了!


Arthas官方文档sc命令:https://alibaba.github.io/arthas/sc.html

参考:

https://www.jianshu.com/p/efa46ccdd7f0





推荐阅读

  • 互联网Code Review最佳实践分享

  • dubbo面试题!会这些,说明你看懂了dubbo源码

  • Kafka面试题!掌握它才说明你真正懂Kafka

  • Netty 5.0为啥被舍弃?原因竟然是...

  • 中台之上——业务架构系列【汇总】

  • 必备瑞士军刀IDEA插件,你使用了哪些

  • 加入:互联网基础/架构交流群


-关注搬运工来架构,与优秀的你一同进步-


本文仅供学习!所有权归属原作者。侵删!文章来源: 搬运工来架构

更多文章:

  1. 应用分层架构最佳实践:Alibaba COLA 4.0
  2. RocketMQ 很慢?引出了一个未解之谜
  3. 超实用的IDEA插件推荐!百万级下载量
  4. 重磅!AI 驱动的 Java 开发框架:Spring AI Alibaba
  5. ParNew+CMS 实践案例 : HiveMetastore FullGC诊断优化
  6. tomcat应用服务启不来,没有报错日志?不可能!
  7. Chrome插件(扩展)开发全攻略2.6w字,看这篇就够了!
  8. 笔记08 | 搜狗面试题:IO多路复用之select、poll、epoll的区别
  9. 【视频】NettyInAction作者:统治一切的框架Netty- One Framework to rule them all
  10. 用了@Autowired注入,竟然被警告
标签: 原创 热更新 arthas 线上 实战
最后更新:2023-02-19

Cocodroid

专注Java后端,分享技术。

打赏 点赞
< 上一篇
下一篇 >

文章评论

razz evil exclaim smile redface biggrin eek confused idea lol mad twisted rolleyes wink cool arrow neutral cry mrgreen drooling persevering
取消回复

广告
文章目录
  • 互联网Code Review最佳实践分享
  • dubbo面试题!会这些,说明你看懂了dubbo源码
  • 中台之上——业务架构系列【汇总】
  • 加入:互联网基础/架构交流群
最新 热点 推荐
最新 热点 推荐
干货 | 论Elasticsearch数据建模的重要性 马蜂窝消息总线——面向业务的消息服务设计 基于 MySQL Binlog 实现可配置的异构数据同步 视频笔记:Google发布Agent2Agent协议 视频笔记:什么是微服务,为什么是微服务? 视频笔记:什么是AI 智能体? 视频笔记:什么是Flink? 如何秒级实现接口间“幂等”补偿:一款轻量级仿幂等数据校正处理辅助工具
Elasticsearch 使用误区之六——富文本内容写入前不清洗基于 MySQL Binlog 实现可配置的异构数据同步马蜂窝消息总线——面向业务的消息服务设计干货 | 论Elasticsearch数据建模的重要性你可以不用RxJava,但必须得领悟它的思想!如何秒级实现接口间“幂等”补偿:一款轻量级仿幂等数据校正处理辅助工具视频笔记:什么是Flink?视频笔记:什么是AI 智能体?
实战:一次疑似内存泄漏的问题排查 3.编程语言的演化(译) 使用DeepSeek R1的19条经验 Spring 七种事务传播性介绍 这些MQ概念你都懂吗:死信队列、重试队列、消息回溯等 系统设计 | 业务编号生成 系统设计 | UUID 和 自增 ID 怎么选? 接口优化的常见方案实战总结

CRUD (1) Event Sourcing (1) graphql (1) id (1) NoSQL (1) quarkus (1) rest (1) RocketMQ (2) Spring Boot (1) zk (1) zookeeper (1) 上下文 (1) 事务消息 (1) 二级缓存 (1) 值对象 (1) 关系数据库 (1) 分布式缓存 (1) 原子性 (1) 唯一ID (1) 商品 (1) 多对多 (1) 子域 (1) 字符集 (1) 客户端心跳 (1) 幂等 (2) 干货 (1) 并发 (1) 应用场景 (1) 应用架构图 (1) 康威定律 (2) 异步复制 (1) 微服务架构 (2) 总体方案 (1) 技术方案 (2) 技术架构 (2) 技术架构图 (1) 技能 (1) 持续集成 (1) 支撑域 (1) 故障恢复 (1) 数据架构图 (1) 方案选型 (1) 日记 (1) 服务发现 (1) 服务治理 (1) 服务注册 (2) 机房 (1) 核心域 (1) 泄漏 (1) 洋葱架构 (1) 消息队列 (5) 源码剖析 (1) 灰度发布 (1) 熔断 (1) 生态 (1) 画图工具 (1) 研发团队 (1) 线程 (2) 组织架构 (1) 缓存架构 (1) 编码 (1) 视频 (18) 读写分离 (1) 贵州 (1) 软件设计 (1) 迁移 (1) 通用域 (1) 集群化 (1) 雪花算法 (1) 顺序消息 (1)

推荐链接🔗
  • AI工具集
  • 工具箱🛠️

COPYRIGHT © 2014-2025 verysu.com . ALL RIGHTS RESERVED.

Theme Kratos Made By Seaton Jiang

粤ICP备15033072号-2

x