阿里开源-JVM-SandBox


阿里开源-JVM-SandBox

  • 阿里开源-JVM-SandBox
    • @[TOC](阿里开源-JVM-SandBox)
  • 一、JVM-SandBox能解决什么问题?
  • 二、使用步骤
    • 1.开源代码
    • 2.使用示例
  • 三、总结

一、JVM-SandBox能解决什么问题?

线上故障定位
线上系统流控
线上故障模拟
方法请求录制和结果回放
动态日志打印
安全信息监测和脱敏
JVM-SANDBOX还能帮助你做很多很多,取决于你的脑洞有多大了。

二、使用步骤

1.开源代码

开源代码库: https://github.com/alibaba/jvm-sandbox

2.使用示例

修复破损的时钟(gitlab 示例):

【准备阶段】
我们定义了一个钟,期望可以实现每隔一定的时间进行报时(gitlab 代码)。

package com.taobao.demo;/*** 报时的钟*/
public class Clock {// 日期格式化private final java.text.SimpleDateFormat clockDateFormat= new java.text.SimpleDateFormat("yyyy-MM-dd HH:mm:ss");/*** 状态检查*/final void checkState() {throw new IllegalStateException("STATE ERROR!");}/*** 获取当前时间** @return 当前时间*/final java.util.Date now() {return new java.util.Date();}/*** 报告时间** @return 报告时间*/final String report() {checkState();return clockDateFormat.format(now());}/*** 循环播报时间*/final void loopReport() throws InterruptedException {while (true) {try {System.out.println(report());} catch (Throwable cause) {cause.printStackTrace();}Thread.sleep(1000);}}public static void main(String... args) throws InterruptedException {new Clock().loopReport();}}

运行代码
很明显,这个钟的实现有问题,运行起来没有正确的报时,但却一直在报异常!
问题分析
问题出在了checkState()方法上,这个方法中抛出了异常。接下来我们通过构建一个沙箱模块作为例子,修复这个损坏的钟!

解决方案
如果能直接修改checkState()方法的执行逻辑,让其不再抛异常,而是直接返回,那么一切就迎刃而解。但如何在不修改目标代码、不重启目标应用的情况下实现这个功能呢?
【修复阶段】
创建一个Java工程
1、pom 文件 引入sandbox 依赖

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.5.4</version><relativePath/> <!-- lookup parent from repository --></parent><groupId>com.example</groupId><artifactId>box-mock</artifactId><version>0.0.1-SNAPSHOT</version><name>box-mock</name><description>Demo project for Spring Boot</description><properties><java.version>1.8</java.version></properties><dependencies><dependency><groupId>com.alibaba.jvm.sandbox</groupId><artifactId>sandbox</artifactId><version>1.3.1</version><type>pom</type></dependency><!-- https://mvnrepository.com/artifact/com.alibaba.jvm.sandbox/sandbox-api --><dependency><groupId>com.alibaba.jvm.sandbox</groupId><artifactId>sandbox-api</artifactId><version>1.3.1</version><scope>provided</scope></dependency><!-- https://mvnrepository.com/artifact/com.alibaba.jvm.sandbox/sandbox-common-api --><dependency><groupId>com.alibaba.jvm.sandbox</groupId><artifactId>sandbox-common-api</artifactId><version>1.3.1</version></dependency><!-- https://mvnrepository.com/artifact/com.alibaba.jvm.sandbox/sandbox-core --><dependency><groupId>com.alibaba.jvm.sandbox</groupId><artifactId>sandbox-core</artifactId><version>1.3.1</version><exclusions><exclusion><groupId>com.sun</groupId><artifactId>tools</artifactId></exclusion></exclusions></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><dependency><groupId>org.kohsuke.metainf-services</groupId><artifactId>metainf-services</artifactId><version>1.8</version></dependency></dependencies><build><!--<finalName>test-1.0-SNAPSHOT</finalName>--><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>3.1</version><configuration><source>1.8</source><target>1.8</target></configuration></plugin><plugin><artifactId>maven-assembly-plugin</artifactId><configuration><archive><manifest>
<!--                            <mainClass>test.core.Core</mainClass>--></manifest></archive><descriptorRefs><descriptorRef>jar-with-dependencies</descriptorRef></descriptorRefs></configuration><!--下面是为了使用 mvn package命令,如果不加则使用mvn assembly--><executions><execution><id>make-assemble</id><phase>package</phase><goals><goal>single</goal></goals></execution></executions></plugin></plugins></build></project>

2、编写你要实现的代码逻辑

package com.alibaba.jvm.sandbox.demo;import com.alibaba.jvm.sandbox.api.Information;
import com.alibaba.jvm.sandbox.api.Module;
import com.alibaba.jvm.sandbox.api.ProcessController;
import com.alibaba.jvm.sandbox.api.annotation.Command;
import com.alibaba.jvm.sandbox.api.listener.ext.Advice;
import com.alibaba.jvm.sandbox.api.listener.ext.AdviceListener;
import com.alibaba.jvm.sandbox.api.listener.ext.EventWatchBuilder;
import com.alibaba.jvm.sandbox.api.resource.ModuleEventWatcher;
import org.kohsuke.MetaInfServices;import javax.annotation.Resource;/***
* 方式一 实现 Module
**/
@MetaInfServices(Module.class)
@Information(id = "broken-clock-tinker")
public class BrokenClockTinkerModule implements Module {@Resourceprivate ModuleEventWatcher moduleEventWatcher;@Command("repairCheckState")public void repairCheckState() {new EventWatchBuilder(moduleEventWatcher).onClass("com.taobao.demo.Clock").onBehavior("checkState").onWatch(new AdviceListener() {/*** 拦截{@code com.taobao.demo.Clock#checkState()}方法,当这个方法抛出异常时将会被* AdviceListener#afterThrowing()所拦截*/@Overrideprotected void afterThrowing(Advice advice) throws Throwable {// 在此,你可以通过ProcessController来改变原有方法的执行流程// 这里的代码意义是:改变原方法抛出异常的行为,变更为立即返回;void返回值用null表示ProcessController.returnImmediately(null);}});}}
###############分割线#######################package com.example.boxmock.mock;import com.alibaba.jvm.sandbox.api.Information;
import com.alibaba.jvm.sandbox.api.LoadCompleted;
import com.alibaba.jvm.sandbox.api.Module;
import com.alibaba.jvm.sandbox.api.ProcessController;
import com.alibaba.jvm.sandbox.api.listener.ext.Advice;
import com.alibaba.jvm.sandbox.api.listener.ext.AdviceListener;
import com.alibaba.jvm.sandbox.api.listener.ext.EventWatchBuilder;
import com.alibaba.jvm.sandbox.api.resource.ModuleEventWatcher;
import org.kohsuke.MetaInfServices;import javax.annotation.Resource;/*** 方式二 实现 Module, LoadCompleted* Created on 2022-03-13*/@MetaInfServices(Module.class)
@Information(id = "broken-clock-tinker")
public class BrokenClockTinkerModule  implements Module, LoadCompleted {@Resourceprivate ModuleEventWatcher moduleEventWatcher;@Overridepublic void loadCompleted() {new EventWatchBuilder(moduleEventWatcher).onClass("com.taobao.demo.Clock").onBehavior("checkState").onWatch(new AdviceListener() {/*** 拦截{@code com.taobao.demo.Clock#checkState()}方法,当这个方法抛出异常时将会被* AdviceListener#afterThrowing()所拦截*/@Overrideprotected void after(Advice advice) throws Throwable {ProcessController.returnImmediately(true);}});}
}

方式一、方式二区别在于后面启动JVM-sanbox 方式不同

3、修复时钟

3.1、编译部署clock-tinker模块 运行命令完成打包

mvn clean package

3.2、下载并安装最新版本阿里SandBox包:

下载地址:https://ompc.oss.aliyuncs.com/jvm-sandbox/release/sandbox-stable-bin.zip
解压: unzip sandbox-stable-bin.zip

3.3、将修复代码打好的包复制到解压后的 sandbox/sandbox-module/目录下

cp target/****-SNAPSHOT-jar-with-dependencies.jar /sandbox/sandbox-module/

3.4 查看 报错的 Clock 代码的 进程号:

命令: jps

3.5 启动沙箱
假设目标进程号:64927
启动沙箱 进入sandbox/bin 执行启动脚本

./sandbox.sh -p 64927
              NAMESPACE : defaultVERSION : 1.2.0MODE : ATTACHSERVER_ADDR : 0.0.0.0SERVER_PORT : 56854UNSAFE_SUPPORT : ENABLESANDBOX_HOME : /Users/vlinux/opt/sandboxSYSTEM_MODULE_LIB : /Users/vlinux/opt/sandbox/moduleUSER_MODULE_LIB : ~/.sandbox-module;SYSTEM_PROVIDER_LIB : /Users/vlinux/opt/sandbox/providerEVENT_POOL_SUPPORT : DISABLE

查看模块

./sandbox.sh -p 64229 -l
broken-clock-tinker ACTIVE  LOADED  0  0  UNKNOW_VERSION  UNKNOW_AUTHOR
sandbox-info        ACTIVE  LOADED  0  0  0.0.4           luanjia@taobao.com
sandbox-module-mgr  ACTIVE  LOADED  0  0  0.0.2           luanjia@taobao.com
sandbox-control     ACTIVE  LOADED  0  0  0.0.3           luanjia@taobao.com
total=4

可以看到broken-clock-tinker模块已经正确被沙箱所加载

如果修复代码用的是方法二 、到此为止 破损的时钟就已经被修复了,但是如果用的是方法一 修复clock#checkState()方法还需要一个触发操作

./sandbox.sh -p 64229 -d 'broken-clock-tinker/repairCheckState'除此之外 也可以用接口形式触发 参考:https://www.cnblogs.com/moonpool/p/14510443.html

3.6 问题修复
过一会,模块生效完成,你就会发现原本一直抛异常的钟已经开始在刷新时间了,

java.lang.IllegalStateException: STATE ERROR!at com.taobao.demo.Clock.checkState(Clock.java:16)at com.taobao.demo.Clock.report(Clock.java:34)at com.taobao.demo.Clock.loopReport(Clock.java:44)at com.taobao.demo.Clock.main(Clock.java:53)
java.lang.IllegalStateException: STATE ERROR!at com.taobao.demo.Clock.checkState(Clock.java:16)at com.taobao.demo.Clock.report(Clock.java:34)at com.taobao.demo.Clock.loopReport(Clock.java:44)at com.taobao.demo.Clock.main(Clock.java:53)
java.lang.IllegalStateException: STATE ERROR!at com.taobao.demo.Clock.checkState(Clock.java:16)at com.taobao.demo.Clock.report(Clock.java:34)at com.taobao.demo.Clock.loopReport(Clock.java:44)at com.taobao.demo.Clock.main(Clock.java:53)
2018-10-23 22:31:39
2018-10-23 22:31:40
2018-10-23 22:31:41
2018-10-23 22:31:42
2018-10-23 22:31:43
2018-10-23 22:31:44

恢复被修复的check()方法
当你卸载掉JVM-SANDBOX时候,你就会发现原本已经被修复好的钟,又开始继续报错了。原因是原来通过clock-tinker模块修复的checkState()方法随着沙箱的卸载又恢复成原来错误的代码流程。

3.7、卸载沙箱

./sandbox.sh -p 64229 -S

三、总结

可以通过这个工具最很多东西比如mock 网上有个很不错的mock开源项目
https://github.com/chufusheng/imock

阿里开源-JVM-SandBox相关推荐

  1. 阿里JVM SANDBOX原理

    一.前言 在开始之前,我们先来模拟一下以下的场景: 小李:"小明,你的接口没有返回数据,麻烦帮忙看一下?" 小明:"我这边的数据也是从别人的服务器中拿到的,但是我不确定是 ...

  2. JVM 性能调优实战之:使用阿里开源工具 TProfiler 在海量业务代码中精确定位性能代码...

    本文是<JVM 性能调优实战之:一次系统性能瓶颈的寻找过程> 的后续篇,该篇介绍了如何使用 JDK 自身提供的工具进行 JVM 调优将 TPS 由 2.5 提升到 20 (提升了 7 倍) ...

  3. JVM SandBox 的技术原理与应用分析

    原文:https://www.infoq.cn/article/TSY4lGjvSfwEuXEBW*Gp 一.前言 在开始之前,我们先来模拟一下以下的场景: 小李:"小明,你的接口没有返回数 ...

  4. AOP—JVM SandBox—底层原理解析

    原文作者:陆晨 原文地址:JVM SandBox 的技术原理与应用分析 目录 一.前言 二.JVM SandBox 简介 2.1 AOP 2.2 JVM SandBox 三.JVM 核心技术 3.1 ...

  5. JVM SandBox简要介绍

    JVM-SANDBOX(沙箱)实现了一种在不重启.不侵入目标JVM应用的AOP解决方案. 沙箱的特性 无侵入:目标应用无需重启也无需感知沙箱的存在 类隔离:沙箱以及沙箱的模块不会和目标应用的类相互干扰 ...

  6. 早就听闻阿里开源的 Arthas 在做 Java 应用诊断上十分牛逼,没失望

    点击上方蓝色"方志朋",选择"设为星标"回复"666"获取独家整理的学习资料! 来源 | https://jitwxs.cn/a64edcb ...

  7. 阿里开源混沌工程工具 ChaosBlade

    开发四年只会写业务代码,分布式高并发都不会还做程序员? >>>   近日,阿里开源了混沌工程工具 ChaosBlade.该项目是遵循混沌工程(Chaos Engineering)原理 ...

  8. ali arthas 火焰图_带你上手阿里开源的 Java 诊断利器:Arthas

    本文适合有 Java 基础知识的人群. 本文作者:HelloGitHub-秦人 HelloGitHub 推出的<讲解开源项目>[1]系列,今天给大家带来一款阿里开源的 Java 诊断利器 ...

  9. java为什么打不开jar_带你上手阿里开源的 Java 诊断利器:Arthas

    本文适合有 Java 基础知识的人群. 本文作者:HelloGitHub-秦人 HelloGitHub 推出的<讲解开源项目>[1]系列,今天给大家带来一款阿里开源的 Java 诊断利器 ...

最新文章

  1. Java8中Lambda表达式的10个例子
  2. GCB | 南土所冯有智组揭示了温度非线性的控制了全球土壤腐生真菌地理学分布...
  3. 通信基站电池,再也不怕丢了
  4. java求二次函数的a,b,c值
  5. 8086实时时钟实验(一)——《x86汇编语言:从实模式到保护模式》05
  6. Android SDK Manager 更新慢解决办法
  7. 登陆mysql服务器命令_Mysql服务器登陆,启动,停止等基本操作命令介绍(Linux/Centos环境)...
  8. python-函数的多值传参
  9. 引用参数与引用返回值
  10. centos下python中添加easygui模块
  11. Android 再爆新漏洞,9.0 以下所有手机全部中招!
  12. 九度oj 题目1516:调整数组顺序使奇数位于偶数前面
  13. Node.js:中间件——post请求中间件
  14. CentOS6.5下安装Open vSwitch
  15. Html 返回顶部代码及注释说明
  16. html 中 div 盒子上下垂直居中显示
  17. N卡怎么修改录屏文件保存位置
  18. 网页设计语言html做思维导图,web网页实现思维导图展示
  19. HTML的relative与absolute区别
  20. 开课吧 python与人工智能 下载_开课吧app|开课吧手机版下载v2.3.6安卓版 - 欧普软件下载...

热门文章

  1. 机器学习应该准备哪些数学预备知识?
  2. scrollTo()
  3. 登入註冊頁面(Login/Signup)
  4. 使用 Audacity 录制声卡声音
  5. 为什么黑客不黑/攻击赌博网站?如何入门黑客?
  6. 杜拉拉升职记4--读书笔记
  7. 《杜拉拉升职记》之经典语录
  8. 详解自动微分(Automatic Differentiation)
  9. java实现网站错别字搜索对的结果_自媒体文章错别字检测工具,给你检查文章错别字,方便又省事...
  10. UCI 数据集 - http://www.mafutian.net/180.html