最近搭建了一个TRON节点,同事不相信我的自建节点比官方更靠谱,咱们给他使用golang写一个压测脚本,测试一下。 本文档详细介绍了一个基于 Go 的并发 HTTP 请求工具,帮助你对 Tron 节点进行压力测试。本文档将从代码简介、环境配置、编译运行以及结果分析等方面进行详细说明。
最近搭建了一个TRON节点,同事不相信我的自建节点比官方更靠谱,咱们给他使用golang写一个压测脚本,测试一下。
本文档详细介绍了一个基于 Go 的并发 HTTP 请求工具,帮助你对 Tron 节点进行压力测试。本文档将从代码简介、环境配置、编译运行以及结果分析等方面进行详细说明。
该工具通过并发多个 HTTP 请求,对 Tron 节点的处理能力进行压力测试。每个请求都会记录响应时间,并将结果输出。
package main
import (
"bytes"
"fmt"
"io/ioutil"
"net/http"
"sync"
"time"
)
// worker 函数执行 HTTP 请求并记录响应时间
func worker(id int, wg *sync.WaitGroup, url string, payload string, results chan<- string, numRequests int, timeout time.Duration) {
defer wg.Done()
client := &http.Client{
Timeout: timeout,
}
for i := 0; i < numRequests; i++ {
req, err := http.NewRequest("POST", url, bytes.NewBuffer([]byte(payload)))
if err != nil {
results <- fmt.Sprintf("Worker %d: error creating request: %v", id, err)
return
}
req.Header.Set("Content-Type", "application/json")
start := time.Now()
resp, err := client.Do(req)
duration := time.Since(start)
if err != nil {
results <- fmt.Sprintf("Worker %d: error making request: %v", id, err)
return
}
defer resp.Body.Close()
if resp.StatusCode != http.StatusOK {
body, _ := ioutil.ReadAll(resp.Body)
results <- fmt.Sprintf("Worker %d: received non-OK status: %s, response body: %s", id, resp.Status, string(body))
return
}
body, err := ioutil.ReadAll(resp.Body)
if err != nil {
results <- fmt.Sprintf("Worker %d: error reading response body: %v", id, err)
return
}
results <- fmt.Sprintf("Worker %d: success in %v, response: %s", id, duration, string(body))
}
}
func main() {
// Tron 节点的 URL
url := "http://节点地址:8090/wallet/getnowblock"
// 替换为你的实际账户地址
accountAddress := "your-account-address"
payload := fmt.Sprintf(`{"address":"%s"}`, accountAddress)
// 并发请求的 worker 数量
numWorkers := 200
// 每个 worker 发送的请求数量
numRequests := 1
// HTTP 请求的超时时间
timeout := 3 * time.Second
var wg sync.WaitGroup
results := make(chan string, numWorkers*numRequests)
// 启动 worker
for i := 0; i < numWorkers; i++ {
wg.Add(1)
go worker(i, &wg, url, payload, results, numRequests, timeout)
}
// 等待所有 worker 完成
wg.Wait()
close(results)
// 输出结果
for result := range results {
fmt.Println(result)
}
}
package main
import (
"bytes"
"fmt"
"io/ioutil"
"net/http"
"sync"
"time"
)
导入包
func worker(id int, wg *sync.WaitGroup, url string, payload string, results chan<- string, numRequests int, timeout time.Duration) {
defer wg.Done()
client := &http.Client{
Timeout: timeout,
}
创建 HTTP 客户端
for i := 0; i < numRequests; i++ {
req, err := http.NewRequest("POST", url, bytes.NewBuffer([]byte(payload)))
if err != nil {
results <- fmt.Sprintf("Worker %d:error...
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!