本文总阅读量次
项目地址:
项目概述
开发简单 web 服务程序 cloudgo,了解 web 服务器工作原理。
任务目标
- 熟悉 go 服务器工作原理
- 基于现有 web 库,编写一个简单 web 应用类似 cloudgo。
- 使用 curl 工具访问 web 程序
- 对 web 执行压力测试
相关知识
课件:http://blog.csdn.net/pmlpml/article/details/78404838任务要求
基本要求
- 编程 web 服务程序 类似 cloudgo 应用。
- 要求有详细的注释
- 是否使用框架、选哪个框架自己决定 请在 README.md 说明你决策的依据
- 使用 curl 测试,将测试结果写入 README.md
- 使用 ab 测试,将测试结果写入 README.md。并解释重要参数。
实验过程
代码及注释
servce.go
1 | package service |
main.go
1 | package main |
使用框架说明
net/http
Go 语言中处理 HTTP 请求主要跟两个东西相关:ServeMux 和 Handler。
ServrMux 本质上是一个 HTTP 请求路由器(或者叫多路复用器,Multiplexor)。它把收到的请求与一组预先定义的 URL 路径列表做对比,然后在匹配到路径的时候调用关联的处理器(Handler)。
处理器(Handler)负责输出HTTP响应的头和正文。任何满足了http.Handler接口的对象都可作为一个处理器。通俗的说,对象只要有个如下签名的ServeHTTP方法即可:
1 | ServeHTTP(http.ResponseWriter, *http.Request) |
包http提供HTTP客户端和服务器实现
Get,Head,Post和PostForm发出HTTP(或HTTPS)请求 完成后,客户端必须关闭相应主体
Martini
Martini是一个强大为了编写模块化Web应用而生的GO语言框架.
功能列表:
- 使用极其简单.
- 无侵入式的设计.
- 很好的与其他的Go语言包协同使用.
- 超赞的路径匹配和路由.
- 模块化的设计 - 容易插入功能件,也容易将其拔出来.
- 已有很多的中间件可以直接使用.
- 框架内已拥有很好的开箱即用的功能支持.
- 完全兼容http.HandlerFunc接口.
参考链接:Martini
martini 是新锐的框架,只是一个微型框架,只带有简单的核心,路由功能和依赖注入容器inject。但目前我们也不需要自己写依赖什么的,也不用和数据库结合使用所以还是选择简单的。
运行结果
运行测试
1 | go run main.go -p 9000 |
监听端口为9000,在浏览器中输入http://localhost:9000
可以看到hello world
curl测试
curl -v http://localhohst:9000
ab测试
安装Apache web 压力测试程序yum -y install httpd-tools
ab -n 1000 -c 100 http://localhost:9000
命令行参数:
- -n:执行的请求数量
- -c: 并发请求个数
- -t:测试所进行的最大秒数
- -p:包含了需要POST的数据的文件
- -T:POST数据所使用的Content-type头信息
- -k:启用HTTP KeepAlive功能,即在一个HTTP会话中执行多个请求,默认时,不启用KeepAlive功能
结果参数:
- Server Software: 服务器软件版本
- Server Hostname: 请求的URL,被测主机名
- Server Port: 请求的端口号
- Document Path: 请求的服务器的路径
- Document Length: 页面长度 单位是字节
- Concurrency Level: 并发级别,也就是并发数,请求中-c参数指定的数量
- Time taken for tests: 一共使用了的时间
- Complete requests: 总共请求的次数
- Failed requests: 失败的请求次数。因网络原因或服务器性能原因,发起的请求并不一定全部成功,通过该数值和Complete requests相除可以计算请求的失败率,作为测试结果的重要参考
- Total transferred: 总共传输的字节数,指的是ab从被测服务器接收到的总数据量,包括index.html的文本内容和请求头信息,http头信息
- HTML transferred: 实际页面传递的字节数,从服务器接收到的index.html文件的总大小,等于Document Length*Complete requests
- Requests per second: 每秒多少个请求:QPS,这是一个平均值,等于Complete requests/Time taken for tests
- Time per request: 平均每个用户等待多长时间(因为用户不止一个,服务器完成100个请求,平均每个用户才接收到一个完整的返回,所以该值是下一项数值的100倍)
- Time per request: 服务器平均用多长时间处理一个请求
- Transfer rate: 传输速率,对于大文件的请求测试,这个值很容易成为系统瓶颈所在。要确定该值是不是瓶颈,需要了解客户端和被测服务器之间的网络情况,包括网络带宽和网卡速度等信息。
- Connection Times: 传输时间统计:这几行组成的表格主要是针对响应时间也就是第一个Time per request进行细分和统计。一个请求的响应时间可以分成网络链接(Connect),系统处理(Processing)和等待(Waiting)三个部分。表中min表示最小值; mean表示平均值;[+/-sd]表示标准差(Standard Deviation) ,也称均方差(mean square error),这个概念在中学的数学课上学过,表示数据的离散程度,数值越大表示数据越分散,系统响应时间越不稳定。 median表示中位数; max当然就是表示最大值了。
- Percentage of the requests served within a certain time: 确定时间内服务请求占总数的百分比