web 框架与选择综合症
经过程序员多年自由发挥,你现在不得不面临海量的选择,有轻量级(做小部件,模仿 tonardo)、中重量(模仿 python Flask, 只提供 MVC 基础服务)、重量级(Java MVC,ORM 等等)。以下仅是建议:
- 简单应用:应选择自带库 net/http
- 一般 web 应用与服务开发:建议选择轻量组件 gorilla/mux + codegangsta/negroni + …
- web 开发: beego、Martini、revel ……
本次使用的web开发框架是Martini,Martini 是一个非常新的 Go 语言的 Web 框架,使用 Go 的 net/http 接口开发,类似 Sinatra 或者 Flask 之类的框架,也可使用自己的 DB 层、会话管理和模板。Martini框架在GitHub上都有中文的解释以及用法,比较容易上手。
特性:
1.使用非常简单
2.无侵入设计
3.可与其他 Go 的包配合工作
4.超棒的路径匹配和路由
5.模块化设计,可轻松添加工具
6.大量很好的处理器和中间件
7.很棒的开箱即用特性
8.完全兼容 http.HandlerFunc 接口.
示例代码:
package main
import "github.com/codegangsta/martini"
func main() {
m := martini.Classic()
m.Get("/", func() string {
return "Hello world!"
})
m.Run()
}
请求处理器:
m.Get("/", func() {
println("hello world")
})
m.Get("/", func(res http.ResponseWriter, req *http.Request) { // res and req are injected by Martini
res.WriteHeader(200) // HTTP 200
})
<一>首先使用命令go get从Github上下载或更新Martini的代码包及其依赖包。一>
go get github.com/go-martini/martini
<二>main.go以及server.go代码的编写,此处不再赘述,对于重要函数解释体现在代码中。二>
<三>编译运行,开始监听我设置的8080端口。三>
<四>打开http://localhost:8080/查看输出结果。四>
<五>curl测试,用户程序可读性良好,程序扩展自然,几乎没有任何累赘。五>
<六>使用命令ab执行Apache web 压力测试程序六>
ab命令结果解释,以一次测试结果为例:
Document Path: / ###请求的资源
Document Length: 28 bytes ###文档返回的长度,不包括相应头
Concurrency Level: 1 ###并发个数
Time taken for tests: 1.116 seconds ###总请求时间
Complete requests: 5000 ###总请求数
Failed requests: 0 ###失败的请求数
Total transferred: 725000 bytes
HTML transferred: 140000 bytes
Requests per second: 4481.76 [#/sec] (mean) ###平均每秒的请求数
Time per request: 0.223 [ms] (mean) ###平均每个请求消耗的时间
Time per request: 0.223 [ms] (mean, across all concurrent requests) ###上面的请求除以并发数
Transfer rate: 634.62 [Kbytes/sec] received ###传输速率
Connection Times (ms)
min mean[+/-sd] median max
Connect: 0 0 0.0 0 0
Processing: 0 0 0.1 0 4
Waiting: 0 0 0.1 0 4
Total: 0 0 0.1 0 4
Percentage of the requests served within a certain time (ms)
50% 0 ###50%的请求都在0ms内完成
66% 0
75% 0
80% 0
90% 0
95% 0
98% 1
99% 1
100% 4 (longest request)
对压力测试的结果重点关注吞吐率(Requests per second)、用户平均请求等待时间(Time per request)指标:
1、吞吐率(Requests per second):
服务器并发处理能力的量化描述,单位是reqs/s,指的是在某个并发用户数下单位时间内处理的请求数。某个并发用户数下单位时间内能处理的最大请求数,称之为最大吞吐率。
记住:吞吐率是基于并发用户数的。这句话代表了两个含义:
a、吞吐率和并发用户数相关
b、不同的并发用户数下,吞吐率一般是不同的
计算公式:总请求数/处理完成这些请求数所花费的时间,即
Request per second=Complete requests/Time taken for tests
必须要说明的是,这个数值表示当前机器的整体性能,值越大越好。
2、用户平均请求等待时间(Time per request):
计算公式:处理完成所有请求数所花费的时间/(总请求数/并发用户数),即:
Time per request=Time taken for tests/(Complete requests/Concurrency Level)
3、服务器平均请求等待时间(Time per request:across all concurrent requests):
计算公式:处理完成所有请求数所花费的时间/总请求数,即:
Time taken for/testsComplete requests
可以看到,它是吞吐率的倒数。
同时,它也等于用户平均请求等待时间/并发用户数,即
Time per request/Concurrency Level
代码位置:CloudGo