拦截运行时java进程--xdubbo agent解读(1)
平常我们玩过jvisualvm监控java进程信息就知道,jvisualvm虽然说是jdk自带的,但如果我们自己要监控和替换某些java进程呢?我们如何玩?
根据作者目前的认知,介绍下jdk tools工具如何搬弄运行时java进程的
随便一个需求
运行java某进程正在跑一个用户,跑出的结果是格式:firstName.lastName 现在要将这个进程的结果改变,跑出 lastName.firstName
我们如何做?
先看下流程图吧
具体做法
先做一个agent包
1、先定义User
2、写个agent
3、跑主进程
4、定义jar 包的MANIFEST.MF
5、定义jar 打包pom坐标
这里注意了,要将tools.jar设置pom 否则会报错([ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:2.3.2:compile (default-compile) on project xdubbo-agent: Compilation failure: Compilation failure:
[ERROR] \springboot\sharding-share-work\xdubbo\xdubbo-agent\src\main\java\com\xdubbo\utils\JVMProcess.java:[3,0] ����: �����sun.jvmstat.monitor������
[ERROR] \springboot\sharding-share-work\xdubbo\xdubbo-agent\src\main\java\com\xdubbo\utils\JVMProcess.java:[26,12] ����: �Ҳ�������
[ERROR] \springboot\sharding-share-work\xdubbo\xdubbo-agent\src\main\java\com\xdubbo\utils\JVMProcess.java:[26,34] ����: �Ҳ�������
[ERROR] \springboot\sharding-share-work\xdubbo\xdubbo-agent\src\main\java\com\xdubbo\utils\JVMProcess.java:[31,16] ����: �Ҳ�������
[ERROR] \springboot\sharding-share-work\xdubbo\xdubbo-agent\src\main\java\com\xdubbo\utils\JVMProcess.java:[31,58] ����: �Ҳ�������
[ERROR] \springboot\sharding-share-work\xdubbo\xdubbo-agent\src\main\java\com\xdubbo\utils\JVMProcess.java:[33,37] ����: �Ҳ�������),无法编译
<dependency> <groupId>com.sun</groupId> <artifactId>tools</artifactId> <version>1.8</version> <scope>system</scope> <systemPath>${JAVA_HOME}/lib/tools.jar</systemPath> </dependency>
6查看jar
ok agent包已做好
再做个测试工具或叫client吧
1,重定义User,用来替换运行时进程的User
2,写个测试类
这里注意了要将tools.jar导入到idea或eclipse
否则会报:
com.sun.tools.attach.VirtualMachine:no providers installed
好了,我们现在开测
java -jar 你的agent.jar
运行client你要注入或监控或替代的jar
其实这个玩法是很有用的,后续做监控或做别的处理,做到零侵入的,当然还有字节码的玩法比如:
从Javassist字节码动态注入说起--Dubbo源码系列解读(6)
源码:https://github.com/luozhonghua/xdubbo