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

- 在本團隊內,此工具目前的實踐場景如下:
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中的源碼。