9C2.记录和重放请求
原创实战copy大约 2 分钟
9C2.记录和重放请求
在正式环境下,需求对某些http请求进行记录和重放。 简单易行的策略有,Nginx的mirror复制到GoReplay或wiremock。
参考资料如下,本手册以mirror微信请求到mocklab云服务和Gor本地服务为例
9C2.1.mocklab服务
使用github申请free账号,获得Mock APIs的URL和Token,如 Settings/Usage examples中的curl例子中有相应字段,如下特征,
- https://xxxx.mocklab.io/
- Token 14ef56fxxxx24fba5
最后,可以在 Request Log 中获得所有请求,并Convert to stub以便测试使用。
9C2.2.gor本地服务
wget https://github.com/buger/goreplay/releases/download/1.3.3/gor_1.3.3_x64.tar.gz
tar -xzf gor_1.3.3_x64.tar.gz
# 开启并监听 18081,若是attach到其他服务端口,则不需要http-pprof
tee gor.sh << "EOF"
#!/bin/bash
gor_file=weixin-%Y%m%d.gor
cur_file=$(date +$gor_file)
test -f "$cur_file" && mv $cur_file $cur_file.$(date +%H%M%S)
./gor --http-pprof :18081 \
--input-raw :18081 \
--output-file $gor_file \
--output-file-append
EOF
chmod +x gor.sh
sudo nohup ./gor.sh &
# test
curl http://127.0.0.1:18081/debug/pprof/
注意,gor 2.0目前还在rc阶段,1.3实测中存在一些问题,比如保存文件时 https://github.com/buger/goreplay/blob/master/output_file.go
- output-file-append无效,重启gor时会覆盖gor文件,需要注意备份
- output-file 不会自动flush,只能buff满或关闭gor
- 若需要实时观测,建议使用 output-stdout
9C2.3.nginx的mirror
The ngx_http_mirror_module module (1.13.4) implements mirroring of an original request by creating background mirror subrequests. Responses to mirror subrequests are ignored.
location /weixin/geteway.api {
mirror /__mirror_mock;
mirror /__mirror_gor;
proxy_pass http://xxxx;
}
location = /__mirror_mock {
internal;
resolver 8.8.8.8;
proxy_pass https://xxx.mocklab.io$request_uri;
proxy_set_header Authorization "Token 14exxxxxxxba5";
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-Host $host;
}
location = /__mirror_gor {
internal;
proxy_pass http://127.0.0.1:18081$request_uri;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-Host $host;
}
9C2.4.使用建议
gor和mocklab设置其一即可,根据情况取舍,dev环境建议mocklab,便于生成test。
若mirror没有转发,可观测nginx error日志,上例中的resolver 8.8.8.8
解决以下问题,
no resolver defined to resolve xxx.mocklab.io, request: "POST ..."