// 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 }