golang实时HTTP流量复制与重放工具插件Gor的使用

Golang实时HTTP流量复制与重放工具插件Gor的使用

简介

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

Go Replay

随着应用程序的增长,测试所需的努力也呈指数级增长。GoReplay提供了重用现有流量进行测试的简单想法,这使其功能极其强大。我们的先进技术允许您在不影响应用程序的情况下分析和记录应用程序流量。

安装

从官方GitHub releases页面下载最新二进制文件或自行编译。

基本使用

基本示例1:监控流量(类似tcpdump)

sudo ./gor --input-raw :8000 --output-stdout

基本示例2:将流量重放到测试环境

sudo ./gor --input-raw :8000 --output-http http://staging.env

完整示例Demo

// 以下是使用Gor的完整示例配置

// 1. 记录HTTP流量到文件
// 记录本地8080端口的所有HTTP流量到requests.gor文件
// gor --input-raw :8080 --output-file requests.gor

// 2. 从文件重放流量
// 将记录的流量重放到测试环境,速率是原来的50%
// gor --input-file requests.gor --output-http "http://staging.env" --speed 0.5

// 3. 实时流量镜像
// 将生产流量实时镜像到测试环境,但不影响生产环境响应
// gor --input-raw :80 --output-http "http://staging.env" --output-http "http://production.env"

// 4. 流量过滤和修改
// 只记录GET请求,并修改请求头
// gor --input-raw :8080 --output-http "http://staging.env" \
//     --http-allow-method GET \
//     --http-set-header 'User-Agent: GorReplay'

工作原理图

Diagram

进阶功能

GoReplay还提供以下高级功能:

  • 请求过滤和修改
  • 流量速率控制
  • 请求重写
  • 中间件支持
  • 分布式部署

使用Gor的公司

许多知名公司都在使用Gor,包括:

  • GOV.UK - 英国政府数字服务
  • theguardian.com - 英国最受欢迎的在线报纸
  • TomTom - 导航、交通和地图产品的全球领导者
  • 3SCALE - API基础设施管理
  • 以及更多公司…

作者

Leonid Bugaev (@buger)


更多关于golang实时HTTP流量复制与重放工具插件Gor的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html

1 回复

更多关于golang实时HTTP流量复制与重放工具插件Gor的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


Golang实时HTTP流量复制与重放工具Gor的使用

Gor是一款用Go语言开发的高性能HTTP流量复制和重放工具,主要用于生产环境流量测试、压力测试和性能分析。

Gor的主要功能

  1. 实时流量复制:将生产环境的HTTP请求复制到测试环境
  2. 流量重放:将记录的流量重新发送到目标服务器
  3. 流量过滤:基于URL、方法等条件过滤流量
  4. 流量修改:修改请求头、请求体等
  5. 性能测试:用于负载测试和性能基准测试

安装Gor

# 使用go get安装
go get github.com/buger/gor

# 或者下载预编译二进制
wget https://github.com/buger/gor/releases/download/v1.3.0/gor_1.3.0_x64.tar.gz
tar -xzf gor_1.3.0_x64.tar.gz
sudo mv gor /usr/local/bin/

基本使用示例

1. 简单的流量复制

# 监听本地8080端口,将流量复制到http://target-server:8080
gor --input-raw :8080 --output-http http://target-server:8080

2. 记录流量到文件

# 记录流量到文件
gor --input-raw :8080 --output-file requests.gor

3. 从文件重放流量

# 重放记录的流量
gor --input-file requests.gor --output-http http://target-server:8080

Golang集成示例

虽然Gor本身是一个独立工具,但你也可以在Go程序中集成其功能:

package main

import (
	"fmt"
	"log"
	"net/http"
	"os/exec"
)

func startGor(inputPort int, outputURL string) {
	cmd := exec.Command("gor", 
		"--input-raw", fmt.Sprintf(":%d", inputPort),
		"--output-http", outputURL,
		"--verbose",
	)
	
	err := cmd.Start()
	if err != nil {
		log.Fatalf("Failed to start Gor: %v", err)
	}
	
	log.Printf("Gor started, copying traffic from :%d to %s", inputPort, outputURL)
}

func main() {
	// 启动一个简单的HTTP服务器
	go func() {
		http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
			fmt.Fprintf(w, "Original server response")
		})
		http.ListenAndServe(":8080", nil)
	}()

	// 启动Gor复制流量到测试服务器
	startGor(8080, "http://test-server:8080")
	
	// 保持程序运行
	select {}
}

高级功能示例

1. 流量过滤

# 只复制/api路径下的GET请求
gor --input-raw :8080 --output-http http://target-server:8080 \
    --http-allow-url /api \
    --http-allow-method GET

2. 流量修改

# 修改请求头
gor --input-raw :8080 --output-http http://target-server:8080 \
    --http-set-header 'User-Agent: Gor Replay' \
    --http-set-header 'X-Forwarded-For: 10.0.0.1'

3. 性能测试模式

# 以10倍速率重放流量
gor --input-file requests.gor --output-http "http://target-server:8080|10"

注意事项

  1. 生产环境使用要谨慎:避免对生产系统造成影响
  2. 性能考虑:Gor本身性能很高,但大量流量复制仍可能影响源服务器
  3. 数据安全:敏感数据可能被复制,确保有适当的数据脱敏措施
  4. 速率限制:可以使用--output-http-workers限制并发数

监控Gor性能

Gor提供了基本的性能统计,可以通过以下方式查看:

gor --input-raw :8080 --output-http http://target-server:8080 --stats --output-http-stats

Gor是一个强大的工具,特别适合在Go生态系统中进行流量测试和性能分析。通过合理使用,可以大大简化测试环境的搭建和性能测试的过程。

回到顶部