序言
github地址:https://github.com/tsenart/vegeta
第一次写源码解析的博客,就拿自己最熟悉的压测工具vegeta(贝吉塔)来介绍。本篇文章只介绍vegeta的lib库,也就是vegeta核心的发压功能。
实现思路
首先看下lib库里面的文件目录。
.
├── attack.go // 起压力
├── attack_test.go
├── histogram.go // 柱状图,用于结果统计
├── histogram_test.go
├── lttb
├── metrics.go // 统计指标,进行结果处理
├── metrics_test.go
├── pacer.go // 定速器,用于控制发压速率
├── pacer_test.go
├── plot
├── reporters.go // 产生报告
├── results.go // 一次http请求后的结果
├── results_easyjson.go
├── results_test.go
├── target.schema.json
├── targets.go // 压测目标, 代表http请求
├── targets_easyjson.go
└── targets_test.go
http压测工具发压的过程就像是一次进攻一样。 这里用attack来表示发压的动作, 一次打击(hit)代表一次http请求。 打击的目标(target)代表http接口。 发压的qps叫做打击的速率(rate),用专门的定速器(pacer)来控制发压的qps。
部署环境
分析源码,首先要部署一个能看到源码的环境。平时开发使用vim, 这里就只演示在终端下的操作。
go get -u github.com/tsenart/vegeta
如果遇到timeout的情况,更新go版本到1.12及以上, 设置环境变量
export GOPROXY=https://goproxy.io
export GO111MODULE=on
平常go的项目被我放在~/Workspace/golang/mod
目录下,这里我就新建一个文件夹test. 并执行go mod init test
初始化一个GO项目。
创建一个main.go的文件,并从github上复制粘贴示例代码,加上注释后:
package main
import (
"fmt"
"time"
vegeta "github.com/tsenart/vegeta/lib"
)
func main() {
// 1. 压测时长&速率
rate := vegeta.Rate{Freq: 100, Per: time.Second}
duration := 4 * time.Second
// 2. 压测接口
targeter := vegeta.NewStaticTargeter(vegeta.Target{
Method: "GET",
URL: "