golang分层测试之http压测脚本编写(1)

前言

  • 过了很长一段时间,最近终于有空续编golang分层测试,前面的一些文章已经讲述过关于golang的单元测试和http的接口测试,从本文就开始讲关于如何使用golang进行http接口压测,从自己编码到使用一些压测工具来讲述

多线程并发-Goroutines

  • Goroutines 可以理解为golang的微小轻量级线程,创建一个 goroutine ,只需要把 go 关键字放在函数调用语句前,就像创建了一个线程一样,但是它比线程更小,十几个goroutine可能体现在底层就是五六个线程。执行goroutine只需极少的栈内存(大概是4~5KB),当然会根据相应的数据伸缩。也正因为如此,可同时运行成千上万个并发任务。goroutine比thread更易用、更高效、更轻便
    代码如下:
package main


import (
    "fmt"
    "time"
)

//并发执行的方法
func compute(value int) {
    for i := 0; i < value; i++ {
        time.Sleep(time.Second)
        fmt.Println(i)
    }
}

func main() {
    fmt.Println("Goroutine Println")

    //启动两个goroutines 

    go compute(10)
    go compute(10)

   time.Sleep(time.Second * 1)
}
  • 这样可以尝试查看一下输出,就可以看到并行的效果,同时主线程为了等待goroutine都运行完毕,不得不在程序的末尾使用time.Sleep() 来睡眠一段时间,等待其他线程充分运行。对于简单的代码,100个for循环可以在1秒之内运行完毕,time.Sleep() 也可以达到想要的效果

使用Goroutines编写压测脚本

  • 大概了解了Goroutines之后我们就可以尝试一下编写http的并发脚本
package main

import (
    "fmt"
    "net/http"
    "strings"
    "time"
)

var(
        no =0
        ok =0 //记录请求成功失败数
        useTime = 0.0 //使用时间
        num=100 //并发个数
)

func main() {
        startTime := time.Now().UnixNano()//记录并发开始时间
        goroutinetest(num)
        endTime := time.Now().UnixNano()
        useTime = float64(endTime-startTime) / 1e9 //记录所有请求完成时间
        fmt.Println("响应成功数:",ok)
        fmt.Println("相应失败数:",no)
        fmt.Println("qps :", fmt.Sprintf("%.4f", float64(num)/useTime))
}

func goroutinetest(num int) {
        for i := 0; i < num; i++ {
            go postdata()
        }
        time.Sleep(time.Second * 1)
}

func postdata(){
    resp, err := http.Post("http://www.baidu.com", "application/x-www-form-urlencoded", strings.NewReader("id=1"))
    if err != nil {
        panic(err)
    }
    //关闭连接
    defer resp.Body.Close()

    if resp.StatusCode != 200 {no += 1}//使用响应吗作为断言
    else{ok += 1}
}
  • 使用上面的代码执行查看一下效果
go run godemotest3.go
响应成功数: 100
相应失败数: 0
qps : 99.9300
  • 简单地通过使用goroutines就能起到并发发起请求,从而起到压测的效果,goroutines作为golang并发编程的一个很核心的组件,除了我们可以使用来做压测,还有需要场景可以应用到,大家可以后期继续探究

小结

  • 压测的核心就是懂得怎么使用并发和做好阻塞,golang中goroutines是并发的扛把子,接下来的一篇文章将会讲述怎么场景化的通过golang写压测脚本,敬请期待
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,258评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,335评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,225评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,126评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,140评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,098评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,018评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,857评论 0 273
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,298评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,518评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,678评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,400评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,993评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,638评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,801评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,661评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,558评论 2 352

推荐阅读更多精彩内容