Skip to content

新手指南

xcaspar edited this page Apr 1, 2019 · 1 revision

感谢您关注 chaosblade-exec-jvm 项目,此项目是 chaosblade 项目的一个底层混沌实验执行器,对运行在 JVM 平台上的应用或组件实施故障注入等混沌实验。

本指南旨在说明 chaosblade 如何调用 chaosblade-exec-jvm 和编译好的 chaosblade-exec-jvm jar 包如何使用。

chaosblade-exec-jvm 工程架构

├── 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。

chaosblade-exec-jvm 编译

在工程根目录下执行 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 调用 chaosblade-exec-jvm

通过上两部分,可以了解 chaosblade-exec-jvm 的工程模块和打包后的文件,对于 chaosblade 工具来说,所需要的是 jvm.spec.yamlchaosblade-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 会缓存下发的参数,然后匹配混沌实验组件所获取到的数据是否一致。如果一致,则调用对应的场景执行器,比如 DelayExecutorThrowExceptionExecutor,如果不一致,则不处理。
  • 执行 blade destroy <UID> 命令,销毁所创建的实验,即 agent 会删除之前缓存的实验。
  • 执行 blade revoke <UID> 命令,会内部调用 jvm-sandbox shutdown 指令,卸载所加载的 module,还原之前所修改的类,关闭 jvm-sandbox 自身,清除 jvm-sandboxchaosblade-java-agent-0.0.1.jar 所加载的类。

以上是一次完整的关于 JVM 应用的混沌实验实施流程。

使用自己编译的 chaosblade-exec-jvm jar 包

如果想使用自己编译的 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 命令执行即可。

chaosblade-exec-jvm 插件如何扩展

具体详见后续的开发者指南 :-)

附录 A

- 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