Skip to content

开发者指南

周鹏飞 edited this page Nov 14, 2019 · 2 revisions

本篇介绍 chaosblade 与 chaosblade-exec-cplus 之间通信接口 API,此 API 遵循《混沌实验模型》。

接口定义

chaosblade-exec-cplus 实现了 create 和 destroy 两个接口,分别是创建混沌实验以及销毁停止实验,以下我们 给大家介绍一个 C++ 应用混沌实验 DEMO。 chaosblade-exec-cplus 基于springboot 内置的 tomcat server 实现请求处理。

C++ 应用混沌实验 DEMO

这次实验,我们演练 linux 系统下 C++ 实现的 socket server 应用和 socket client 应用通讯的过程中,socket server 接口延迟 3 秒。接下来我们下载所需要的 Socket Demo:

Socket-server.tar.gz

下载完成后,解压并编译:

g++ -g -c tcp_server.cpp -o tcp_server.o

g++ -g tcp_server.o main.cpp -I. -o server



Socket-client.tar.gz

下载完成后,解压并编译:

g++ -g -c tcp_client.cpp -o tcp_client.o

g++ -g tcp_client.o main.cpp -I. -o client

启动 socket server

./server 9527

启动 socket client:

./client 127.0.0.1 9527

启动成功以后会提示: send message to server:

接下来输入想传给 socket server 内容比如: 666

socket server 应用收到消息以后提示:

Before print: 2019-07-25 10:03:16

Received a connection from 127.0.0.1

After print: 2019-07-25 10:03:16

Received message: 666

完成以上步骤表示 socket server 应用和 socket client 应用部署成功。

另外,之所在 Received a connection from 127.0.0.1 前后打印时间,是因为之后的实验 demo 会在程序执行到 Received a connection from 127.0.0.1 前模拟延迟故障,此处打印前后执行时间便于观察实验效果。

接下来我们要使用 blade 工具进行混沌实验,在执行实验前,我们需要先执行 prepare 命令,挂载所需要的 c++ agent:

./blade p cplus --port 8370 --script-location=/home/staragent/plugins/monkeyking/chaosblade/lib/cplus/ --wait-time 10

返回以下结果,表示实验准备成功:

{"code":200,"success":true,"result":"e669d57f079a00cc"}

我们开始实施混沌实验,调用 socket server 接口延迟 3 秒,我们执行以下命令:

./blade c cplus delay --delayDuration 3 --breakLine tcp_server.cpp:33 --fileLocateAndName /home/admin/socketServer/server --forkMode parent --processName /home/admin/socketServer/server --initParams 9527 --libLoad ""

or:

./blade c cplus delay --delayDuration 3 --breakLine tcp_server.cpp:33 --fileLocateAndName /home/admin/socketServer/server --forkMode parent --processName /home/admin/socketServer/server --initParams 9527

返回以下结果,表示执行成功;

{"code":200,"success":true,"result":"ec695fee1e458fc6"}

可以在停止混沌实验后,在日志中查看延迟效果,日志地址:

{user.home}/logs/chaosblade/chaosblade_cplus.log

对实施实验的命令进行解析:

  • --delayDuration: 3,表示延迟 3 s;单位是 s (delay action 特有的过滤条件)
  • --breakLine: tcp_server.cpp:33, 加入断点的位置,可以是某一行,也可以是某个方法名 (对应混沌实验模型的 Matcher:实验规则匹配器)
  • --fileLocateAndName: /home/admin/socketServer/server,C++应用可执行文件的位置和名字 (对应混沌实验模型的 Matcher:实验规则匹配器)
  • --forkMode: child(或者:parent),表示我们把故障注入到子进程还是父进程 (对应混沌实验模型的 Matcher:实验规则匹配器)
  • --processName: server(或者 /home/admin/socketServer/server),可以唯一标识出C++应用进程的标识,比如进程名 (对应混沌实验模型的 Matcher:实验规则匹配器)
  • --initParams: 9527,C++ 进程正常启动的时候,启动命令中执行文件后面的参数 (对应混沌实验模型的 Matcher:实验规则匹配器)
  • --libLoad: "",如果启动C++ 进程的时候如果需要设置类库文件夹地址,可以在这里设置(比如 /home/lib),如果启动时,不需要加载自定义类库,该项可以填入空格,或者忽略这个参数 (对应混沌实验模型的 Matcher:实验规则匹配器)

另一种调用方式是通过发url 请求: chaosblade/create?suid=e669d57f079a00cc&target=cplus&action=delay&breakLine=tcp_server.cpp:33&fileLocateAndName=/home/admin/socketServer/server&forkMode=parent&processName=/home/admin/socketServer/server&delayDuration=3&initParams=9527&libLoad=

其中请求参数为

{
	"suid": "e669d57f079a00cc",
	"target": "cplus",
	"action": "delay",
	"breakLine": "tcp_server.cpp:33",
	"fileLocateAndName": "/home/admin/socketServer/server",
	"forkMode": "parent",
	"processName": "/home/admin/socketServer/server",
	"delayDuration": “3”,
	"initParams": "9527",
	"libLoad": ""
}

这种方式增加了几个参数,解析如下:

  • create: 创建混沌实验请求
  • suid: 请求参数,实验的 ID,后续停止实验会用到此 ID
  • target: 请求参数,实验的组件目标,cplus 代表 针对 C++ 应用的实验
  • action: 请求参数,执行实验的场景,delay

注:

  • suid、target、action 是 create 请求的必要参数, breakLine、fileLocateAndName、forkMode、processName、delayDuration、initParams、libLoad 参数根据 target 和 action 的不同而不同。
  • 接收到请求,会根据 target 和 action 调用参数校验器,验证参数值是否合法,如果合法,则记录此次试验;
  • 对应组件埋点触发时,如果查询到有此组件的实验,则获取匹配器所需参数,和下发的实验规则进行匹配,匹配成功,则调用场景执行器触发实验。

停止当前延迟的混沌实验,再次访问 url 验证是否恢复正常:

./blade destroy ec695fee1e458fc6

另一种调用方式是通过发url 请求: chaosblade/destroy?suid=ec695fee1e458fc6

其中请求参数是:

{
    "suid": "ec695fee1e458fc6"
}
  • suid: 请求参数,之前创建实验返回的 UID 注: 接收到 destroy 请求后,会删除与 UID 相对应的混沌实验规则。

不尽兴的话,我们再实施对 server 内部变量的修改,把 server 对外开放的监听端口 9527 改成 9529。

和刚才延迟命令参数差不多,因为相同的参数是演练 C++ 应用所需要的,不同的是没有了 --delayDuration,多了个 --varaibleName--varaibleValue 参数。 我们模拟调用刚才的服务对外开放的监听端口 9527 改成 9529:

./blade c cplus modify --varaibleName listen_port --varaibleValue 9529 --breakLine tcp_server.cpp:11 --fileLocateAndName /home/admin/socketServer/server --forkMode child --processName /home/admin/socketServer/server --initParams 9527 --libLoad /home/lib

or:

./blade c cplus modify --varaibleName listen_port --varaibleValue 9529 --breakLine tcp_server.cpp:11 --fileLocateAndName /home/admin/socketServer/server --forkMode child --processName /home/admin/socketServer/server --initParams 9527

返回以下结果,并在 socket client 可验证端口是否被修改。

{"code":200,"success":true,"result":"09dd96f4c062df69"}

停止此次试验:

./blade destroy 09dd96f4c062df69 

最后,我们撤销刚才的实验准备,即卸载 c++ Agent:

./blade revoke e669d57f079a00cc

想基于 chaosblade 扩展其他语言应用故障注入的能力

要遵循《混沌实验模型》 实现,并且实现 create 和 destory 两个实验操作。