在Golang开发中,网络请求是常见的操作,其性能表现会直接影响服务的整体质量,因此掌握网络请求性能测试的方法是开发者的必备技能。通过合理的性能测试,我们可以明确请求的最大并发量、平均响应耗时、错误率等核心指标,为后续的性能优化提供数据支撑。

基础测试思路
网络请求性能测试的核心逻辑是模拟多并发场景下的请求发送,统计各项运行指标。Golang标准库中的net/http/httptest和testing包提供了基础的测试能力,同时我们也可以结合第三方库实现更灵活的测试场景。
关键测试指标
- 平均响应耗时:所有请求响应的平均时间,反映单次请求的基础性能
- 请求成功率:成功返回预期结果的请求占总请求数的比例
- 最大并发吞吐量:单位时间内能够处理的请求总数
- P99响应耗时:99%的请求响应耗时低于该数值,反映极端场景下的性能表现
使用标准库实现基础性能测试
我们可以基于testing包的基准测试能力,结合sync.WaitGroup实现并发请求测试,统计核心性能指标。
package main
import (
"fmt"
"io"
"net/http"
"sync"
"testing"
"time"
)
// 测试目标接口地址
const testURL = "http://127.0.0.1:8080/api/test"
// 单个请求执行逻辑
func sendRequest(client *http.Client) error {
resp, err := client.Get(testURL)
if err != nil {
return err
}
defer resp.Body.Close()
// 读取响应内容避免连接复用异常
_, err = io.ReadAll(resp.Body)
return err
}
// 基准测试函数
func BenchmarkHttpRequest(b *testing.B) {
// 初始化HTTP客户端,设置超时时间
client := &http.Client{
Timeout: 10 * time.Second,
}
// 重置计时器,排除初始化逻辑耗时
b.ResetTimer()
// 并发执行请求
b.RunParallel(func(pb *testing.PB) {
for pb.Next() {
err := sendRequest(client)
if err != nil {
b.Errorf("请求失败: %v", err)
}
}
})
}
// 自定义并发测试函数
func TestConcurrentRequest(t *testing.T) {
client := &http.Client{
Timeout: 10 * time.Second,
}
// 总请求数
totalReq := 1000
// 并发数
concurrency := 100
// 统计成功请求数
successCount := 0
// 统计总耗时
var totalDuration time.Duration
// 等待所有请求完成
var wg sync.WaitGroup
// 控制并发数
ch := make(chan struct{}, concurrency)
startTime := time.Now()
for i := 0; i < totalReq; i++ {
wg.Add(1)
ch <- struct{}{}
go func() {
defer wg.Done()
defer func() { <-ch }()
reqStart := time.Now()
err := sendRequest(client)
reqDuration := time.Since(reqStart)
totalDuration += reqDuration
if err == nil {
successCount++
}
}()
}
wg.Wait()
totalTime := time.Since(startTime)
// 输出测试结果
fmt.Printf("总请求数: %d\n", totalReq)
fmt.Printf("成功请求数: %d\n", successCount)
fmt.Printf("成功率: %.2f%%\n", float64(successCount)/float64(totalReq)*100)
fmt.Printf("总耗时: %v\n", totalTime)
fmt.Printf("平均响应耗时: %v\n", totalDuration/time.Duration(totalReq))
fmt.Printf("QPS: %.2f\n", float64(totalReq)/totalTime.Seconds())
}使用第三方库vegeta进行专业测试
vegeta是Golang生态中常用的HTTP负载测试工具,支持灵活的攻击模式配置,适合更复杂的性能测试场景。
安装vegeta
可以通过go install命令安装vegeta工具:
go install github.com/tsenart/vegeta/v12/cmd/vegeta@latest
编写测试代码
我们可以通过代码调用vegeta的库实现自定义测试逻辑:
package main
import (
"fmt"
"time"
"github.com/tsenart/vegeta/v12/lib"
)
func main() {
// 测试目标地址
target := "http://127.0.0.1:8080/api/test"
// 每秒请求数
rate := vegeta.Rate{Freq: 100, Per: time.Second}
// 测试持续时间
duration := 10 * time.Second
// 创建攻击目标
targeter := vegeta.NewStaticTargeter(vegeta.Target{
Method: "GET",
URL: target,
})
// 创建攻击器
attacker := vegeta.NewAttacker()
// 执行攻击并收集结果
var metrics vegeta.Metrics
for res := range attacker.Attack(targeter, rate, duration, "Golang性能测试") {
metrics.Add(res)
}
metrics.Close()
// 输出测试结果
fmt.Printf("请求总数: %d\n", metrics.Requests)
fmt.Printf("成功率: %.2f%%\n", metrics.Success*100)
fmt.Printf("P50响应耗时: %v\n", metrics.Latencies.P50)
fmt.Printf("P95响应耗时: %v\n", metrics.Latencies.P95)
fmt.Printf("P99响应耗时: %v\n", metrics.Latencies.P99)
fmt.Printf("最大响应耗时: %v\n", metrics.Latencies.Max)
fmt.Printf("QPS: %.2f\n", metrics.Throughput)
}测试注意事项
- 测试前需要确认目标服务处于稳定状态,避免其他业务干扰测试结果
- 逐步提升并发数,观察性能拐点,不要一开始就使用过高并发压垮服务
- 多次测试取平均值,减少单次测试的偶然性误差
- 测试环境和生产环境配置尽量保持一致,保证测试结果的参考价值
Golang网络请求性能测试http_client修改时间:2026-06-05 22:03:38