流量回放工具

news2024/11/20 10:33:00

作用


在评估某个服务可用性时,一种常见方式是采用一些压测工具(如ab/hey/jmeter/siege/wrk/locust等)压测某几个核心接口,一般看达到某个TPS/QPS时,CPU/内存等资源的水位;或者固定资源的阈值,看最高能达到的TPS/QPS。

但这样有一个问题: 对于线上服务,真实用户的请求是复杂的,如请求的接口顺序,带的参数。这很可能会影响服务真实的可用性。(如某个接口A请求方法B,在B中有一段逻辑,带的参数恰好满足时,会触发清空全部缓存,加锁等,仅仅压测某几个核心接口,对于服务稳定性的评估,是不够全面的)。

自然而然的想法是希望能mock用户真实的请求,最好还可以同比例放大。


社区已经有不少这样的流量回放工具,比较知名的有 goreplay[1],以及滴滴的sharingan[2]。 从star数量和活跃程度上说,前者可以说稳压后者。下面以goreplay为例,演示该工具的使用。

goreplay不仅支持流量的实时放大,同时也可以缩小,进行频控等。同时也可以把请求写到到文件,进行非实时的回放和分析。

alt

(图片来自 官方仓库readme.md[3])

注: 虽然此工具用Go开发,但无需与线上项目做集成,而是作为工具,独立于用户项目之外。故而不关心用户的技术栈,Java,Python,Rust等开发的web服务,同样可用此做流量回放。




使用


官方已经有编译好的二进制包(名为gor),无需使用者再通过源码编译。可点击 https://github.com/buger/goreplay/releases 根据相应系统下载所需版本。

另外,gor需要依赖libpcap,如果没有需要安装。不同系统的安装方式有所差异。

libpcap(Packet Capture Library)是一个用于网络数据包捕获的库。其提供了一组函数和工具,用于在计算机网络上捕获数据包并进行分析。libpcap 可以从网络接口(例如以太网、Wi-Fi)上捕获数据包,并提供了对数据包的访问、过滤、存储和分析的功能。

常用于网络监控、网络安全、网络调试和网络分析等领域。一些常见的用途包括:

  1. 网络流量分析:通过捕获网络数据包,分析网络流量的来源、目的、协议、负载等信息,以便进行网络性能优化、故障排除和安全分析。

  2. 网络安全和入侵检测:通过捕获网络数据包,检测和分析潜在的网络攻击、恶意行为和异常流量,以保护网络的安全。

  3. 网络协议开发和测试:用于开发和测试网络协议的实现,验证协议的正确性和性能。

  4. 网络流量重放和模拟:通过捕获的数据包,重放网络流量,模拟真实的网络环境,用于测试和评估网络应用、设备和系统的性能和稳定性。


以下是用 Rust Actix Web框架开发的一个简单Web服务,定义两个接口,模拟分别处理不同业务。

use actix_web::{get, web, App, HttpServer, Responder};

#[get("/hello/{name}")]
async fn greet(name: web::Path<String>) -> impl Responder {
    println!("这是接口a,开始进行各种复杂逻辑");
    format!("Hello {name}!")
}

#[get("/clear/{name}")]
async fn clear(name: web::Path<String>) -> impl Responder {
    println!("这是接口b,清空全部缓存");
    format!("Clear {name}!")
}


#[actix_web::main] // or #[tokio::main]
async fn main() -> std::io::Result<()> {
    HttpServer::new(|| {
        App::new()
        .service(greet)
        .service(clear)
    })
    .bind(("127.0.0.1"8080))?
    .run()
    .await
}

Cargo.toml为:

[package]
name = "web-active"
version = "0.1.0"
edition = "2021"

# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html

[dependencies]
actix-web = "4.4.0"

执行cargo run

请求 http://127.0.0.1:8080/hello/zhangsan

alt
alt

请求 http://127.0.0.1:8080/clear/cache1

alt
alt

执行 sudo gor --input-raw :8080 --output-file=my-service-request.gor

请求三次 http://127.0.0.1:8080/hello/zhangsan,两次http://127.0.0.1:8080/clear/cache1

alt
alt

停止gor,发现当前目录下多了一个my-service-request_0.gor,这就是gor借助libpcap所录制的请求文件。

alt

文件内容如下,cat my-service-request_0.gor:

1 f9e91f907f000001b4a53843 1697625311455924000 0
GET /hello/zhangsan HTTP/1.1
Host: 127.0.0.1:8080
Connection: keep-alive
Cache-Control: max-age=0
sec-ch-ua: "Google Chrome";v="117", "Not;A=Brand";v="8", "Chromium";v="117"
sec-ch-ua-mobile: ?0
sec-ch-ua-platform: "macOS"
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/117.0.0.0 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7
Sec-Fetch-Site: none
Sec-Fetch-Mode: navigate
Sec-Fetch-User: ?1
Sec-Fetch-Dest: document
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8,ca;q=0.7


🐵🙈🙉
1 f9f71f907f00000127af03b3 1697625311456071000 0
GET /hello/zhangsan HTTP/1.1
Host: 127.0.0.1:8080
Connection: keep-alive
Cache-Control: max-age=0
sec-ch-ua: "Google Chrome";v="117", "Not;A=Brand";v="8", "Chromium";v="117"
sec-ch-ua-mobile: ?0
sec-ch-ua-platform: "macOS"
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/117.0.0.0 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7
Sec-Fetch-Site: none
Sec-Fetch-Mode: navigate
Sec-Fetch-User: ?1
Sec-Fetch-Dest: document
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8,ca;q=0.7


🐵🙈🙉
1 f9f71f907f00000127af0437 1697625312448706000 0
GET /hello/zhangsan HTTP/1.1
Host: 127.0.0.1:8080
Connection: keep-alive
Cache-Control: max-age=0
sec-ch-ua: "Google Chrome";v="117", "Not;A=Brand";v="8", "Chromium";v="117"
sec-ch-ua-mobile: ?0
sec-ch-ua-platform: "macOS"
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/117.0.0.0 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7
Sec-Fetch-Site: none
Sec-Fetch-Mode: navigate
Sec-Fetch-User: ?1
Sec-Fetch-Dest: document
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8,ca;q=0.7


🐵🙈🙉
1 f9f71f907f00000127af04bb 1697625315970845000 0
GET /clear/cache1 HTTP/1.1
Host: 127.0.0.1:8080
Connection: keep-alive
Cache-Control: max-age=0
sec-ch-ua: "Google Chrome";v="117", "Not;A=Brand";v="8", "Chromium";v="117"
sec-ch-ua-mobile: ?0
sec-ch-ua-platform: "macOS"
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/117.0.0.0 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7
Sec-Fetch-Site: none
Sec-Fetch-Mode: navigate
Sec-Fetch-User: ?1
Sec-Fetch-Dest: document
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8,ca;q=0.7


🐵🙈🙉
1 f9f71f907f00000127af053d 1697625317366548000 0
GET /clear/cache1 HTTP/1.1
Host: 127.0.0.1:8080
Connection: keep-alive
Cache-Control: max-age=0
sec-ch-ua: "Google Chrome";v="117", "Not;A=Brand";v="8", "Chromium";v="117"
sec-ch-ua-mobile: ?0
sec-ch-ua-platform: "macOS"
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/117.0.0.0 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7
Sec-Fetch-Site: none
Sec-Fetch-Mode: navigate
Sec-Fetch-User: ?1
Sec-Fetch-Dest: document
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8,ca;q=0.7


🐵🙈🙉

停止监听8080端口的rust服务,新起一个监听9999端口的服务 (模拟用于承接流量回放请求的服务,一般可能是低峰期的线上服务地址,或者是预发地址/压测地址)

然后执行 gor --input-file my-service-request_0.gor --output-http="http://127.0.0.1:9999"

alt

这是通过文件的方式,延后回放流量。goreplay也支持实时流量回放:

sudo gor --input-raw :8080 --output-http="http://可以是一个公网ip:相应端口"

如果output后面的参数改为stdout,即 sudo gor --input-raw :8080 --output-stdout 则为实时将请求输出到终端


另外,还可以使用流量放大功能进行压测,将流量转发到多个节点,基于Header或Url参数,或基于GET/POST等进行限制等。

更多可选参数及用法可参考官方文档[4]

参考资料

[1]

goreplay: https://github.com/buger/goreplay

[2]

sharingan: https://github.com/didi/sharingan

[3]

官方仓库readme.md: https://github.com/buger/goreplay

[4]

官方文档: https://github.com/buger/goreplay/wiki/

本文由 mdnice 多平台发布

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

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

相关文章

通过SVN拉取项目 步骤

方法一&#xff1a;文件夹方式 首先新建一个空的文件夹&#xff0c;例如&#xff0c;名为“demo”的空文件夹 在这个空的文件夹中鼠标右键&#xff0c;点击SVN Checkout 会出现下图所示的页面&#xff0c;第一个输入框是svn的项目地址&#xff0c;第二个输入框是拉取项目所放的…

jenkins 安装与使用、用户权限划分

jenkins 安装与使用 安装插件&#xff1a; 开启该插件功能 验证用户管理 创建web01~02 使用web01登录 用户权限划分 安装 Role-Based Strategy 插件后&#xff0c;系统管理 中多了如图下所示的一个功能&#xff0c;用户权限的划分就是靠他来做的 创建角色 重新访问 创建项目…

一氧化碳单位换算 以及环保最低排放

换算单位&#xff1a; 1.0 % 10000 mg/m3 1.0 mg/m3 0.870 ppm 举例&#xff1a;CO表测数据 1.0 %&#xff0c;则10000 mg/m3&#xff0c;则10000*22.4/28 8700 ppm 参考&#xff1a;钢铁工业大气污染物超低排放标准 DB13

Ubuntu安装PyCharm

一、PyCharm介绍 PyCharm&#xff08;“Python的魅力”&#xff09;是由大名鼎鼎的JetBrains公司出品的一款主要面向Python的集成开发工具&#xff08;Integrated Development Environment, IDE&#xff09;&#xff0c;功能强大&#xff0c;可以从JetBrains公司官网下载安装包…

基于YOLOv5-7.0的PCB板缺陷检测

目录 参考引用一、数据集介绍二、环境配置三、构建训练数据集四、修改配置文件五、训练及tensorboard可视化六、效果测试七、遇到的BUG 参考引用 你的陈某某-基于YOLOv5的PCB板缺陷检测 一、数据集介绍 印刷电路板&#xff08;PCB&#xff09;瑕疵数据集。它是一个公共合成P…

速卖通测评补单的条件和步骤

速卖通测评补单对于卖家来说是一种低成本、高回报的推广营销方式&#xff0c;可以提高商品的流量、转化率、关键词质量分和链接权重。但是如果处理不当&#xff0c;可能会对店铺产生负面影响。下面是实现自养号给自己店铺测评的条件和步骤&#xff1a; 1. 稳定的测评环境系统 …

Shopee买家通系统的功能及优势介绍

Shopee买家通系统是一款专门针对虾皮买家号所开发的软件&#xff0c;完全模拟人类真实行为让操作看起来更真实&#xff0c;可以一键批量注册shoppe买家号、批量绑定地址及支付卡、设置关键词搜索加购及下单&#xff0c;内置防指纹技术可以创建独立运行环境防止账号关联。 五大优…

搭建Pytorch的GPU环境超详细

效果 1、下载和安装VS2019 https://visualstudio.microsoft.com/zh-hans/vs/older-downloads/ 登录需要用户名和密码 安装后需要联网下载组件的,安装的时候要勾选使用C++的桌面开发 2、下载和安装显卡驱动 查看自己的显卡型号 从英伟达下载和安装最新驱动

异常气体识别与飘移

Olfactory Target/Background Odor Detection via Self-expression Model 解决非目标气体检测 摘要&#xff1a;提出了SeELM模型&#xff08;自表达ELM模型&#xff09; 分为两步&#xff1a;1.对获得的数据集进行建模&#xff0c;计算出自我表达系数矩阵&#xff0c;2.对于异…

JAVA毕业设计099—基于Java+Springboot+Vue的在线智慧教育考试系统(源码+数据库)

基于JavaSpringbootVue的在线智慧教育考试系统(源码数据库)099 一、系统介绍 本系统前后端分离 本系统分为管理员、用户两种角色(角色权限可自行分配) 学生系统功能 模块介绍登录用户名、密码试题题干支持文本、图片、数学公式、表格等考试主观题支持答题板作答之后保存文…

VR航天科普主题公园模拟太空舱体验馆vr航天模拟体验设备

VR航天航空体验馆巡展是一项非常受欢迎的展览活动&#xff0c;可以让公众在现场体验到航天飞行的乐趣。 普乐蛙VR展览组织者会设计一个航天航空主题的VR体验馆&#xff0c;并在馆内设置各种航天航空相关的展示内容&#xff0c;如太空舱、火箭发射、星际航行等。 其次&#xff0…

matlab 读写磁共振影像.nii 数据

问题描述&#xff1a; 参考LEiDA方法和周昌松老师的large-scale network 的分离整合的划分[1]&#xff0c;脑区划分结束后需要把脑区的结果用脑图的形式呈现出来&#xff0c;但是因为我划分脑区的结果都是保存在mat文件里&#xff0c;Brainnet Viewer 则需要使用 .nii 类型的文…

中国xx集团信息技术工程师面试

进入面试间&#xff0c;坐着三位面试官&#xff0c;压力扑面而来&#xff0c;三位面试官先做了自我介绍&#xff0c;介绍了一下面试的流程后才开始面试。 一、自我介绍 不多说。 二、看你学过数据挖掘这门课&#xff0c;能简单介绍一下有哪些章节&#xff0c;学了些什么&…

PHP 智能物业管理系统mysql数据库web结构apache计算机软件工程网页wamp

一、源码特点 PHP 智能物业管理系统是一套完善的web设计系统&#xff0c;对理解php编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。 PHP小区物业管理系统1 代码 https://download.csdn.net/download/qq_41221322/88444…

相似性搜索:第 7 部分--LSH 组合物

Vyacheslav Efimov – Medium S相似性搜索是一个问题&#xff0c;给定一个查询&#xff0c;目标是在所有数据库文档中找到与其最相似的文档。 一、说明 在数据科学中&#xff0c;相似性搜索经常出现在 NLP 领域、搜索引擎或推荐系统中&#xff0c;其中需要检索最相关的文档或项…

机器人控制算法——TEB算法—Obstacle Avoidance and Robot Footprint Model(避障与机器人足迹模型)

1.How Obstacle Avoidance works 1.1处罚条款 避障是作为整体轨迹优化的一部分来实现的。显然&#xff0c;优化涉及到找到指定成本函数&#xff08;目标函数&#xff09;的最小成本解&#xff08;轨迹&#xff09;。简单地说&#xff1a;如果一个计划的&#xff08;未来&…

python manage.py makemigrations报错key error

django 运行 python manage.py makemigrations 报错 KeyError 解决&#xff1a;不知道原因&#xff0c; 删除了migration记录就可以了

异或运算.

相同为0&#xff0c;不同为1。 1 ^ 10 0 ^ 00 1 ^ 01 0 ^ 11性质&#xff1a; 0 ^ N N N ^ N 0交换、结合 a ^ b b ^ a&#xff1b; (a ^ b) ^ c a ^ (b ^ c)&#xff1b; 因此异或全部的元素的结果就是那个只出现1次的元素。 实现两个值的交换&#xff0c;而不必使…

如何选择优质的静动态住宅代理IP提供商?用前必看

当前&#xff0c;当网络隐私和数据安全备受关注时&#xff0c;住宅代理的使用已成为不可或缺的资源。从网络抓取者和营销人员到安全爱好者和在线安全爱好者&#xff0c;住宅代理在执行任何在线活动时提供基本的匿名性。 然而&#xff0c;并非所有住宅代理提供商都是相同的&…

coreldraw2019安装包下载安装步骤教程

安装之前一定要退出杀毒软件&#xff0c;所有的杀毒软件都要退出。无论360&#xff0c;腾讯管家&#xff0c;或者电脑自带的安全中心&#xff0c;要不然会阻止安装。 第一步&#xff1a;打开安装包 CorelDRAW2019win下载如下:https://wm.makeding.com/iclk/?zoneid55678 Co…