校验系统的正确性和可靠性时,仅靠用例场景无法覆盖全生产环境下的所有场景,需要一套引流工具,在系统正式上线前,用线上的请求测试待上线系统,在正常请求下,是否有报错;在数倍请求下,系统的性能瓶颈。引流工具有gor, tcpcopy等,下面介绍 gor,因为其易上手,且功能比较全。
[root@10 ~]# wget --no-check-certificate --no-cookie https://storage.googleapis.com/golang/go1.5.3.linux-amd64.tar.gz
[root@10 ~]# tar -C /usr/local -zxvf go1.5.3.linux-amd64.tar.gz
安装到/usr/local
[root@10 ~]# vim /etc/profile
添加export PATH=$PATH:/usr/local/go/bin
[root@10 ~]# source /etc/profile
[root@10 ~]# go
出现参数信息,则安装成功
The GOPATH environment variable specifies the location of your workspace.
Note that this must not be the same path as your Go installation.
[root@10 ~]# mkdir /data1/gowork
[root@10 ~]# vim /etc/profile
添加export GOPATH=/data1/gowork
[root@10 ~]# source /ect/profile
[root@10 ~]#go get github.com/buger/gor
[root@10 ~]#cd $GOPATH/src/github.com/buger/gor
[root@10 gor]#go build
在当前目录生成 gor 可执行命令
[root@10 gor]# ./gor
Version:
2016/01/24 11:01:01 Required at least 1 input and 1 output
将/data1/gowork/bin/gor 命令建立软链:
ln -s /data1/gowork/bin/gor /usr/bin/gor
执行机器:10.13.1.139
[root@10 goload]# gor --input-raw :20001 --output-http 10.75.0.101:8077
将 10.13.1.139:20001 的请求,同时打到 10.75.0.101:8077
保存请求到文件
[root@10 goload]# gor --input-raw :20001 --output-file requests.gor
回放请求
[root@10 goload]# gor --input-file requests.gor --output-http "10.75.0.101:8077"
只支持 input-file 文件, 如下用例:10x speed
[root@10 goload]# gor --input-file "requests.gor|1000%" --output-http "10.75.0.101:8077"
Version:
2016/01/24 16:07:48 FileInput: end of file
配置较复杂,gor 只需一条命令就能解决问题,tcpcopy 由 3 部分组成,(1).online server(2).Test Server(3).Assistant Server
实例 (tcpcopy1.0 系列使用方法):
在线 adserver 有 2 台,主要供 nginx 调用,所以客户端 IP 地址来自于 nginx 所在机器的 IP 地址,均为同一网段的 IP 地址。
我们假设在线 adserver 机器为 10.100.10.1,10.100.10.2,nginx 所在的机器 ip 地址为:10.100.10.11,10.100.10.12,10.100.10.13,
测试服务器有 10.100.10.31,10.100.10.32(辅助服务器)
其中,10.100.10.31 运行着类似在线 adserver 的应用,端口为 11511,而在线应用端口是 11311
我们在 10.100.10.31 上面添加如下路由:
route add -host 10.100.10.11 gw 10.100.10.32
route add -host 10.100.10.12 gw 10.100.10.32
route add -host 10.100.10.13 gw 10.100.10.32
这里的意思就是说,在测试服务器 10.100.10.31 返回给客户端 10.100.10.11~13 的响应走默认网关 10.100.10.32,但 10.100.10.32 机器其实并没有开启路由模式,所以这些响应包到了 10.100.10.32 机器后,会在 ip 层被 drop 掉,留给我们的机会就是可以在 10.100.10.32 的数据链路层抓到这些响应包。
我们在 10.100.10.32 机器(辅助服务器)上面运行 intercept,用来捕获响应包,命令如下:
执行 intercept 命令(需要 root 权限):
./intercept -i eth0 -F 'tcp and src port 11511' -d
我们在在线机器上面运行 tcpcopy(root 权限):
./tcpcopy -x 11311-10.100.10.31:11511 -s 10.100.10.32 -d
这里 tcpcopy 的含义是复制在线 11311 端口的数据包到 10.100.10.31 上面的 11511 端口中去,-s 指定运行 intercept 所在机器的 ip 地址。
gor 现只支持根据离线文件(--input-file),加速请求;tcpcopy 支持在线流量放大(-n)。