压测工具平台的特殊性需要监控底层服务是否 core 掉,所以在语言选择环境的搭建复杂度多方面思考选择了 go,因为她不需要运行环境,编译成 binary 库之后直接就可以在 Linux 通过 linxu 命令运行,不需要依赖库,非常方便,所以有了以下内容,不对的地方希望大家多多探讨
Go 语言是谷歌 2009 年发布的第二款开源编程语言。Go 语言专门针对多处理器系统应用程序的编程进行了优化,使用 Go 编译的程序可以媲美 C 或 C++ 代码的速度,而且更加安全、支持并行进程。北京时间2010年1月10日,Go 语言摘得了 TIOBE 公布的 2009 年年度大奖。Go 语言设计支持主流的 32 位和 64 位的 x86 平台,同时也支持 32 位的 ARM 架构。谷歌资深软件工程师罗布·派克 (Rob Pike) 表示,“Go 让我体验到了从未有过的开发效率。2013年5月07日,Go 语言 Go 1.1RC2 版发布。Vim 是从 vi 发展出来的一个文本编辑器,代码补全、编译及错误跳转等方便编程的功能特别丰富,在程序员中被广泛使用(原文来自百度百科,详情自己搜索)
话不多说,直接进入正题吧
go 语言 linux 环境包下载(https://golang.org/dl/ go1.9.2.linux-amd64.tar.gz )
下载后选择你喜欢的位置解压,并且配置 go 语言的环境变量,为了你的环境变量有可能重启 shell 不生效 建议写在文件里(vim /root/.bashrc)
通过 go version 测试你的环境是否生效,一切 ok 后就可以开发一个 webserver
go webserver 开发及如何调用 shell
话不多说,直接上代码吧
package main
import (
"encoding/json"
"fmt"
"net/http"
"log"
"os"
"os/exec"
)
type BaseJsonBean struct {
Code int `json:"Code"`
Message string `json:"Message"`
}
func NewBaseJsonBean() *BaseJsonBean {
return &BaseJsonBean{}
}
func checkErr(err error) {
if err != nil {
log.Println(err)
}
}
func WebServerBase() {
var i,p = "xxxxxxx","xxxx"
log.Println("api [ getRelayRunStatus ]monitor relay run staus is start... server is ",i+":"+p)
http.HandleFunc("/getRelayRunStatus", moitorRelay)
err := http.ListenAndServe("0.0.0.0:"+p, nil)
checkErr(err)
}
func moitorRelay(w http.ResponseWriter, req *http.Request) {
log.Println("moitorRelay is running...")
//req.ParseForm()
result := NewBaseJsonBean()
if req.Method == "GET"{
result.Code = 2001
result.Message = "warning: request method must be post"
bytes, _ := json.Marshal(result)
fmt.Fprint(w,string(bytes))
return
}else{
ip := req.FormValue("ip")
port := req.FormValue("port")
log.Println(ip,port)
if ip == "" || port == "" {
result.Code = 2001
result.Message = "error:parameters is null "
bytes, _ := json.Marshal(result)
fmt.Fprint(w, string(bytes))
return
}
f, err := os.OpenFile("monitor_relay.sh", os.O_WRONLY|os.O_TRUNC, 0600)
defer f.Close()
f.WriteString("netstat -nlpt | grep "+ip+" | grep "+port)
if err != nil {fmt.Println(err.Error())}
cmd, err := exec.Command("/bin/sh", "./monitor_relay.sh").Output()
var str = string(cmd)
if str == ""{
result.Code = 2000
result.Message = "success:relay is core"
bytes, _ := json.Marshal(result)
fmt.Fprint(w, string(bytes))
return
}else{
result.Code = 2002
result.Message = "success:relay not core "+str
bytes, _ := json.Marshal(result)
fmt.Fprint(w, string(bytes))
return
}
}
}
func main(){
WebServerBase()
}
这里我想强调的是,go 在处理 shell 脚本时并且传参到 shell 脚本时是通过每次重新覆盖 shell 脚本文件的方式,先生成 shell 文件在通过 go 来调用的
http://www.yiibai.com/go/
https://studygolang.com/articles/4846
博主地址:http://blog.csdn.net/a11en_03(后续还会继续更新测试开发中遇到的感觉值得分享的东西)