golang web

golang web简单应用开发、配置与测试

Posted by tomylee on November 12, 2017

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