-
Notifications
You must be signed in to change notification settings - Fork 218
新手指南
xcaspar edited this page Apr 1, 2019
·
1 revision
感谢您关注 chaosblade-exec-jvm
项目,此项目是 chaosblade 项目的一个底层混沌实验执行器,对运行在 JVM 平台上的应用或组件实施故障注入等混沌实验。
本指南旨在说明 chaosblade 如何调用 chaosblade-exec-jvm
和编译好的 chaosblade-exec-jvm jar
包如何使用。
├── chaosblade-exec-bootstrap
│ ├── chaosblade-exec-bootstrap-jvmsandbox
├── chaosblade-exec-common
├── chaosblade-exec-plugin
│ ├── chaosblade-exec-plugin-dubbo
│ ├── chaosblade-exec-plugin-jvm
│ ├── chaosblade-exec-plugin-mysql
│ ├── chaosblade-exec-plugin-servlet
├── chaosblade-exec-service
chaosblade-exec-jvm 工程分 4 个子模块:
-
chaosblade-exec-bootstrap
: jar 包启动器,执行入口。目前支持的chaosblade-exec-bootstrap-jvmsandbox
是基于 jvm-sandbox 实现的,通过 java agent 机制动态加载 agent jar。 -
chaosblade-exec-common
: 是工程的通用模块,其他子模块都依赖于此模块,其包含故障注入模型的定义、类方法 AOP 定义等。 -
chaosblade-exec-plugin
: 支持混沌实验插件,比如 dubbo、mysql、servlet 等。jvm 插件是对随意指定的类和方法做混沌实验的插件。如果对插件进行扩展,也是在此模块下追加。具体的如何扩展插件,后续会有文章专门说明。 -
chaosblade-exec-service
:包含两大功能:一是 chaosblade 通信协议解析,用来解析执行 chaosblade 下发的混沌实验指令;另一个是生成jvm.spec.yaml
文件,此文件的内容定义了 JVM 相关的混沌实验场景,chaosblade 工具通过读取此文件,显示对 JVM 应用所支持的混沌实验场景。部分内容可见附录 A。
在工程根目录下执行 sh build.sh
编译打包,会生成两个文件夹:
├── plugins
│ ├── chaosblade-exec-plugin-dubbo-0.0.1-SNAPSHOT.jar
│ ├── chaosblade-exec-plugin-jvm-0.0.1-SNAPSHOT.jar
│ ├── chaosblade-exec-plugin-mysql-0.0.1-SNAPSHOT.jar
│ ├── chaosblade-exec-plugin-servlet-0.0.1-SNAPSHOT.jar
│ └── jvm.spec.yaml
└── target
└── chaosblade-java-agent-0.0.1-SNAPSHOT.jar
-
plugins
: 包含混沌实验场景文件jvm.spec.yaml
和支持的混沌实验插件。需要注意的是,除jvm.spec.yaml
文件外,以上插件都已经打包到target/chaosblade-java-agent-0.0.1-SNAPSHOT.jar
中,无需再做任何的打包或其他处理。 -
target
: 编译后的 agent jar 包,包含上述所支持的混沌实验组件。
通过上两部分,可以了解 chaosblade-exec-jvm 的工程模块和打包后的文件,对于 chaosblade 工具来说,所需要的是 jvm.spec.yaml
和 chaosblade-java-agent-0.0.1-SNAPSHOT.jar
两个文件。 第一个文件是 chaosblade 感知关于 jvm 应用所支持的混沌实验场景有哪些,第二个文件的作用是 chaosblade 通过此文件执行 jvm 应用所支持的混沌实验场景。
下载 chaosblade RELEASE 包,解压后,会看到两个文件夹,一个文件:
├── bin
│ ├── jvm.spec.yaml
│ └── tools.jar
├── blade
└── lib
└── sandbox
├── module
└── chaosblade-java-agent-0.0.1.jar
(注意:以上省略了部分文件)
-
blade
文件是 chaosblade 工具的执行文件 -
bin
目录是 chaosblade 工具所支持的混沌实验场景目录。此处的jvm.spec.yaml
文件就是chaosblade-exec-jvm
编译后生成的文件。 -
lib
目录是第三方的依赖组件,目前只依赖了jvm-sandbox
,其 module 下的chaosblade-java-agent-0.0.1.jar
文件是chaosblade-exec-jvm
编译后生成 agent jar 包。
chaosblade
执行 JVM 应用混沌实验的流程是:
-
blade
工具执行时,先读取 bin 目录下的jvm.spec.yaml
文件,将场景注册到混沌实验场景列表中。 - 执行
blade prepare jvm --process <PROCESS NAME>
命令,会内部调用jvm-sandbox
flush 指令,加载其 module 下的chaosblade-java-agent-0.0.1.jar
agent 文件,修改混沌实验组件所匹配到的类。 - 执行
blade create dubbo xxx
等组件的混沌实验,会内部通过 HTTP 协议调用已加载的 agent,agent 会缓存下发的参数,然后匹配混沌实验组件所获取到的数据是否一致。如果一致,则调用对应的场景执行器,比如DelayExecutor
,ThrowExceptionExecutor
,如果不一致,则不处理。 - 执行
blade destroy <UID>
命令,销毁所创建的实验,即 agent 会删除之前缓存的实验。 - 执行
blade revoke <UID>
命令,会内部调用jvm-sandbox
shutdown 指令,卸载所加载的 module,还原之前所修改的类,关闭jvm-sandbox
自身,清除jvm-sandbox
和chaosblade-java-agent-0.0.1.jar
所加载的类。
以上是一次完整的关于 JVM 应用的混沌实验实施流程。
如果想使用自己编译的 chaosblade-exec-jvm
jar 包,需要两步操作:
- 将编译后的
plugins/jvm.spec.yaml
拷贝到 chaosblade 工具包bin/
目录下 - 将编译后的
target/chaosblade-java-agent-0.0.1-SNAPSHOT.jar
文件拷贝到 chaosblade 工具包lib/sandbox/module/
目录下
然后调用 chaosblade 工具包下的 blade 命令执行即可。
具体详见后续的开发者指南 :-)
- target: dubbo
shortDesc: dubbo experiment
longDesc: Dubbo experiment for testing service delay and exception.
example: dubbo delay --time 3000 --consumer --service com.example.service.HellService
actions:
- action: delay
shortDesc: delay time
longDesc: delay time...
matchers:
- name: appname
desc: The consumer or provider application name
noArgs: false
required: false
- name: provider
desc: To tag provider experiment
noArgs: true
required: false
- name: service
desc: The service interface
noArgs: false
required: false
- name: version
desc: the service version
noArgs: false
required: false
- name: consumer
desc: To tag consumer role experiment.
noArgs: true
required: false
- name: methodname
desc: The method name in service interface
noArgs: false
required: false
flags:
- name: time
desc: delay time
noArgs: false
required: true
- name: offset
desc: delay offset for the time
noArgs: false
required: false
- name: process
desc: Application process name
noArgs: false
required: false