代码链接
概述
开发简单 web 服务程序 cloudgo,了解 web 服务器工作原理。
任务目标
- 熟悉 go 服务器工作原理
- 基于现有 web 库,编写一个简单 web 应用类似 cloudgo。
- 使用 curl 工具访问 web 程序
- 对 web 执行压力测试
任务实现
一. 编程web服务程序,类似cloudgo应用
选择框架
本次使用的web开发框架是Martini,Martini框架是使用Go语言作为开发语言的一个强力的快速构建模块化web应用与服务的开发框架。我选择它为框架的主要理由之一是,上手非常简单。
Martini的特性有以下几点:
- 使用非常简单
- 无侵入设计
- 可与其他 Go 的包配合工作
- 超棒的路径匹配和路由
- 模块化设计,可轻松添加工具
- 大量很好的处理器和中间件
- 很棒的开箱即用特性
- 完全兼容 http.HandlerFunc 接口
安装Martini框架时,需要在gopath路径下执行如下命令:
go get github.com/go-martini/martini
go get github.com/martini-contrib/render
go get github.com/martini-contrib/binding
代码说明
我编写了一个很小的程序,该程序功能为,进入到页面1,该页面可以显示系统时间,并且可以在输入框中输入想要说的话,然后点击“skip”跳转到页面2,该页面可以显示之前在输入框中输入的话。
完整代码构造如下:
main.go
该部分代码主要用于获取运行的端口。首先设置一个默认端口:
if len(port) == 0 {
port = "8888"
}//设置默认监听端口为8888
然后,从命令行获取端口,如果命令行中未含有端口,则将端口置为默认端口:
curPort := pflag.StringP("port", "p", "8888", "Port for listening")
pflag.Parse()
if len(*curPort) != 0 {
port = *curPort
}//从命令行中获取指定的监听端口
server.go
该部分中,首先用binding包定义一个结构体Post,binding包可以自动把POST的数据从JSON格式自动转化为go中自己定义的数据结构:
type Post struct {
MyWord string `form:"MyWord" binding:"required"`
}//用binding包定义一个结构体Post
然后用Classic()方法创建了一个典型的Martini实例m。
接下来用m.Get("/", func() string { … })接收对\的GET方法请求,第二个参数是对一请求的处理方法。这里的处理方法设为,先获取当前系统时间,然后渲染index模板:
m.Get("/", func(r render.Render) {
t := time.Now().Format(time.UnixDate)
r.HTML(200, "index", map[string]interface{}{"Time": t})
}) //GET请求,获取当前时间,并渲染index模板,传入获取的时间信息
index模板中,设置了接收的时间显示:
<p class="time">{{.Time}}</p>
下面是index模板中想要说的话的显示:
<form method="post" action="/">
<p>myWord:</p>
<input type="text" name="MyWord"><br />
<input type="submit" value="skip" id="submit">
</form>
Post方法中,将上面表单中填写的word信息用来渲染info模板:
m.Post("/", binding.Bind(Post{}), func(post Post, r render.Render) {
p := Post{MyWord: post.MyWord}
r.HTML(200, "info", map[string]interface{}{"post": p})
}) //POST请求,渲染info模板,传入页面1填写的话语内容
最后在main.go设置的端口处开始运行:
m.RunOnAddr(":" + port)
运行结果
二. 使用 curl 测试
使用命令:
curl -v http://localhost:8888
-v用来显示客户端与服务端收发数据的详细信息,得到输出如下,其中content的输出内容即为当前显示页面的html内容:
三. 使用 ab 测试
因为我是在windows环境下运行的golang,所以需要先下载Apache包,下载地址如下:
下载地址
下载完毕后进行解压,终端进入到bin目录下,执行命令:
ab -n 1000 -c 100 http://localhost:8888/
其中的参数表示:
ab:http请求
-n:测试几次
-c: 模拟多少客户端
所以此处表示往 http://localhost:8888/发送了1000个请求测试,共100个客户端并发。得到结果如下,可以看见总共花费了7.258s来完成测试: