一、背景

Jvm sandbox沙箱机制,是一种实现不重启、无侵入改变目标应用返回值的面向切面编程解决方案。测试方面来说,对于RPC接口、HTTP接口都适用。如果需要开发一个比较全面的mock平台,不仅仅是简单的http接口mock,则可以考虑该方案。本次主要介绍使用官网的案例,进行实践测试效果,后续会介绍如何利用Jvm sandbox搭建Mock平台。

二、定义一个损坏的钟

下面直接以Linux服务器上的实操举例,Mac同理。

我们先创建一个Springboot工程,工程中定义一个Controller类定义URL入口,调用Clock类,Clock类为官网案例:一个损坏了的钟。

1、 Springboot工程中创建一个Clock类,代码如下:
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();}}

本地运行之后,会看到目前一直在报异常:

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)
2、 添加一个Controller类,指向运行Clock类中的loopReport方法:
import com.taobao.demo.service.Clock;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;@Slf4j
@RestController
@RequestMapping("clock")
public class ClockController {@AutowiredClock clock;@RequestMapping("/start")public void start() throws InterruptedException {log.info("start clock");clock.loopReport();}
}
3、 部署该Springboot项目到linux服务器上运行,访问定义好的接口:http://服务器IP地址:8080/clock/start, 会看到目前一直在报错:

三、修复这个损坏的钟

1、 编写一个模块修复损坏的钟

创建一个maven工程:clock-tinker, pom.xml添加“sandbox-module-starter” maven依赖:

<parent><groupId>com.alibaba.jvm.sandbox</groupId><artifactId>sandbox-module-starter</artifactId><version>1.2.0</version>
</parent>

编写“BrokenClockTinkerModule ”类,修复损坏的钟代码:

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;@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);}});}
}

编译部署clock-tinker工程:

mvn clean package

项目工程的target目录下会生成“clock-tinker-1.0-SNAPSHOT-jar-with-dependencies.jar” 包:

2、 下载并安装jvm-sandbox

下载地址:https://ompc.oss.aliyuncs.com/jvm-sandbox/release/sandbox-stable-bin.zip
使用命令wget下载后,解压:

unzip sandbox-stable-bin.zip
cd sandbox

目录结构如下:

3、 将修复的jar包复制到sandbox-module目录下:
cp target/clock-tinker-1.0-SNAPSHOT-jar-with-dependencies.jar ~/.sandbox-module/
4、 启动sandbox

使用命令:ps -ef | grep java , 查到服务器上启动的被损坏的钟clock的java 进程号,比如进程号是:1。
进入到解压后的sandbox的bin目录下,使用以下命令启动sandbox:

./sandbox.sh -p 1


使用以下命令查看模块:

./sandbox.sh -p 1 -l


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

5、 修复clock#checkState()方法

接下来就是重头戏,如何在不影响目标应用的情况下,无声无息的修复这个故障!
触发broken-clock-tinker模块的repairCheckState(),让修复逻辑生效。
执行命令:触发BrokenClockTinkerModule#repairCheckState()方法执行

./sandbox.sh -p 1 -d 'broken-clock-tinker/repairCheckState'

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

6、 恢复被修复的check()方法:

停止sandbox的命令:

./sandbox.sh -p 64229 -S


会看到提示信息:

jvm-sandbox[default] shutdown finished.

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

==========================================================================================

以上就是本次的全部内容,如果对你有帮助,欢迎关注我的微信公众号:程序员杨叔,各类文章都会第一时间在上面发布,持续分享全栈测试知识干货,你的支持就是作者更新最大的动力~

Jvm sandbox mock机制实践相关推荐

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

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

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

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

  3. (JVM) 沙箱安全机制

    沙箱安全机制 沙箱安全机制 保证程序安全 保护Java原生的JDK代码 Java安全模型的核心就是Java沙箱(sandbox).什么是沙箱?沙箱是一个限制程序运行的环境. 沙箱机制就是将Java代码 ...

  4. JVM性能调优实践——G1 垃圾收集器分析、调优篇

    前言 关于G1 GC以及其他垃圾收集器的介绍可以参考前一篇JVM性能调优实践--G1 垃圾收集器介绍篇.了解了G1垃圾收集器的运行机制之后,就可以针对一些GC相关参数来调整内存分配以及运行策略.下文的 ...

  5. JVM SandBox实现原理详解

    1.什么是JVM SandBox JVM SandBox(沙箱)实现了一种非侵入式运行期的AOP解决方案.JVM SandBox属于基于Instrumentation的动态编织类的AOP框架,可以在不 ...

  6. 阿里JVM SANDBOX原理

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

  7. JVM SandBox简要介绍

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

  8. 深入理解JVM—垃圾回收机制

    一.前言 明确垃圾收集器关注的部分:堆和方法区.着重学习如何确定哪些垃圾需要回收.垃圾回收算法以及GC触发条件. 二.如何确定哪些垃圾需要回收 1.引用计数算法 在对象中添加一个引用计数器,每当有一个 ...

  9. 4、JVM垃圾回收机制、新生代的GC、GC(Minor GC、FullGC)、GC日志、JVM参数选项、元空间(笔记)

    4.JVM垃圾回收机制 4.1.新生代的GC 4.1.1.串行GC(SerialGC) 4.1.2.并行回收GC(Parallel Scavenge) 4.1.3.并行GC(ParNew) 4.2.G ...

最新文章

  1. win10系统上使用utorrent的问题
  2. 探索 YOLO v3 实现细节 - 第6篇 预测 (完结)
  3. SAP 销售与分销模块定价完全实施手册(SAP SD Pricing Handbook)
  4. php视频文件上传到服务器,上传和下载图片和视频到服务器
  5. ELK的What files do you want me to watch? Exiting: no modules or inputs enabled and configuration
  6. JAVA进阶开发之(异常类)
  7. 许家印深夜主持集团营销大会:恒大全国楼盘全线7折!
  8. 最长上升子序列(LIS)和最长公共子序列(LCS) 模板
  9. 九位名人美到极致的句子。读这样的句子,是一种享受。
  10. Zabbix离线安装部署
  11. wmic冻结进程_WMIC的用法
  12. 当BIM遇上GIS-无人机倾斜摄影三维建模(ContextCapture) 建设智慧城市方法详解
  13. 基于plc的污水处理,组态王动画仿真,带PLC源代码,组态王源代码
  14. Asis CTF 2016 b00ks
  15. 陌陌也出了网页版,醉翁之意不在酒在直播
  16. RxJavaAndroid学习笔记
  17. 未连接到互联网 代理服务器出现问题,或者地址有误。
  18. 狂神说-Springcloud笔记
  19. java 垃圾回收题目_Java垃圾收集题目分析
  20. Windows电脑添加和删除路由(附管理员打开cmd方法)

热门文章

  1. 【SGD深入理解】vanilia SGDmomentum SGD
  2. STM32F10xxx20xxx21xxxL1xxxx Cortex-M3程序设计手册 阅读笔记三(2):Cortex-M3内部函数
  3. Win系统如何取消f1打开浏览器
  4. 哈达玛矩阵的相关基础知识
  5. web3.js的provider
  6. Java代码加密混淆工具有哪些?
  7. Splay Tree
  8. 基于STM32单片机的天然气甲烷硫化氢气体检测仪原理图PCB
  9. american主板网卡灯关机后还亮_七彩虹主板设置概述.pdf
  10. 算法学习--排序算法--插入排序