开发 web 服务程序

代码链接

我的代码

概述

开发简单 web 服务程序 cloudgo,了解 web 服务器工作原理。

任务目标

  1. 熟悉 go 服务器工作原理
  2. 基于现有 web 库,编写一个简单 web 应用类似 cloudgo。
  3. 使用 curl 工具访问 web 程序
  4. 对 web 执行压力测试

任务实现

一. 编程web服务程序,类似cloudgo应用

选择框架

本次使用的web开发框架是Martini,Martini框架是使用Go语言作为开发语言的一个强力的快速构建模块化web应用与服务的开发框架。我选择它为框架的主要理由之一是,上手非常简单。
Martini的特性有以下几点:

  1. 使用非常简单
  2. 无侵入设计
  3. 可与其他 Go 的包配合工作
  4. 超棒的路径匹配和路由
  5. 模块化设计,可轻松添加工具
  6. 大量很好的处理器和中间件
  7. 很棒的开箱即用特性
  8. 完全兼容 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)
运行结果

页面1
页面2

二. 使用 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来完成测试:

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值