最近做项目,用到goreplay来做流量回放,什么是goreplay?

GoReplay is an open-source network monitoring tool which can record your live traffic, and use it for shadowing, load testing, monitoring and detailed analysis.

本质上就是通过监控网络,录制http请求信息(对应用无入侵),然后再把请求重新播放出来。

这是官方给出来运行原理图。

关于goreplay的使用方式,命令用法官方文档给的很全面了,不作赘述,本篇文章关注的是除杂(过滤)。官方本来是支持过滤filtering的,但过滤的范围有限,目前只有Allow url regexp,Disallow url regexp,Filter based on regexp of header,Filter based on HTTP method,也就是对url,header,method三个方向作了过滤,我的需求是对body过滤,不包括在范围内(也有可能我没找到对应文档

官方找不到对应办法,只能“曲线救国”了,因为goreplay录制的内容是文本性质,所以可以对录制内容下手,把自己认定的杂质除掉,然后再播放,这样就达到效果了。

录制:

我是在windows下demo的,所以下载goreplay的winodwst版本【https://github.com/buger/goreplay/releases/download/v1.3.2/gor-1.3.2_windows.zip】,同时还需要安装WinPcap配合【https://www.winpcap.org/install/bin/WinPcap_4_1_3.exe】,这样就可以通过命令进行录制了:

gor --input-raw :5000 --output-file request.gor

被录制的服务是一个api,实现如下

[HttpPost("/order")]
public IActionResult Post([FromBody] Order order)
{_logger.LogInformation(System.Text.Json.JsonSerializer.Serialize(order));order.Status = 200;return new JsonResult(order);
}public class Order
{public string Code { get; set; }public decimal Amount { get; set; }public int Status { get; set; }
}

gorreplay录制的内容格式如下:

1 c9051388c0a8000437c39d7f 1629555358511143000 0
POST /pay HTTP/1.1
Content-Type: application/json
User-Agent: PostmanRuntime/7.28.3
Accept: */*
Postman-Token: 3a49aba0-2e9b-4f1d-8fc8-01fb8b15d620
Host: 192.168.0.7:5000
Accept-Encoding: gzip, deflate, br
Connection: keep-alive
Content-Length: 92{"code":"3a13abfe-d9cb-4e11-ba90-738e93d2cb07","amount":908.59,"status":552
}
????????????
1 c9051388c0a8000437c39d7f 1629555358813757000 0
POST /pay HTTP/1.1
Content-Type: application/json
User-Agent: PostmanRuntime/7.28.3
Accept: */*
Postman-Token: 3a49aba0-2e9b-4f1d-8fc8-01fb8b15d620
Host: 192.168.0.7:5000
Accept-Encoding: gzip, deflate, br
Connection: keep-alive
Content-Length: 92{"code":"3a13abfe-d9cb-4e11-ba90-738e93d2cb07","amount":908.59,"status":552
}
????????????

除杂

文中的json就是我请求的body,就要依据这个json中的一些数据来除杂,所以就得写段代码解决这个事情。

其实原理很简单,因为我知道我请求的都是json,所以就是从录制的文件中,按段切割,很明细就是三只猴子????????????为分割点,把内容中的json查询出来,然后运用上规则引擎达到过滤作用,把符合条件的数据留下,不符合条件的数据就除杂,最后保存成一个新文件,供流量回放时使用。

规则引擎

桂素伟,公众号:桂迹一个简单的规则引擎例子

步骤确定了,下面是代码:

using RulesEngine;
using RulesEngine.Models;
using RulesEngine.Extensions;
using System.IO;
using System.Text;
using System.Text.RegularExpressions;
using Newtonsoft.Json.Converters;
using Newtonsoft.Json;
using System.Dynamic;var path = @"C:\MyFile\Source\Repos\Asp.NetCoreExperiment\Asp.NetCoreExperiment\GoReplay\GoReplayDemo01\request_0.gor";
var expression = "input1.amount >= 900.00";
await ImpurityRemoval(path, expression);/// <summary>
/// 除杂方法,会重新生成一个带有日期时间的新.gor文件
/// </summary>
static async Task ImpurityRemoval(string path, string expression)
{using var readFile = new StreamReader(path, Encoding.UTF8);using var writeFile = new StreamWriter(@$"{path.Replace(Path.GetFileName(path), Path.GetFileNameWithoutExtension(path) + "_" + DateTime.Now.ToString("yyyyMMddHHmmss") + Path.GetExtension(path))}", true, Encoding.UTF8);var split = "????????????";string? line;var request = new StringBuilder();while ((line = await readFile.ReadLineAsync()) != null){if (line != split){request.Append(line + "\n");}else{request.Append(line + "\n");var list = GetJson(request.ToString());foreach (var item in list){var converter = new ExpandoObjectConverter();var entity = JsonConvert.DeserializeObject<ExpandoObject>(item, converter);if (await Filter(entity, expression)){await writeFile.WriteAsync(request.ToString());}}request.Clear();}}
}
/// <summary>
/// 获取json,这里没有完全测试
/// </summary>
static List<string> GetJson(string jsonString)
{var pattern = @"\{(.|\s)*\}";var list = new List<string>();var matches = Regex.Matches(jsonString, pattern, RegexOptions.IgnoreCase);foreach (Match m in matches){list.Add(m.Value);}return list;
}
/// <summary>
/// 用规则引擎匹配过滤规则
/// </summary>
static async Task<bool> Filter(dynamic? entity, string expression)
{var workRules = new WorkflowRules();workRules.WorkflowName = "ImpurityRemoval";workRules.Rules = new List<Rule>{new Rule{RuleName="ImpurityRemoval01",SuccessEvent= "10",RuleExpressionType= RuleExpressionType.LambdaExpression,Expression= expression,          }};var rulesEngine = new RulesEngine.RulesEngine(new WorkflowRules[] { workRules });List<RuleResultTree> resultList = await rulesEngine.ExecuteAllRulesAsync("ImpurityRemoval", entity);var result = false;resultList.OnSuccess((eventName) =>{result = true;});return result;
}

回放

gor --input-file=request_0_20210821234723.gor --output-http="http://localhost:5000"

注意事项:

  1. 在录制的时候本机请求不进行录制,需要外部访问api

  2. 在除杂过程中,重新生成gor文件时,换行一定要UNIX(LF),不要是Windows(CRLF),说人话就是生成文件的换行用\n,不要\r\n,否则回放时goreplay不起作用

Goreplay来做流量回放相关推荐

  1. 流量回放工具:goreplay实战

    相信做性能测试的小伙伴们一定听说过流量复制回放,没听说过也没关系,我们大都是在性能测试环境完成压测任务出具性能测试报告, 但是实际生产环境的接口压力流量往往和我们在性能测试环境预估的情况不完全一致,甚 ...

  2. 流量回放工具之 Goreplay 安装及初级使用

    文章目录 一.Goreplay 介绍 二.Golang环境安装 三.Goreplay 安装 四.Goreplay 使用示例 1.准备 RESTful API 环境 2.捕获服务器一流量保存到本地文件 ...

  3. 自动化测试之流量回放技术

    流量回放近几年一直是大家热衷讨论的话题,具体的效果智者见智.文章作者也是在技术工程领域有丰富的实践经验,推荐一看. 本篇背景是另外一同事朋友,最近在利用流量回放技术应用在服务端接口自动化测试方面,还在 ...

  4. diff测试与流量回放测试

    一.Diffy 简单来理解,Diffy是一个开源的自动化测试工具,是一种自动Diff测试技术.它能够自动检测基于Apache Thrift或者基于HTTP的服务.通过同时运行新/老代码,对比运行结果, ...

  5. java化测试神器-流量回放平台

    # java化测试神器-流量回放平台 作者:佳晖,荣荣 文章结构 基本介绍 使用流程 实现方案 总结 基本介绍 背景 目前公司正在进行php java化迁移工作. Java化测试本质上是一次回归工作. ...

  6. 流量回放:保证业务技术升级的神器

    流量回放:将某个时间段的对A的所有请求,通过某种手段录制下来,然后在B应用上重新请求,这个过程为流量回放. 流量回放可以做什么 可以做真实数据的覆盖测试 可以做流量压测 RPC怎么做支持流量回放 所有 ...

  7. 流量回放开源代码Java_流量回放原理

    流量回放是通过日志采集再处理来获取所需要的数据 日志采集 通过logstash工具从应用容器拉取日志信息,可以根据filter.tags来筛选 数据传输 通过kafka等消息队列将获取的日志数据传输进 ...

  8. 海量流量下,淘宝如何进行稳定的流量回放?

    作者|张天博(搏天) 出品|阿里巴巴新零售淘系技术部 导读:随着业务的不断发展, 整个淘系的服务端已经有数千个应用,在淘宝已经有非常大的应用数量和变更次数的基础上, 对流量回放也有更高的要求.那么在不 ...

  9. 哔哩哔哩「会员购」在流量回放上的探索

    作者 沈佳伟 哔哩哔哩会员购架构师 背景 「哔哩哔哩会员购」是B站的电商业务.随着业务规模不断扩大,系统设计也越来越复杂.当在具有一定应用规模和业务复杂度的系统上进行业务快速迭代时对系统的鲁棒性,兼容 ...

最新文章

  1. TF版本升级问题:成功解决AttributeError: module tensorflow has no attribute mul
  2. jni java共享变量_Android JNI开发系列(十)JNI访问 Java 实例变量和静态变量
  3. 用MDT 2012为企业部署windows 7(十一)--抓取标准模板机镜像
  4. mysql extis_SQL -- 联接查询,子查询,Extis 效率浅析
  5. UVA - 11214Guarding the Chessboard守卫棋盘(迭代加深搜索)
  6. 适合 Kubernetes 初学者的一些实战练习(一)
  7. 第一个正式的python版本_LeetCode | 0278. First Bad Version第一个错误的版本【Python】...
  8. php7 on winxp 支持的模块
  9. ubuntu 14.04 下 安装samba 及SSH 服务端的方法
  10. python小程序100题-Python 练习册,每天一个小程序 -- 0000题
  11. iPhone 11 128G 抱回家!
  12. 机器学习-线性回归scikit-learn
  13. 邪恶力量第一至九季/全集Supernatural迅雷下载
  14. opengl 4.5离线文档下载
  15. idea谷歌翻译插件translation失效问题(可行)
  16. VS2008 安装时 出现 “加载安装组件时出现问题,取消安装” 的解决方法
  17. php中怎么合并单元格,phpword合并单元格
  18. 域名被微信/QQ红了(被封锁、被屏蔽、被和谐)后最好的解决方法
  19. OpenStack创建卷报错
  20. iso 国家名称列表

热门文章

  1. mysql 怎么实现随机查询并分页,不重复查询
  2. 关于tcmalloc\malloc和new
  3. C#后台,执行前台js 脚本
  4. 自动以及手动清除手机垃圾文件
  5. CentOS5安装Nginx1.4+PHP5.5 FastCGI
  6. Atlas Unknown Error
  7. linux下的SSHD被连接端口修改
  8. netty实现客户端服务端心跳重连
  9. 在Xshell 6开NumLock时按小键盘上的数字键并不能输入数字
  10. 《C prime plus (第五版)》 ---第11章 字符串和字符串函数---4