golang,go,博客,开源,编程
Vegeta 是一个用 Go 语言 编写的现代化 HTTP 压力测试库,旨在帮助开发人员和运维人员对 HTTP 服务进行负载测试和性能评估。这个库非常适合用于模拟大量 HTTP 请求,并且提供详细的统计信息来分析系统的表现。
go get
命令安装 Vegeta:
go get github.com/tsenart/vegeta
package main
import (
"fmt"
"log"
"github.com/tsenart/vegeta/v12/lib"
)
func main() {
// 定义目标
target := "http://localhost:8080"
// 创建 Vegeta 负载测试器
attacker := vegeta.NewAttacker()
// 定义请求参数
rate := vegeta.Rate{Freq: 10, Per: vegeta.Second} // 每秒10个请求
duration := 10 * vegeta.Second // 测试持续10秒
// 开始负载测试
for res := range attacker.Attack(vegeta.NewRequest("GET", target, nil, nil), rate, duration) {
fmt.Printf("请求 %s 状态码: %d\n", res.URL, res.StatusCode)
}
// 完成后输出结果
fmt.Println("负载测试完成")
}
echo "GET http://localhost:8080" | vegeta attack -duration=10s -rate=10 | vegeta report
echo "GET http://localhost:8080" | vegeta attack -duration=10s -rate=10 | vegeta report -type=json > result.json
这是一个最基本的负载测试示例,模拟每秒 10 个请求(10 RPS),并持续 10 秒钟。它会输出每个请求的状态码。
package main
import (
"fmt"
"github.com/tsenart/vegeta/v12/lib"
)
func main() {
// 设置目标 URL
target := "http://localhost:8080"
// 创建 Vegeta 攻击者实例
attacker := vegeta.NewAttacker()
// 配置每秒请求频率为 10(10 RPS),持续时间为 10 秒
rate := vegeta.Rate{Freq: 10, Per: vegeta.Second}
duration := 10 * vegeta.Second
// 发起攻击并收集结果
for res := range attacker.Attack(vegeta.NewRequest("GET", target, nil, nil), rate, duration) {
fmt.Printf("请求 URL: %s, 状态码: %d\n", res.URL, res.StatusCode)
}
// 测试完成
fmt.Println("负载测试完成")
}
你可以设置自定义的请求头、请求方法或其他 HTTP 参数来进行更复杂的测试。例如,在发送请求时添加 Authorization
头部。
package main
import (
"fmt"
"github.com/tsenart/vegeta/v12/lib"
)
func main() {
// 设置目标 URL 和请求头
target := "http://localhost:8080/protected"
// 创建 Vegeta 攻击者实例
attacker := vegeta.NewAttacker()
// 配置请求头
headers := map[string]string{
"Authorization": "Bearer some-token",
}
// 创建请求,带有自定义头部
request := vegeta.NewRequest("GET", target, nil, headers)
// 配置每秒请求频率为 5(5 RPS),持续时间为 10 秒
rate := vegeta.Rate{Freq: 5, Per: vegeta.Second}
duration := 10 * vegeta.Second
// 发起攻击并收集结果
for res := range attacker.Attack(request, rate, duration) {
fmt.Printf("请求 URL: %s, 状态码: %d\n", res.URL, res.StatusCode)
}
// 测试完成
fmt.Println("负载测试完成")
}
Vegeta 支持模拟不同频率和并发量的请求。下面是一个设置多个并发请求的例子,模拟每秒 100 个请求,持续 30 秒。
package main
import (
"fmt"
"github.com/tsenart/vegeta/v12/lib"
)
func main() {
// 设置目标 URL
target := "http://localhost:8080"
// 创建 Vegeta 攻击者实例
attacker := vegeta.NewAttacker()
// 配置每秒请求频率为 100(100 RPS),持续时间为 30 秒
rate := vegeta.Rate{Freq: 100, Per: vegeta.Second}
duration := 30 * vegeta.Second
// 发起攻击并收集结果
for res := range attacker.Attack(vegeta.NewRequest("GET", target, nil, nil), rate, duration) {
fmt.Printf("请求 URL: %s, 状态码: %d\n", res.URL, res.StatusCode)
}
// 测试完成
fmt.Println("负载测试完成")
}
如果你需要模拟 POST 请求并发送请求体,可以这样操作:
package main
import (
"fmt"
"strings"
"github.com/tsenart/vegeta/v12/lib"
)
func main() {
// 设置目标 URL
target := "http://localhost:8080/api"
// 创建 POST 请求体
body := `{"username": "testuser", "password": "testpass"}`
// 创建 Vegeta 攻击者实例
attacker := vegeta.NewAttacker()
// 配置每秒请求频率为 10(10 RPS),持续时间为 20 秒
rate := vegeta.Rate{Freq: 10, Per: vegeta.Second}
duration := 20 * vegeta.Second
// 创建 POST 请求,并传递请求体
request := vegeta.NewRequest("POST", target, strings.NewReader(body), nil)
// 发起攻击并收集结果
for res := range attacker.Attack(request, rate, duration) {
fmt.Printf("请求 URL: %s, 状态码: %d\n", res.URL, res.StatusCode)
}
// 测试完成
fmt.Println("负载测试完成")
}
Vegeta 提供了详细的统计信息,帮助你分析负载测试结果。可以将这些统计信息导出为报告(例如 JSON 格式)供进一步分析:
echo "GET http://localhost:8080" | vegeta attack -duration=10s -rate=10 | vegeta report -type=json > result.json
然后你可以使用 vegeta report
命令来查看结果的汇总:
cat result.json | vegeta report
这将输出类似以下的统计数据:
Requests [total, rate, throughput] 100, 10.0, 10.0
Duration [total, attack, wait] 10.001s, 10.0s, 0s
Latencies [mean, 50%, 95%, 99%, max] 10.3ms, 10.1ms, 13.7ms, 18ms, 30ms
Status Codes [code:count] 100:100
Vegeta 也允许你查看实时的负载测试过程。通过 vegeta plot
命令,你可以生成一个图表来展示负载测试过程中的吞吐量、延迟等关键数据。使用 plot
时,可以生成一个 HTML 文件进行可视化展示。
echo "GET http://localhost:8080" | vegeta attack -duration=10s -rate=10 | vegeta report -type=plot > report.html
然后,打开 report.html
文件,你会看到一个详细的图表,展示负载测试期间的吞吐量、延迟等数据。
假设你要对一个高并发的 API 进行压力测试,你可以使用 Vegeta 来模拟极端的请求频率,例如每秒 1000 个请求,持续 1 分钟:
echo "GET http://localhost:8080" | vegeta attack -duration=1m -rate=1000 | vegeta report
这个命令将模拟每秒 1000 个请求,并持续 1 分钟进行测试,最终会生成吞吐量、延迟等的统计报告。
Vegeta 提供了丰富的报告功能,能够生成各种格式的输出,包括:
报告可以通过命令行查看,也可以通过导出 JSON 格式进一步分析。
Vegeta 是一个功能强大的 Go 语言库,能够帮助你有效地进行 HTTP 服务的性能测试和压力测试。它具有高效、灵活、易用的特点,适合用于各种负载测试场景。无论是开发阶段的性能基准测试,还是生产环境的容量测试,Vegeta 都能够为你提供有价值的性能数据和分析报告。