环境准备:Go语言环境安装、wrk工具安装、HTTP服务框架选择
在开始接口性能压测之前,必须搭建一套完整、可复现的实验环境。本章将依次完成三个核心组件的安装与配置:Go语言运行环境、wrk压测工具以及HTTP服务框架(net/http与gin)。环境的一致性直接决定压测结果的可比性,请严格按照以下步骤操作。
2.1 Go语言环境安装
Go语言是本次压测的服务端实现语言,推荐使用Go 1.21及以上版本,以获得更好的性能与工具链支持。以下为Linux(Ubuntu 22.04)环境下的安装步骤,macOS与Windows用户可参照官方文档调整。
| 步骤 | 命令/操作 | 说明 |
|---|---|---|
| 1 | wget https://go.dev/dl/go1.22.0.linux-amd64.tar.gz |
下载Go二进制包 |
| 2 | sudo rm -rf /usr/local/go && sudo tar -C /usr/local -xzf go1.22.0.linux-amd64.tar.gz |
解压到/usr/local |
| 3 | export PATH=$PATH:/usr/local/go/bin |
添加至PATH(建议写入~/.bashrc) |
| 4 | go version |
验证安装:输出 go version go1.22.0 linux/amd64 |
提示: 如果使用多版本Go开发,推荐安装
g(Go版本管理器)或goenv,便于在不同项目间切换Go版本。压测环境建议固定版本,避免因版本差异引入性能偏差。
2.2 wrk工具安装
wrk是一款轻量级HTTP压测工具,基于epoll(Linux)或kqueue(macOS)实现高性能事件驱动。它支持多线程、自定义Lua脚本,非常适合对Go接口进行基准测试。
2.2.1 编译安装wrk
# 安装依赖(Ubuntu)
sudo apt-get update
sudo apt-get install -y build-essential libssl-dev git
# 克隆wrk仓库
git clone https://github.com/wg/wrk.git
cd wrk
# 编译
make
# 将可执行文件复制到系统路径
sudo cp wrk /usr/local/bin/
# 验证安装
wrk --version
# 输出示例:wrk 4.2.0 [epoll]
2.2.2 wrk基本用法速览
| 参数 | 含义 | 示例 |
|---|---|---|
-t |
线程数 | -t4 |
-c |
并发连接数 | -c100 |
-d |
压测持续时间 | -d30s |
--latency |
输出延迟分布 | --latency |
-s |
指定Lua脚本 | -s script.lua |
注意: wrk默认使用HTTP/1.1,且不支持HTTP/2。如果被测服务启用了HTTP/2,wrk将自动降级为HTTP/1.1。对于HTTP/2压测,建议使用
h2load或ghz(gRPC场景)。
2.3 HTTP服务框架选择:net/http vs gin
Go标准库net/http与第三方框架gin是本次压测的两个核心服务端实现。理解它们的架构差异,有助于后续分析压测数据。
2.3.1 核心差异对比
| 维度 | net/http | Gin |
|---|---|---|
| 路由算法 | 前缀匹配(DefaultServeMux) | Radix Tree(压缩前缀树) |
| 中间件机制 | 需手动实现Handler包装 | 内置中间件链,支持分组 |
| 请求上下文 | 标准http.Request |
gin.Context(封装请求/响应/参数) |
| 性能表现 | 基础路由场景较快 | 复杂路由场景更优 |
| 依赖体积 | 无额外依赖 | 引入第三方包 |
2.3.2 快速启动示例
以下代码分别使用net/http和gin实现一个返回JSON的/api/ping接口,用于后续压测。
// net/http 版本
package main
import (
"encoding/json"
"net/http"
)
func main() {
http.HandleFunc("/api/ping", func(w http.ResponseWriter, r *http.Request) {
w.Header().Set("Content-Type", "application/json")
json.NewEncoder(w).Encode(map[string]string{"message": "pong"})
})
http.ListenAndServe(":8080", nil)
}
// Gin 版本
package main
import (
"net/http"
"github.com/gin-gonic/gin"
)
func main() {
r := gin.Default()
r.GET("/api/ping", func(c *gin.Context) {
c.JSON(http.StatusOK, gin.H{"message": "pong"})
})
r.Run(":8080")
}
关键点: 两个服务监听同一端口(:8080),返回相同的JSON结构。压测时只需切换启动的服务,即可对比两个框架在相同硬件条件下的吞吐量与延迟表现。
2.4 环境验证清单
完成上述安装后,请执行以下验证步骤,确保环境就绪:
- Go环境: 运行
go version确认版本 ≥ 1.21。 - wrk工具: 运行
wrk --version确认输出包含[epoll]或[kqueue]。 - 服务启动: 分别启动 net/http 和 gin 服务,使用
curl http://localhost:8080/api/ping验证返回{"message":"pong"}。 - wrk连通性: 执行
wrk -t2 -c10 -d5s http://localhost:8080/api/ping,观察是否正常输出压测报告。
常见问题: 如果wrk报告“Connection refused”,请检查服务是否已启动、端口是否被占用。使用
sudo lsof -i :8080 查看端口占用情况。
至此,环境准备全部完成。下一阶段将基于此环境,分别对net/http和gin服务执行wrk压测,并对比分析性能数据。