-
Notifications
You must be signed in to change notification settings - Fork 25
开发者指南
本篇介绍 chaosblade
与 chaosblade-exec-cplus
之间通信接口 API,此 API 遵循《混沌实验模型》。
chaosblade-exec-cplus
实现了 create
和 destroy
两个接口,分别是创建混沌实验以及销毁停止实验,以下我们 给大家介绍一个 C++ 应用混沌实验 DEMO。
chaosblade-exec-cplus
基于springboot
内置的 tomcat server 实现请求处理。
这次实验,我们演练 linux 系统下 C++ 实现的 socket server
应用和 socket client
应用通讯的过程中,socket server
接口延迟 3 秒。接下来我们下载所需要的 Socket Demo:
下载完成后,解压并编译:
g++ -g -c tcp_server.cpp -o tcp_server.o
g++ -g tcp_server.o main.cpp -I. -o server
下载完成后,解压并编译:
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
要遵循《混沌实验模型》 实现,并且实现 create
和 destory
两个实验操作。