简介
常态化压测、业务压测、集群压测、全链路压测、等基于特定需求的对后台接口进行的并发式请求,接口自动化
压测数据的来源: 数据仓库,线上流量(可能不包含新的逻辑字段),获取数据的手段多种多样
压测数据的有效性:
压测数据的真实性:
Java Instrument的使用:https://blog.csdn.net/GV7lZB0y87u7C/article/details/79860776
TcpCopy_网易、Gor、diffy基于网络层面的录制 jvm-sandbox-repeater
阿里doom平台
滴滴 RDebug
模拟真实的读库,那写库如何操作?
发压机管理调度尽量无瓶颈
基于流量的自动化接口回归
1. 流量复制
2. 流量回归
读接口
写接口
mock数据,如何保证数据库不被脏数据污染
3. 引流
正式 <=> 测试 <=> 预发
参考链接:
https://www.ctolib.com/topics-128206.html
Java Instrument
简介
可以构建一个独立于应用程序(Agent),用来监测和协助运行在JVM上的程序,甚至能够替换和修改某些类的定义
- 启动后的instrument (VM启动)
- 本地代码(native code)instrument
- 动态改变classpath
java.lang.instrument包的具体实现,依赖于JVMTI(java virtual machine tool interface)类定义动态改变和操作
1. JVMTI 提供了一套”代理”程序机制,可以支持第三方工具程序以代理的方式连接和访问 JVM,并利用 JVMTI 提供的丰富的编程接口,完成很多跟 JVM 相关的功能
- 事实上,java.lang.instrument 包的实现,也就是基于这种机制的:在 Instrumentation 的实现当中,存在一个 JVMTI 的代理程序,通过调用 JVMTI 当中 Java 类相关的函数来完成Java 类的动态操作。除开 Instrumentation 功能外,JVMTI 还在虚拟机内存管理,线程控制,方法和变量操作等等方面提供了大量有价值的函数。
参考链接:https://blog.csdn.net/GV7lZB0y87u7C/article/details/79860776
https://www.jianshu.com/p/5c62b71fd882
vm启动前设置Instrument
- Instrumentation 的最大作用,就是类定义动态改变和操作。在 Java SE 5 及其后续版本当中,开发者可以在一个普通 Java 程序(带有 main 函数的 Java 类)运行时,通过 -javaagent参数指定一个特定的 jar 文件(包含 Instrumentation 代理)来启动 Instrumentation 的代理程序
关键字:
premain(String agentArgs,Instruments inst) {
inst.addTransform(new 实现ClassFileformer的类())
//另外一种方法
ClassDefinition def = new ClassDefinition(....)
inst.redefineClasses(new ClassDefinition[] {def})//可以批量转换很多类
}
ClassFileTransformer - Interface
transform() - ClassFileTransformer中的方法
VM启动后动态Instrument
关键字
Attach API 揭示了agentmain的用法,扩展的API,开发者可以方便的监控一个JVM,运行一个外加的代理程序
两个主要类:
1. VirtualMachine代表一个java虚拟机-JVM枚举、Attach、Detach动作
2. VirtualMachineDescriptor:一个描述虚拟机的容器类
通过attach()方法传入一个jvm的pid(进程id),远程连接到jvm上
通过loadAgent()方法向jvm注册一个代理程序agent,返回Instrumentation实例
该实例可以在class加载前改变class字节码,可以在class加载后重新加载
agentmain(String agentArgs,Instrumentation inst) {
inst.addTransform(new 实现ClassFileformer的类())
inst.retransformClasses(...) //批量转换类定义
}
inst.addTransform(new 实现ClassFileformer的类())
//在main函数开始运行后才启动
public static void agentmain(String agentArgs,Instrumentation inst)
public static void agentmain(String agentArgs)
Instrument原理
- Interface Summary
1. ClassFileTransformer:定义了类加载前的预处理类,可以在这个类中对需要加载的类的字节码做一些处理,比如进行字节码增强;
An agent provides an implementation of this interface in order to transform class files;
2. Instrumentation: 增强器,由JVM在入口参数中传递,提供了如下功能
有几个主要方法
This class provides services needed to instrument Java programming language code
............
...........
- Class summary
ClassDefinition: This class serves as a parameter block to the Instrumentation.redefineClasses method
工作原理
- Instrument Agent 动态库通过JVM初始化,被动态加载
- Instrument Agent初始化的时候,注册了JVMTI的初始化函数eventHandlerVMInit
- JVM启动调用了初始化函数eventHandlerVMInit,启动了Instrument Agent,用sun.instrument.instrumentationImpl类里的方法loadClassAndCallPremain去初始化我们自定义的transform里的premain方法
- 初始化函数注册了class解析的JVMTI的ClassFileLoadHook
- 在解析class的时候,JVM调用JVMTI的ClassFileLoadHook函数,钩子函数调用了sun.instrument.instrumentationImpl的transform方法,通过TransformManager的transform的方法最终调用了我们自定义的MyTransformer的类的transform方法
- 因为字节码是在解析class之前改的,通过直接替代修改后字节码的数据流,最后进入class的解析,,。
- 重新加载class依然走5~6步
网友评论