跳到主要内容

流量复制

[TOC]

流量复制

By:weimenghua
Date:2022.11.03
Description:流量复制

参考资料
GoReplay 官网
GoReplay 源码 有赞流量回放在中台营销的实践

一、流量回放

流量回放是系统重构、拆分、中台化时重要的自动化回归手段。通过采集可录制流量,在指定环境回放,再逐一对比每个调用和子调用差异来发现接口代码是否存在问题。因为线上流量大、场景全面,可以有效弥补人工评估测试范围的局限性,进而降低业务快速迭代带来的风险。流量回放的整体流程图如下图所示。

二、GoReplay

2.1 GoReplay 简介

GoReplay 是一款开源网络监控工具,可以记录您的实时流量并将其用于跟踪、负载测试、监控和详细分析。

生产引流
录制生产环境的 HTTP 流量,镜像回放到测试环境。

流量压测
录制生产环境的 HTTP 流量,进行存储保存,根据录制的内容 加倍 或 缩量 回放 到测试环境。

分析与监控
支持把 HTTP 流量记录存储到 ElasticSearch、Kafka、本地文件 等存储设备,可以通过自定义插件的方式,处理 Request 和 Response。

2.2 GoReplay 搭建

Go 环境搭建(非必须) go 下载地址1
go 下载地址2

1、下载
wget https://go.dev/dl/go1.20.4.linux-amd64.tar.gz

2、解压到/usr/local 目录下
tar -zxvf go1.20.4.linux-amd64.tar.gz -C /usr/local

3、配置环境变量
vim /etc/profile

export GOROOT=/usr/local/go
export PATH=$PATH:$GOROOT/bin

source /etc/profile

4、验证
go env

2.3 GoReplay 搭建

1、下载
wget https://github.com/buger/goreplay/releases/download/v1.3.1/gor_1.3.1_x64.tar.gz
curl -L -O https://github.com/buger/goreplay/releases/download/v1.3.1/gor_1.3.1_x64.tar.gz

2、解压
tar -zxvf gor_1.3.1_x64.tar.gz

3、复制
cp gor /usr/bin/
或者
cp gor /usr/local/bin

4、验证
gor -h

2.4 GoReplay 使用

使用 GoReplay 内置的 Server

启动本地文件服务,使用两个窗口分别打开
gor file-server :8000
gor file-server :9000

返回的是当前目录下的文件列表
curl http://localhost:8000
curl http://localhost:9000

流量复制

打印请求到控制台
gor --input-raw :8000 --output-stdout

通过 --input-raw-track-response 追踪响应
gor --input-raw :8000 --input-raw-track-response --output-stdout

写入文件
gor --input-raw :8000 --output-file requests_origin.gor

读取文件
gor --input-file requests_origin.gor --output-http ""

放大流量 1000%就是放大10倍速度
缩小流量 50%
gor --input-file "requests_0.gor|1000%" --output-http="http://localhost:9000|50%"

通过 gor 监听 :8000 的流量,通过 --output-http 重放到 :9000 端口,在 :9000 所在的 Shell 窗口可以看到重放过来的请求
gor --input-raw :8000 --output-http="http://localhost:9000"

2.5 GoReplay 参数

输入

参数描述示例
--input-raw value用于捕获 HTTP 流量,可以指定 IP 、网卡、端口gor --input-raw :8080
--input-raw-track-response同时捕获 HTTP 响应,默认只捕获请求
--input-file value从 --output-file 生成的文件中获取流程,用于离线流量重放
--input-file-loop循环 Replay --input-file
--input-file-max-wait durationReplay 时默认按照请求间隔时间,该参数设置每个请求的最大间隔时间--input-raw-max-wait 1s
--input-tcp value将多个 Gor 流量聚集到一个 Gor 实例,上游配合 --output-tcp--input-tcp :28020
--input-raw-engine libpcap默认 libpcap,可选 raw_socket、 pcap_file

输出

参数描述示例
--output-stdout用于调试,输出所有数据到 标准输出
--output-file value记录到文件
--output-http value重放 HTTP 流量到给定的端点--output-http 'http://localhost:9000'
--output-tcp将数据转发给另一个 Gor 实例,下游配合 --input-tcp 使用--output-tcp hostname:28020

三、其它

查看开放的端口

netstat -tunlp

操作 nginx

1、查看 nginx 容器
k get pod -n my-space

2、进入 nginx 容器
kubectl exec -it pod/nginx-deployment-9456bbbf9-2478v -n my-space -- bash
kubectl exec -it pod/nginx-deployment2-9456bbbf9-624gb -n my-space -- bash

2、查看 nginx 日志
kubectl logs -f nginx-deployment-9456bbbf9-2478v -n my-space
kubectl logs -f nginx-deployment2-9456bbbf9-624gb -n my-space

3、浏览器访问 nginx
http://127.0.0.1:30004/
http://127.0.0.1:30005/

4、命令行访问 ngxin
踩坑:浏览器访问,gor 录制不到,命令行访问,gor 流量录制得到,重装之后浏览器访问的也能录制得到了。(没明白)
curl 127.0.0.1:30004
curl 127.0.0.1:30005

复制文件
1、复制本地文件到 pod
命令:kubectl cp <本地文件路径> <pod 名称>:<目录>
举例:kubectl cp /root/tmp/gor_1.3_RC1_x64.tar.gz nginx-deployment-9456bbbf9-2478v:/ -n my-space

2、复制 pod 文件到本地
命令:kubectl cp <pod 名称>:<文件/目录> <本地文件路径> -n <ns 名称>
举例:kubectl cp nginx-deployment-9456bbbf9-9g8zn:/requests_origin_0.gor /root/tmp/requests_origin_0.gor -n my-space