如何在线上为所欲为

Arthas实现代码热更新 一、背景 有时我们在项目中正在运行的线上代码出了问题,由于是线上项目无法重启或更新代码,此时只能选择热更新的方式进行,但是热更新有风险,操作需谨慎。 这里:默认大家已经会使用arthas或者arthas已经安装完成,如果没有安装请点击:Arthas-java在线调试工具的使用 二、步骤 测试代码: package com.tiandy.testdemo; @SpringBootApplication public class TestDemoApplication { public static 阅读详情

概述

如果你看到这个标题想到的是 Arthas ,那么恭喜你,你想的跟我一样~

如果你看到这个标题一点想法的没有,那你可能真的需要系统性学习一下 arthas 了。arthas 是一款线上监控诊断工具,可以在不修改应用的情况下,对业务问题进行诊断。现在不用上几手 arthas ,都不好意思出门跟人调 bug了。

如果你想到的是 bpf,bcc 之类的,那你是真个大佬,大哥带带弟弟.jpg

准备工作

首先写一段简单的 java 代码,用来测试

import java.util.Arrays;
import java.util.Random;
import java.util.concurrent.TimeUnit;

/**
 * 求和测试类
 *
 * @author xisha
 * @date 2022/5/9 7:33 下午
 */
public class SumDemo {

    public static void main(String[] args) throws Exception {
        SumDemo demo = new SumDemo();
        while (true) {
            demo.test();
            TimeUnit.SECONDS.sleep(3);
        }
    }

    public void test() {
        Random random = new Random(System.currentTimeMillis());
        int numberSize = random.nextInt(5);

        int[] numbers = new int[numberSize];
        for (int i = 0; i < numberSize; i++) {
            numbers[i] = random.nextInt(10);
        }
        System.out.println(sum(numbers));
    }

    public Integer sum(int... numbers) {
        return Arrays.stream(numbers).sum();
    }

}

代码很简单,就是一直生成几个随机数,然后求和,跑起来的效果大概如下

然后下载 arthas curl -O arthas.aliyun.com/arthas-boot…

更多下载方式见 arthas.aliyun.com/doc/install…

然后 java -jar arthas-boot.jar 选择我们的 SumDemo 进行 attach

成功之后的界面大概如下图

常用功能

  1. 查看 sum 方法每次传入的参数都是啥。
  2. 修改sum方法的返回,使其返回一个固定的值。
  3. 查看 SumDemo 类的代码。

如果大佬对上面三个功能了如指掌,那么直接跳到下一章节即可。

watch 参数

watch SumDemo sum '{params,returnObj,throwExp}' -n 5 -x 3

反编译

有时候我们想看看线上的代码是不是我们想要的,我们可以通过 jad 命令进行在线反编译。 jad SumDemo

效果大概如下图所示,我们可以可以方便的看到这个类的代码,类加载器,类文件的路径(这个在确定线上包的版本的时候十分有用)

更多 jad 的用法可以查看 arthas.aliyun.com/doc/jad.htm…

热更新一条龙

现在让我们尝试修改 sum 函数的返回值,使其返回一个固定的值 public Integer sum(int... numbers) { return 49; //return Arrays.stream(numbers).sum(); } 改完之后通过 arthas 编译一个 class

首先我们需要找到 SumDemo 的类加载器的hash值 输入 sc -d *SumDemo , 对应的 classLoaderHash 就是我们需要的hash值,如图所示,我这边的 hash 值是 277050dc

然后用这个类加载编译一下刚才改好的 java 文件 mc -c 277050dc ./SumDemo.java

如上图所示,编译就算是成功了,如果不成功的话,可能是有些特殊情况,比如用了lombok,泛型对不上等等,要是失败了…… 那就算了,你跟这个命令莫得缘分。

然后我们使用 redefine 命令,

redefine classpath ,就可以热更新这个类了。

可以看到,热更新之后,我们的代码就只返回 49了。

注意,这里为什么先讲 jad 再讲 热更新呢? 因为 jad 命令跟 redefine 命令是冲突的,jad 会还原 redefine 产生的字节码,详见文档arthas.aliyun.com/doc/redefin…

为所欲为

上面讲了这么多,都是一些问题调试的功能,怎么就为所欲为了呢?

使用spring context 为所欲为

在 spring 的项目中,如果你有【保存 spring 上下文,以便自己下次使用】的习惯(如下代码),

import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;

@Component
public class SpringBeanUtil implements ApplicationContextAware {

    private static ApplicationContext applicationContext;

    @Override
    public void setApplicationContext(ApplicationContext applicationContext)
            throws BeansException {
        SpringBeanUtil.applicationContext = applicationContext;
    }

    public static <T> T getBean(Class<T> clazz) {
        return (T) applicationContext.getBean(clazz);
    }

    public static Object getBean(String name) throws BeansException {
        return applicationContext.getBean(name);
    }
}

那么你可以用 arthas 获取这个上下文,然后再获取相应的bean,然后就可以为所欲为了。对应的 arthas 代码如下

ognl '#context=@SpringBeanUtil@applicationContext, #context.getBean("yourbeanName").doSomething()'

注意:加载对应的类可能需要对应的类加载器Hash,可以使用 sc -d *SpringBeanUtil 命令来获取类加载器 Hash,然后再使用 ognl 的时候加上 -c 选项即可。

使用 tt 为所欲为

如果没有【保存 spring 上下文】也不打紧,一般的 spring项目 都会有 http 接口(甚至健康检查的接口就是 http 接口),这个时候我们可以使用 tt 命令为所欲为。原理是找一个调用链路里有 spring 上下文的类,然后基于这个类记录这个请求,然后通过重放这个请求,达到执行任意 bean 代码的目的。比如 RequestMappingHandlerAdapter#invokeHandlerMethod 这个就很合适。具体过程如下:

我们先使用 tt 命令记录这个请求

tt -t org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter invokeHandlerMethod

然后等一个请求

大概像这样,然后再用 tt 命令,-i 可以指定重放的请求,-w 可以执行ognl,然后为所欲为的代码大概如下

tt -i 1000 -w 'target.getApplicationContext().getBean('yourbeanName').doSomething()'

基于 dubbo 为所欲为

有人说我莫得 http 接口,全是 dubbo 的调用,那这个咋整?不慌的,dubbo 某个拓展里自动为我们保存了 spring 上下文,直接为所欲为即可。代码如下:

ognl '#context=@com.alibaba.dubbo.config.spring.extension.SpringExtensionFactory@contexts.iterator.next, #context.getBean("yourBeanName").doSomeThing()'

vmtool 获取实例为所欲为

如果我的应用啥也没有,没有dubbo,甚至都不是 spring 的,那我要如何为所欲为呢? 这个时候我们可以使用 vmtool,直接获取对象进行为所欲为。当我看到这个工具的时候真是直呼好家伙!太强了简直! 以我们的SumDemo 为例,我们可以直接获取这个类进行函数调用,示例代码如下 vmtool --action getInstances --className SumDemo --express 'instances[0].test()'

GIF 斗图警告!GitHub 标星 5.2k+,Sorry 会编程就是可以"为所欲为" 大家好,我是 Rocky0429,一个最近老在聊天斗图的蒟蒻… 作为一个瞎扯淡重度患者,表情包是我保持长久战斗力的必备武器。没有表情包的聊天,是没有灵魂的。 人力有穷时,表情亦有尽,再多的图也有用腻的时候。作为一个能用图坚决不打字的资深患者,当没有表情包能表达出我澎湃的内心戏的时候,我觉得这样的对话是没有乐趣的。 我无数次的在想,如果我能自己制作表情包就好了,虽说市面上的很多爱屁屁(... 阅读详情

相关推荐

嘉立创EDA实战:从点亮第一盏灯到完成首块PCB

本文详细介绍了使用嘉立创EDA从点亮第一盏LED灯到完成首块PCB的全过程。通过实战案例分享,包括原理图绘制、PCB设计、DRC检查、覆铜操作等关键步骤,帮助电子设计爱好者快速掌握嘉立创EDA的使用技巧,并避免常见的设计错误。

weixin_30314793的博客 376

Arthas实现热更新代码

Arthas 是一款线上监控诊断产品,通过全局视角实时查看应用 load、内存、gc、线程的状态信息,并能在不修改应用代码的情况下,对业务问题进行诊断,包括查看方法调用的出入参、异常,监测方法执行耗时,类加载信息等,大大提升线上问题排查效率。

雪落夜的专栏 2213

人工智能机器学习从入门到高级学习资料(含资料下载地址)

机器学习是一个技术含量较高的领域,高效学习需要多种途径相结合.以下是一些推荐的学习资源。首先介绍几个比较有用的社区,包含了丰富的学习资料

2401_86900375的博客 1648

arthas代码热更新 | java 生产环境代码热更新 | 纯干货

很多时候java代码不能在线调试或者关键地方没有打log导致无法查bug,遇到这种情况可以借助arthas工具来实现java代码热更新且不用重启服务。具体热更新步骤如下。

weixin_38989540的博客 2427

QGIS实战:5分钟搞定谷歌地图、高德、天地图等多源地图加载(附最新图源URL)

本文详细介绍了如何在QGIS中快速加载谷歌地图、高德、天地图等多源地图,提供2023年验证可用的最新图源URL和配置步骤。从环境准备到高级技巧,涵盖国内外主流地图服务的完整解决方案,帮助用户提升GIS工作效率。

weixin_29210759的博客 1224

比NTP还牛逼的时间同步协议:1588v2,亚微秒级!

1588v2,又称为Precision Time Protocol Version 2,即精密时间协议的第二版本,或称为PTPv2,是一种精密时间同步协议标准,旨在实现网络中设备之间的高精度时间同步。该协议由IEEE标准组织发布,并在网络测量和控制系统中得到广泛应用。1588v2的主要目的是在计算机网络中提供高度准确的时间同步。它可用于确保不同设备之间的时钟同步,从而协调它们的操作。这对于需要协同工作的系统、无线通信基站等具有关键性的应用非常重要。

网络技术联盟站 4282

athas热更新代码

热更新 热更新有什么用?比如,生产环境有一个逻辑不小心写错了,导致资产损失。 如果修改代码,重新发布到生产环境,需要的时间比较长,而且生产环境重启,也可能会影响到其他的用户。 热更新,可以不用重启环境,修改代码对应的字节码,达到修改功能的目的。 一、jad反编译 星号*表示匹配任意路径,也可以直接写具体的路径。 # --source-only,表示只打印源代码 jad --source-onl...

Cyms,BgXmSfXtsj !!!! Battle Each Moment !!!! 580

DataCastle-租金预测

ID:编号;时间:房屋信息采集的时间;小区名:房屋所在小区,已脱敏处理;小区房屋出租数量:小区出租房屋数量,已脱敏处理;楼层:0、1、2分别表示楼层低,中,高;总层数:房屋所在建筑的总楼层数,已脱敏处理;房屋面积:房屋面积数值,已脱敏处理;房屋朝向:房屋的朝向;居住状态:房屋的居住状态,表示是否已出租或居住中,已脱敏处理;卧室数量:户型信息,数字表示卧室的个数;卫的数量:户型信息,数字表示卫生间的个数;厅的数量:户型信息,数字表示厅的个数;

优快云 精品推荐 3458

Arthas 入门到实战(二)在线热更新

Arthas 使用 jad/mc 命令在线热更新

m0_47743175的博客 2011

使用MATLAB的COMSOL LiveLink:实时连接和数据传输

COMSOL LiveLink是一种功能强大的MATLAB工具包,它允许用户在MATLAB环境中与COMSOL Multiphysics软件进行实时连接和数据传输。COMSOL LiveLink是一种功能强大的MATLAB工具包,它允许用户在MATLAB环境中与COMSOL Multiphysics软件进行实时连接和数据传输。使用COMSOL LiveLink,你可以进行更复杂的模型设置和数据传输使用MATLAB的COMSOL LiveLink:实时连接和数据传输。

PixelNinja的博客 2096

双端之Nginx+Php结合PostgreSQL搭建Wordpress

制作的 PG4WP 分支版本,它与所有版本的 WordPress 兼容,解决了原版的一些问题。参数,确保 PostgreSQL 正在监听默认端口(通常是 5432),或者你自定义的端口。:PG4WP 插件存在缺陷和不完整的功能,可能与最新版本的 WordPress 不兼容。的插件,它允许 WordPress 使用 PostgreSQL 数据库。,如果看到 Nginx 的默认欢迎页面,说明 Nginx 已正确安装。,如果看到 Nginx 的默认欢迎页面,说明 Nginx 已正确安装。

宇宙第一小趴菜的博客 1894

php真的可以为所欲为,GitHub - WAITUNG96/php-sorry-gif: [PHP版]在线制作 sorry 为所欲为等其他7种的gif,可能有 N 多 bug,欢迎 Issues...

[PHP版]在线制作 sorry 为所欲为 等其他 GIF 图片GIF 生成核心:ffmpeg如果你愿意分享出你做的模板,欢迎通过以下方式提交,欢迎 issues、Pull requests 或发送素材到邮箱 wenzhouchan#gmail.com (#换成@)模板如何制作?请往下看更新日志2018-04-10解决程序放在二级目录下运行,无法下载&预览问题添加 曾小贤答题模板2018-...

weixin_39675178的博客 170

VSCode 配置 Claude Code 插件的 4 步安装法与 3 类常见报错解决方案

介绍 VSCode 中 Claude Code 插件的 4 步可靠安装流程与 3 类高频报错(上下文丢失、认证失败、加载卡死)的根因分析和精准修复方案,聚焦文件上下文捕获机制、请求头注入要求及缓存失效逻辑,提供可验证的命令行操作与日志定位方法。

weixin_28728443的博客 499

php在线编辑gif图片,GitHub - PrintNow/php-sorry-gif: [PHP版]在线制作 sorry 为所欲为等其他7种的gif,可能有 N 多 bug,欢迎 Issues...

[PHP版]在线制作 sorry 为所欲为 等其他 GIF 图片GIF 生成核心:ffmpeg如果你愿意分享出你做的模板,欢迎通过以下方式提交,欢迎 issues、Pull requests 或发送素材到邮箱 wenzhouchan#gmail.com (#换成@)模板如何制作?请往下看更新日志2018-04-10添加 切割拉瓦-删库跑路 模板2018-04-10解决程序放在二级目录下运行,无法下...

weixin_39706441的博客 201

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

Jason表情包在线生成,王境泽表情包,为所欲为表情包,窃格瓦拉表情包,在线生成

Jason表情包在线生成,王境泽表情包,为所欲为表情包,窃格瓦拉表情包,在线生成,熊猫头表情包在线生成,蘑菇头表情包在线生成,表情包生成源码,Jason表情包生成入口,表情包,生成表情包,

qq_38811490的博客 4740

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

终极GIF制作神器:一键生成‘为所欲为‘表情包完整指南

想要制作火爆全网的"为所欲为"GIF表情包吗?**sorry.xuty.tk**就是你的终极GIF制作神器!这个开源工具专门用于在线制作"sorry 为所欲为"的GIF表情包,让你轻松生成各种经典网络梗图。无需任何专业视频编辑技能,只需输入文字,就能快速制作出个性化的动态表情包。 ## 🎯 为什么选择这个GIF制作工具? **简单易用**是这款工具最大的特点。无论你是社交媒体达人、内容创作者

gitblog_00110的博客 1066

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

基于node写了个工具,可以在线制作“sorry,为所欲为”的 GIF(开源)

SnailDev.GifMaker 一个生成gif并添加自定义字幕的工具 client 微信小程序 server nodejs + express 欢迎 star&fork 如果您有好的commit 也可以pull request 体验Demosorry.web Introduction 本工具并不使用aegisub为模板视频创建字幕,采用的是FFmpeg 中的filter...

weixin_30871701的博客 397

5个沙雕开源项目,最后一个只有顶级程序员才能参与!

前言GitHub 是一个面向开源及私有软件项目的托管平台,因为只支持 Git 作为唯一的版本库格式进行托管,故名 GitHub。Github拥有超过900万开发者用户。随着越来越多的应用...

weixin_46837985的博客 517

如何快速上手sorry.xuty.tk:10分钟学会制作专属表情包的终极指南

GitHub 加速计划(so/sorry)是一个功能强大的在线工具,让你轻松制作专属的“sorry 为所欲为”风格 GIF 表情包。无论你是表情包爱好者还是需要快速创建有趣内容的用户,这个工具都能满足你的需求,只需简单几步就能生成令人捧腹的动态表情。 ## 为什么选择 sorry.xuty.tk 制作表情包? 在社交媒体和聊天中,表情包是表达情感的重要方式。sorry.xuty.tk 提供了一

gitblog_00519的博客 606

如何快速创建“sorry为所欲为“GIF生成器:完整部署指南与模板制作教程

"sorry为所欲为"GIF生成器是一款基于Ruby和FFmpeg的在线动态图制作工具,能够快速将用户输入的文本转换为带有经典网络迷因风格的搞笑GIF动画。这个开源项目通过模板化设计,让任何人都能轻松创建个性化的"sorry为所欲为"表情包,无需任何视频编辑经验。 ## 🎯 核心功能与特色 "sorry为所欲为"GIF生成器支持多种经典网络迷因模板,包括金坷垃、土拨鼠、窃格瓦拉等热门素材。用

gitblog_00773的博客 968

为所欲为表情包制作器

我们如果每一天都在使用电脑,电脑壁纸肯定也要时常更新,这样才会有新鲜感,但是为所欲为表情包制作器有哪些比较好用的呢?今天主要就是来给大家分享实用的制作方法。 使用工具: 电脑 操作方法: 1、首先要先找好素材,自己想要什么样的动态壁纸,就找到相关的图片或者视频播放源,通过制作工具来录制视频,也可以直接添加图片制作动态图; 2、然后如果找的素材是图片的话,可以选择后者直接添加,如果找的是视频,选...

weixin_44148552的博客 2569

如何快速制作sorry为所欲为表情包:完整GIF生成工具解析

想要轻松制作"sorry 为所欲为"表情包GIF吗?这个开源项目提供了一个完整的在线解决方案,让你能够快速创建各种幽默反讽的GIF动图。作为一款功能强大的表情包生成工具,它支持多种模板,操作简单便捷。 ## 🎯 项目核心功能概览 **sorry为所欲为GIF制作工具**是一个基于Ruby和FFmpeg的Web应用,主要功能包括: - **多模板支持**:内置sorry、王境泽、金坷垃、土拨

gitblog_00615的博客 1088

11 个Chrome技巧让你为所欲为

对于每个前端从业者来说,除了 F5 键之外,用的最多的另外一个键就是 F12 了。这里介绍 11 个 chrome 开发者工具的骚技巧。助你快速定位问题,天天六点下班。1.曾经,在线调伪...

祈澈菇凉 393

终极指南:如何快速将Sorry为所欲为GIF制作工具迁移至微信生态

GitHub加速计划中的Sorry项目是一款强大的在线GIF制作工具,专门用于创建"sorry为所欲为"系列表情包。本指南将详细介绍如何将这个有趣的工具从网站形态快速迁移到微信生态,让更多用户能在小程序中轻松制作个性化GIF。 ## 为什么选择迁移到微信生态? 微信作为国内最大的社交平台,拥有超过10亿月活跃用户,将Sorry工具迁移到微信小程序可以带来以下优势: - **巨大的用户基础**

gitblog_01152的博客 475

这些Chrome骚技巧让你为所欲为

点击上方“程序员黑叔”,选择“置顶或者星标”你的关注意义重大!对于每个前端从业者来说,除了 F5 键之外,用的最多的另外一个键就是 F12 了。这里介绍 11 个 chrome 开发者工...

weixin_46837985的博客 220
上一篇: 一线名企面经总结,阿里+腾讯+百度,18个技术栈全面解析
下一篇: 你好,SLF4J
Java技术那些事儿
博客等级 码龄5年 2306粉丝 2584原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值