109 lines
3.3 KiB
Go
109 lines
3.3 KiB
Go
// Package main go 实现的压测工具
|
||
package main
|
||
|
||
import (
|
||
"context"
|
||
"flag"
|
||
"fmt"
|
||
"go_dreamfactory/lego/core"
|
||
"go_dreamfactory/stress/model"
|
||
"go_dreamfactory/stress/server"
|
||
"go_dreamfactory/stress/server/statistics"
|
||
"runtime"
|
||
"strings"
|
||
"time"
|
||
)
|
||
|
||
// array 自定义数组参数
|
||
type array []string
|
||
|
||
// String string
|
||
func (a *array) String() string {
|
||
return fmt.Sprint(*a)
|
||
}
|
||
|
||
// Set set
|
||
func (a *array) Set(s string) error {
|
||
*a = append(*a, s)
|
||
|
||
return nil
|
||
}
|
||
|
||
var (
|
||
concurrency uint64 = 1 // 并发数
|
||
totalNumber uint64 = 1 // 请求数(单个并发/协程)
|
||
debugStr = "false" // 是否是debug
|
||
requestURL = "" // 压测的url 目前支持,http/https ws/wss
|
||
verify = "pb" // verify 验证方法 在server/verify中 http 支持:statusCode、json webSocket支持:json
|
||
maxCon = 1 // 单个连接最大请求数
|
||
code = 200 // 成功状态码
|
||
keepalive = false // 是否开启长连接
|
||
cpuNumber = 1 // CUP 核数,默认为一核,一般场景下单核已经够用了
|
||
timeout int64 = 0 // 超时时间,默认不设置
|
||
)
|
||
|
||
func init() {
|
||
flag.Uint64Var(&concurrency, "c", concurrency, "并发数")
|
||
flag.Uint64Var(&totalNumber, "n", totalNumber, "请求数(单个并发/协程)")
|
||
flag.StringVar(&debugStr, "d", debugStr, "调试模式")
|
||
flag.StringVar(&requestURL, "u", requestURL, "压测地址")
|
||
flag.StringVar(&verify, "v", verify, "验证方法 http 支持:statusCode、json webSocket支持:json")
|
||
flag.IntVar(&maxCon, "m", maxCon, "单个host最大连接数")
|
||
flag.IntVar(&code, "code", code, "请求成功的状态码")
|
||
flag.BoolVar(&keepalive, "k", keepalive, "是否开启长连接")
|
||
flag.IntVar(&cpuNumber, "cpuNumber", cpuNumber, "CUP 核数,默认为一核")
|
||
flag.Int64Var(&timeout, "timeout", timeout, "超时时间 单位 秒,默认不设置")
|
||
// 解析参数
|
||
flag.Parse()
|
||
}
|
||
|
||
// main go 实现的压测工具
|
||
// 编译可执行文件
|
||
//
|
||
type Options struct {
|
||
ConfPath string //配置文件路径
|
||
Version string //服务版本
|
||
Setting core.ServiceSttings //服务参数配置
|
||
}
|
||
|
||
//go:generate go build main.go
|
||
func main() {
|
||
runtime.GOMAXPROCS(cpuNumber)
|
||
flag.Parse()
|
||
statistics.InitLog()
|
||
|
||
concurrency = 100
|
||
totalNumber = 1
|
||
debugStr = "false"
|
||
requestURL = "ws://106.54.189.74:7891/gateway"
|
||
if concurrency == 0 || totalNumber == 0 || (requestURL == "") {
|
||
fmt.Printf("示例: go run main.go -c 1 -n 1 -u https://www.baidu.com/ \n")
|
||
fmt.Printf("压测地址或curl路径必填 \n")
|
||
fmt.Printf("当前请求参数: -c %d -n %d -d %v -u %s \n", concurrency, totalNumber, debugStr, requestURL)
|
||
flag.Usage()
|
||
return
|
||
}
|
||
debug := strings.ToLower(debugStr) == "false"
|
||
request, err := model.NewRequest(requestURL, verify, code, 0, debug, maxCon, keepalive)
|
||
if err != nil {
|
||
fmt.Printf("参数不合法 %v \n", err)
|
||
return
|
||
}
|
||
fmt.Printf("\n 开始启动 并发数:%d 请求数:%d 请求参数: \n", concurrency, totalNumber)
|
||
request.Print()
|
||
|
||
// 开始处理
|
||
ctx := context.Background()
|
||
if timeout > 0 {
|
||
var cancel context.CancelFunc
|
||
ctx, cancel = context.WithTimeout(ctx, time.Duration(timeout)*time.Second)
|
||
defer cancel()
|
||
deadline, ok := ctx.Deadline()
|
||
if ok {
|
||
fmt.Printf(" deadline %s", deadline)
|
||
}
|
||
}
|
||
server.Dispose(ctx, concurrency, totalNumber, request)
|
||
return
|
||
}
|