Goreplay来做流量回放

最近做项目,用到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不起作用

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/299165.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

“Python简直万能!”拜托快醒醒!

全世界只有3.14 % 的人关注了爆炸吧知识在程序员中&#xff0c;一直流传着“Python除了不会生孩子&#xff0c;什么都会”的传说&#xff0c;Python真的是万能语言&#xff1f;很多使用Python的小伙伴&#xff0c;坚信 Python 可以做任何事情。到底是不是真的如传说中那般万能&…

linux--web服务器

WEB服务器也称为WWW(WORLD WIDE WEB)服务器&#xff0c;主要功能是提供网上信息浏览服务。 WWW 是 Internet的多媒体信息查询工具&#xff0c;是 Internet 上近年才发展起来的服务&#xff0c;也是发展最快和目前用的最广泛的服务。1.rpm -qa|grep httpd 查询服务是否安装…

WPF轮播图实现方式

WPF开发者QQ群&#xff1a; 340500857 | 微信群 -> 进入公众号主页 加入组织欢迎转发、分享、点赞、在看&#xff0c;谢谢~。 01—效果预览效果预览&#xff08;更多效果请下载源码体验&#xff09;&#xff1a;02—代码如下一、MasterCarousel.cs 代码如下using System; …

学过物理的人才能看懂的笑话,你能看明白几个?

全世界只有3.14 % 的人关注了爆炸吧知识1丈夫买了几斤廉价藕&#xff0c;满以为可对妻子炫耀了。不料妻子破口大骂&#xff1a;笨蛋&#xff01;为何不买别的菜&#xff0c;这藕一斤少说也有半斤窟窿啊&#xff01;还说便宜&#xff1f;2第一次坐飞机的两位老妇人在飞机起飞前找…

cisco 双ISP线路接入,链路自动切换方案

最近接到的一个项目&#xff0c;客户总部在惠州&#xff0c;分部在香港&#xff0c;在香港分部设有ERP服务器与邮件服务器&#xff0c;总部出口为铁通10M光纤与网通1M DDN 专线&#xff08;新增&#xff09;&#xff0c;原总部是用netscreen 防火墙与香港的pix 515作IPsec 对接…

js遮罩层以及移动端的上拉框

今天发一个之前写的移动端的项目&#xff0c;主要是讲一下遮罩层的应用&#xff0c;以及顺带提一下移动开发的一些事情。首先按钮点击弹出遮罩层这个大家很熟悉了&#xff0c;这里还是给大家提供一份代码&#xff0c;跟通用的没太大区别&#xff0c;主要讲一下方法&#xff1a;…

精简ABP的模块依赖

ABP的模块非常方便我们扩展自己的或使用ABP提供的模块功能&#xff0c;对于ABP自身提供的模块间的依赖关系想一探究竟&#xff0c;并且试着把不必要的模块拆掉&#xff0c;找到那部分核心模块。本次使用的是AspNetBoilerplate。源码下载从Github下载ABP源码后&#xff0c;进入s…

你这飞机会爆炸吗?航空公司含泪甩卖49元机票,却被超模君挖出秘密!

全世界只有3.14 % 的人关注了爆炸吧知识制作团队制作人 超模君编剧 恐恐恐插画 杨羊羊 友情出演 超模君 章小天……小天吐槽时刻……超模君之后还会采访谁呢小天有小道消息哦扫描这个二维码你将会有机会见识到超模君的科普沙雕网友们一起斗图↓↓↓↓…

linux nginx mysql php 5.5._搭建基于Linux6.3+Nginx1.2+PHP5+MySQL5.5的Web服务器全过程

之前的Web服务器都是通过yum搭建的&#xff0c;想要添加新模块或者更新某些软件都很不方便(牵一发而动全身啊&#xff01;)。所以&#xff0c;现在准备将环境改为源码编译安装&#xff0c;这样便于调整&#xff0c;性能上也会比yum方式好很多。以下是我的安装步骤&#xff0c;我…

ASP 缩略图 (纠错版)

网上很多缩略的代码&#xff0c;不过很多都是错误的。 这个是纠正版&#xff0c;本人已修改。 Code<%Function PicReSize(picURL)FileName1Mid(picURL,13,22)Set Jpeg Server.CreateObject("Persits.Jpeg") 获取源图片路径Path Server.MapPath(picURL) 打开源图…

Blazor Server 应用程序中进行 HTTP 请求

翻译自 Waqas Anwar 2021年5月4日的文章 《Making HTTP Requests in Blazor Server Apps》 [1]Blazor Server 应用使用标准的 ASP.NET Core 应用程序&#xff0c;在服务端执行 .NET 代码。在 Blazor Server 应用程序中&#xff0c;我们可以像在 ASP.NET Core Web 应用程序中那样…

遍历属性动态展示列

为什么80%的码农都做不了架构师&#xff1f;>>> 前端根据后台返回json对象(Map)进行动态列展示。 javascript属性遍历和访问&#xff1a; //var obj {name:"h2do",age:0,sex:"男"}; function User(){this.name "h2do";this.age 0…

厉害了!这几位小学生竟然在艺术界掀起一阵风暴,简直是灵魂画手无疑.........

全世界只有3.14 % 的人关注了爆炸吧知识高能预警&#xff01;请查阅全文&#xff01;在孩子们的眼中&#xff0c;世间万物都被赋予了无限的想象力&#xff0c;而绘画是他们独特想法和思维的表达。一支小小的画笔&#xff0c;便能创造一个千奇百怪的世界。为鼓励孩子们拿起画笔&…

花开的声音 - 张靓颖

姓名&#xff1a;张靓颖 / Jane Zhang性别&#xff1a;女 地区&#xff1a;内地 职业&#xff1a;歌手 星座&#xff1a;天秤座 血型&#xff1a;O 身高&#xff1a;162cm张靓颖&#xff0c;中国女歌手&#xff0c;四川成都人。2005年参加湖南卫视…

基于事件驱动架构构建微服务第5部分:容器化(Web Api Core 和 SQL Server Linux)

原文链接&#xff1a;https://logcorner.com/building-microservices-through-event-driven-architecture-part5-dockerization-web-api-core-and-sql-server-linux/在本文中&#xff0c;我将谈谈web api和sql server linux数据库的容器化Web API将发布并上线&#xff0c;它需要…

爆笑!物理书上的照片能不能好好选选啊喂!

全世界只有3.14 % 的人关注了爆炸吧知识在物理书里&#xff0c;有各种物理大佬的照片。他们正襟危坐&#xff0c;他们不苟言笑&#xff0c;他们看起来就很“物理”。但是&#xff0c;知识君想说&#xff0c;谁不是个有血有肉的人啊&#xff1f;&#xff01;选照片的时候给我好好…

计算机网络体系结构概述

1.Internet结构 2.计算机网络的体系结构 1&#xff09;网路协议主要由以下三要素组成&#xff1a; 语法&#xff0c;即数据与控制信息的结构或格式&#xff1b; 语义&#xff0c;即需要发出何种控制信息&#xff0c;完成何种动作以及做出何种响应&#xff1b; 同步&#xff0c;…

.NET 6 全新指标 System.Diagnostics.Metrics 介绍

前言工友们, .NET 6 Preview 7 已经在8月10号发布了, 除了众多的功能更新和性能改进之外, 在 preview 7 版本中, 也新增了全新的指标API, System.Diagnostics.Metrics, 为了让应用能有更好的可观测性, 在之前的发布的.NET 5中, 也把 Activity 增强为 ActivitySource, 主要原因还…

42张动图带你走进神奇的物理世界,超震撼!

全世界只有3.14 % 的人关注了爆炸吧知识世界之大&#xff0c;无奇不有。生活中其实有许多神奇的物理化学现象。下面就一起来看看吧&#xff01;图片加载慢稍加等待即可哦~神 奇 的 物 理 反 应1.锤击被液氮冻上的康乃馨&#xff0c;求康乃馨的心理阴影面积。2.比重比空气还大的…

Linux优化之IO子系统监控与调优

Linux优化之IO子系统作为服务器主机来讲&#xff0c;最大的两个IO类型 &#xff1a;1.磁盘IO 2.网络IO这是我们调整最多的两个部分所在磁盘IO是如何实现的在内存调优中&#xff0c;一直在讲到为了加速性能&#xff0c;linux内核一般情况下都会尝试将磁盘上的慢速设备上的文件缓…