需求即动力,之前只是看过Go的一些语法,并没有用来写过什么东西,主要原因是python写习惯了,写一些脚本也不需要什么性能。而这次就不一样了,需要一个强大的后端用来压测负载均衡,Go明显是最合适的。
刚开始是直接复制粘贴的一个HTTP Server,对于满足以下两点需求还差点儿:
- 可定义连接建立时间,满足长连接的测试需求;
- 可定义返回包大小,满足不同包大小的测试场景。
这两个参数的获取方式是从URL中Query参数中得到,默认值sleep=0
、length=1024
代码如下:
package main
import (
"io"
"log"
"net/http"
"os"
"strconv"
"time"
)
type myHandler struct{}
var x = rune('x')
func GenString(n int) string {
b := make([]rune, n)
for i := range b {
b[i] = x
}
return string(b)
}
func (*myHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
vars := r.URL.Query()
var st string
var ct string
sleepTime, ok := vars["sleep"]
if !ok {
st = "0"
} else {
st = string(sleepTime[0])
}
contentLength, ok := vars["length"]
if !ok {
ct = "1024"
} else {
ct = string(contentLength[0])
}
sleepT, _ := strconv.Atoi(st)
contentL, _ := strconv.Atoi(ct)
time.Sleep(time.Second * time.Duration(sleepT))
var content = GenString(contentL)
io.WriteString(w, content)
log.Println(contentL)
}
func main() {
var port string
port = ":" + os.Args[1]
srv := &http.Server{
Addr: port,
Handler: &myHandler{},
ReadTimeout: 30 * time.Second,
WriteTimeout: 30 * time.Second,
}
log.Println(srv.ListenAndServe())
}