1.ChaosBlade简介

ChaosBlade 是一款遵循混沌工程实验原理,提供丰富故障场景实现,帮助分布式系统提升容错性和可恢复性的混沌工程工具,可实现底层故障的注入,特点是操作简洁、无侵入、扩展性强。

目前我涉及到业务线引入此工具的目的就在于优化原有的故障植入方式,并扩展一些新的植入场景,如dubbo服务异常,mysql操作,网络异常,特定方法异常等。

项目地址:https://github.com/chaosblade-io/chaosblade/wiki/%E6%96%B0%E6%89%8B%E6%8C%87%E5%8D%97
从其cli工具的help中,可以看出ChaosBlade目前支持的一些能力

  cpu         Cpu experiment
  disk        Disk experiment
  docker      Execute a docker experiment
  dubbo       dubbo experiment
  jvm         method
  k8s         Kubernetes experiment
  mysql       mysql experiment
  network     Network experiment
  process     Process experiment
  servlet     java servlet experiment
 
ChaosBlade支持的能力
  • 在本团队内,此工具目前的实践场景如下:
    1.自测阶段的故障植入,在不需要变更真实逻辑的情况下,验证自己的异常处理;
    2.测试同学在测试阶段,模拟底层依赖服务的故障场景,验证系统可用程度,降级方案是否生效等;
    3.业务故障演练时,在不需要变更真实逻辑的情况下,可以人为模拟特定场景的故障异常,验证止损方案是否可是有效的,可落地的;

2.三个demo

2.1 network实验

network中支持的操作如下

  delay       Delay experiment
  dns         Dns experiment
  drop        Drop experiment
  loss        Loss network package

drop --help:
Drop network data

Usage:
  blade create network drop

Flags:
  -h, --help                  help for drop
      --invoke-port string    Port for invoking
      --service-port string   Port for external service

众所周知,iptables的规则中,可以设置指定端口进行DROP规则的配置,命令执行完成后,可以观察到iptables中确实被添加了此数据

 

 

此时我访问 'localhost:8888/ok.htm'时,接口会block住(如果是REJECT策略会直接抛出错误),最后报找不到端口服务的错误;

实验结束后,可以根据create时返回的uid进行撤销:

 

 

如果忘记了uid,可以通过:./blade status [cmd] 命令来进行找回;

2.2 Java返回值变更实验

针对jvm的一些实验,ChaosBlade的原理主要是使用了字节码增强技术(ASM),即改变class内容,再重新通过jvm-sandbox提供的SandboxClassLoader加载到jvm使其生效,相比于spring的AOP切面,它更像是一此JVM动态切面;

jvm支持的操作如下

Available Commands:
  delay                  delay time
  return                 Return the specify value
  throwCustomException   throw custom exception
  throwDeclaredException Throw the first declared exception of method</pre>

return操作如下:仅支持基本类型的返回

lags:
      --classname string    The class name with package
      --methodname string   The method name
      --process string      Application process name
      --value string        Value returned, only support primitive type value. If you want return null, set --value null (required)

模拟开始前,需要先指定jvm进程,以便插入被变更后的字节码

./blade create jvm return --classname cn.fraudmetrix.creditcloud.api.impl.ApplicationMonitorServiceImpl --methodname ok --value modify --process 30524 -d
 
  • 操作说明
    1.试验结束后,先销毁了返回值的变更,重新调用ok接口后,发现数据已经恢复;
    2.整个JVM实验结束后,如果需要对整个环境进行销毁,使用revoke;

2.3 dubbo接口阻塞实验

dubbo 接口支持的操作如下:

Available Commands:
  delay                delay time
  throwCustomException throw custom exception

delay具体参数如下:

Flags:
      --appname string      The consumer or provider application name
      --consumer            To tag consumer role experiment.
      --methodname string   The method name in service interface
      --offset string       delay offset for the time
      --process string      Application process name
      --provider            To tag provider experiment
      --service string      The service interface
      --time string         delay time (required)
      --version string      the service version</pre>

A业务在调用dubbo接口超时后,进行了熔断降级处理,为了验证熔断器的执行逻辑是否符合预期,使用了chaosblade进行了阻塞超时场景的故障植入,具体过程如下:

./blade prepare jvm --process 31106

./blade create dubbo delay --time 3000 --service cn.xxx.xxx.api.intf.KuntaAuth --methodname queryConsumeAbility --consumer --process 31106

./blade destroy ec695fee1e458fc6 
  • 植入超时故障后,现象如下:
    1.dubbo filter中拿到超时异常,熔断器【Sentinel】开始计数;
    2.达到配置的阈值后,走降级逻辑,如返回固定结果或切换到其他类型的数据源等操作;

jvm工具还支持其他操作,如方法执行延迟,抛异常等操作,可以模拟植入更多的异常场景,不再赘述。对增强原理感兴趣的同学,可参考jvm-sandbox中的源码。