ChaosBlade实践【version-0.0.1】
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的一些增强,具体原理和设计思想可以查看:
1.chaosblade-exec-jvm:https://github.com/chaosblade-io/chaosblade-exec-jvm 【based on jvm-sandbox】
2.jvm-sandbox:https://github.com/alibaba/jvm-sandbox
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中的源码。