用Go写一个简单的供压测用的HTTP Server

需求即动力,之前只是看过Go的一些语法,并没有用来写过什么东西,主要原因是python写习惯了,写一些脚本也不需要什么性能。而这次就不一样了,需要一个强大的后端用来压测负载均衡,Go明显是最合适的。
刚开始是直接复制粘贴的一个HTTP Server,对于满足以下两点需求还差点儿:

  1. 可定义连接建立时间,满足长连接的测试需求;
  2. 可定义返回包大小,满足不同包大小的测试场景。

这两个参数的获取方式是从URL中Query参数中得到,默认值sleep=0length=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())
}

你可能感兴趣的:(用Go写一个简单的供压测用的HTTP Server)