go_dreamfactory/stress/stress.go

109 lines
3.3 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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