jvm-sandbox学习+实践

一、简介

0、官网  、原理
1、JVM-SANDBOX(沙箱)实现了一种在不重启、不侵入目标JVM应用的运行期AOP解决方案。
2、动态增强类你所指定的类,获取你想要的参数和行信息甚至改变方法执行
3、动态可插拔容器框架
注:可插拔两层含义:
a、JVM 沙箱本身是可以被插拔的,可被动态地挂载到指定 JVM 进程上和可以被动态地卸载;
b、JVM 沙箱内部的模块是可以被插拔的,在沙箱启动期间,被加载的模块可以被动态地启用和卸载

(一)应用场景
1、线上故障定位
2、线上系统流控
3、线上故障模拟
4、方法请求录制和结果回放
5、动态日志打印
6、安全信息监测和脱敏

 

二、安装
(一)安装沙箱
1、下载最新版本的JVM-SANDBOX:wget http://ompc.oss-cn-hangzhou.aliyuncs.com/jvm-sandbox/release/sandbox-stable-bin.zip
2、解压:unzip sandbox-stable-bin.zip
3、安装:./install-local.sh -p /export/opt/app/jvm-sandbox
安装成功:
VERSION=1.3.3
PATH=/export/opt/app/jvm-sandbox/sandbox
install sandbox successful.
(二)启动沙箱(挂载目标应用)
1、attach方式启动:./sandbox.sh -p vmid
a、可以在不重启目标JVM的情况下完成沙箱的植入。启动成功,沙箱已经顺利植入了目标JVM中,并且打开了HTTP端口55756,完成系统模块sandbox-mgr-module.jar 的加载。
若启动报(如图),则需要将sandbox.sh中的127.0.0.1改为当前ifconfig的ip


2、agent方式启动
a、沙箱工作在应用代码加载之前,或者一次性渲染大量的类、加载大量的模块,此时如果用ATTACH方式加载,可能会引起目标JVM的卡顿或停顿(GC),这就需要启用到AGENT的启动方式。
b、JVM启动参数中增加上:-javaagent:/export/opt/app/jvm-sandbox/sandbox/lib/sandbox-agent.jar
例:nohup java -javaagent:/export/opt/app/jvm-sandbox/sandbox/lib/sandbox-agent.jar -jar sunxj-deploy-1.0-SNAPSHOT.jar >/export/opt/app/runningApp/nohup.log 2>&1 &
c、这样沙箱将会伴随着JVM启动而主动启动并加载对应的沙箱模块。
(三)卸载沙箱
./sandbox.sh -p vmid -S

 

三、沙箱配置
为了更好地使用JVM-Sandbox和管理模块,配置上做了一些约定和规范。
(一)沙箱结构介绍
1、./sandbox/bin/sandbox.sh:沙箱的客户端脚本,用于启动、管理沙箱
2、./sandbox/cfg/:沙箱配置文件存放目录
a、./sandbox/cfg/version:存放沙箱容器的版本号
b、./sandbox/cfg/sandbox.properties:存放沙箱容器的配置信息,配置文件只会在沙箱容器启动的时候加载一次。
c、./sandbox/cfg/sandbox-logback.xml:日志配置,日志文件默认写入到${HOME}/logs/sandbox/sandbox.log文件中
3、./sandbox/lib/:沙箱主程序的库包目录
sandbox-agent.jar:沙箱启动代理
sandbox-core.jar:沙箱内核
sandbox-spy.jar:沙箱间谍库,用于提供插桩埋点的间谍类
4、运行时文件:沙箱启动后将会创建一个隐藏文件${HOME}/.sandbox.token,这个文件将完成目标JVM进程和沙箱客户端进程一些信息的交互.
5、沙箱拥有两个加载模块的目录,用途各自不一
a、./sandbox/module/:沙箱系统模块目录,由配置项system_module进行定义。用于存放沙箱通用的管理模块,比如用于沙箱模块管理功能的module-mgr模块,未来的模块运行质量监控模块、安全校验模块也都将存放在此处,跟随沙箱的发布而分发。系统模块不受刷新(-f)、**强制刷新(-F)功能的影响,只有容器重置(-R)**能让沙箱重新加载系统模块目录下的所有模块。
b、${HOME}/.sandbox-module/:沙箱用户模块目录,由sandbox.properties的配置项user_module进行定义,默认为${HOME}/.sandbox-module/。一般用于存放用户自研的模块。自研的模块经常要面临频繁的版本升级工作,当需要进行模块动态热插拔替换的时候,可以通过**刷新(-f)或强制刷新(-F)**来完成重新加载。
(二)沙箱模块
1、所有的沙箱模块都可以被设计成为热插拔
2、一个JAR包下可以申明多个模块,模块需要符合Java SPI规范,要求
a、必须拥有publish的无参构造函数
b、必须实现com.alibaba.jvm.sandbox.api.Module接口
c、必须完成META-INF/services/com.alibaba.jvm.sandbox.api.Module文件中的注册(Java SPI规范要求)
d、也可以通过依赖sandbox-module-starter来简化以上操作。
<parent>
<groupId>com.alibaba.jvm.sandbox</groupId>
<artifactId>sandbox-module-starter</artifactId>
<version>1.2.0</version>
</parent> 
3、同一个JAR包所声明的所有模块共享同一个ModuleJarClassLoader
4、模块一共有四种状态
a、加载:模块被沙箱正确加载,沙箱将会允许模块进行命令相应、代码插桩等动作
b、卸载:沙箱不会再看到该模块,之前给该模块分配的所有资源都将会被回收,包括模块已经侦听事件的类都将会被移除掉监听插桩,干净利落不留后遗症
c、激活:模块加载成功后默认是冻结状态,需要代码主动进行激活。模块只有在激活状态下才能监听到沙箱事件
d、冻结:模块进入到冻结状态之后,之前侦听的所有沙箱事件都将被屏蔽。需要注意的是,冻结的模块不会退回事件侦听的代码插桩,只有delete()、wathcing()或者模块被卸载的时候插桩代码才会被清理。
(三)配置文件解释
1、./cfg/sandbox.properties。如图
配置文件只会在沙箱第一次启动的时候加载,刷新(-f)、**强制刷新(-F)和重置(-R)都不会让配置文件重新生效。如果希望配置文件重新生效,需要关闭(-S)**容器,重新再次加载。

 

四、命令说明
sandbox.sh是整个沙箱的主要操作客户端,通过HTTP协议来完成通讯,所以要求Linux系统必须安装curl命令。目前我使用的是BASH来实现。
1、-p:指定目标JVM进程号
2、-l:列出目标JVM沙箱中已经加载的模块
3、-F:强制刷新用户模块。首先卸载掉所有已加载的用户模块,然后再重新进行加载。当任何一个模块加载失败时,忽略该模块,继续加载其他可加载的模块
4、-f:刷新用户模块。与强制刷新用户模块不同的地方是,普通刷新会遍历用户模块下所有发生改变的模块文件,当且仅对发生变化的文件进行重新加载操作。
5、-R:沙箱模块重置。沙箱模块重置的时候将会强制刷新所有的模块,包括用户模块和系统模块。但sandbox.properties不会被重新加载
6、-u:卸载指定模块。卸载指定模块,支持通配符表达式子。卸载模块不会区分系统模块和用户模块。例如:./sandbox.sh -p 4321 -u 'debug-module'
7、-a:激活模块。模块激活后才能收到沙箱事件
8、-A:冻结模块。模块冻结后将感知不到任何沙箱事件,但对应的代码插桩还在。
9、-m:查看模块详细信息。模块名需要精确匹配,不支持通配符。如图


10、-d:模块自定义命令
挂载到对应进程:./sandbox.sh -p vmid -d 'my-sandbox-module/addLog' 【my-sandbox-module/addLog】
@Information(id = "my-sandbox-module")// 模块名,在指定挂载进程后通过-d指定模块,配合@Command注解来唯一确定方法【标记在类上】
@Command("addLog")// 模块命令名【标记在方法上】
通过指令查看是否挂载成功:./sandbox.sh -p vmid -l

 

五、sand-box实战(记录请求日志)

1、相关项目位置:192.168.171.17

a、web项目:/export/opt/app/runningApp/unxj-deploy-1.0-SNAPSHOT.jar    

b、swagger:http://192.168.171.17:8080/swagger-ui.html#/

c、sandbox-log-module:/root/.sandbox-module/sunxj-sandbox-1.0-SNAPSHOT-jar-with-dependencies.jar

d、http请求日志:/export/opt/app/sandbox.log

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值