如何快速使用Go语言模拟接口高并发压测?
1.实现思路:
- 使用Go语言的标准库中的sync.WaitGroup来实现并发请求。
- 使用http.NewRequest()函数创建HTTP请求对象,并设置请求参数和请求头。
- 使用http.Client执行HTTP请求,并获取响应结果。
- 对响应结果进行断言验证,比如检查HTTP状态码、响应内容等。
- 统计每个请求的响应时间,并计算TPS(每秒事务数)。
- 输出测试结果,包括请求总数、成功数、失败数、平均响应时间、最大响应时间、最小响应时间、TPS等。
2.用Go编写一个简单的压测例子(需引入开源HTTP负载测试库vegeta
)
package main
import (
"fmt"
"io/ioutil"
"net/http"
"sync"
"time"
"github.com/tsenart/vegeta/lib"
)
func main() {
targeter := vegeta.NewStaticTargeter(vegeta.Target{
Method: "POST",
URL: "http://foobar.org/fnord/2",
Body: []byte("Hello world!"),
Header: http.Header{
"Authorization": []string{"x67890"},
"Content-Type": []string{"text/plain"},
}
})
rate := vegeta.Rate{Freq: 300, Per: time.Second}
duration := 30 * time.Second
targets := make(chan *vegeta.Target, 300)
results := make(chan *vegeta.Result, 300)
var wg sync.WaitGroup
wg.Add(1)
go func() {
defer wg.Done()
for tgt := range targets {
attacker := vegeta.NewAttacker()
res := attacker.Attack(tgt)
results <- res
}
}()
go func() {
for res := range results {
if res.Error != "" {
fmt.Printf("Error: %v\n", res.Error)
continue
}
if res.Code != http.StatusOK {
fmt.Printf("Unexpected status code: %d\n", res.Code)
continue
}
body, err := ioutil.ReadAll(res.Body)
if err != nil {
fmt.Printf("Error reading response body: %v\n", err)
continue
}
fmt.Printf("Response body: %s\n", string(body))
}
}()
for res := range vegeta.NewBatch(targeter, rate, duration) {
targets <- res
}
close(targets)
wg.Wait()
close(results)
}
具体使用方法可以参考其文档:vegeta
