当前位置: 首页 > 工具软件 > Gor > 使用案例 >

HTTP引流工具Gor快速入门

长孙瑞
2023-12-01

0.背景

校验系统的正确性和可靠性时,仅靠用例场景无法覆盖全生产环境下的所有场景,需要一套引流工具,在系统正式上线前,用线上的请求测试待上线系统,在正常请求下,是否有报错;在数倍请求下,系统的性能瓶颈。引流工具有gor, tcpcopy等,下面介绍gor,因为其易上手,且功能比较全。

1.golang环境

1-1.下载go

https://golang.org/dl/

 [root@10 ~]# wget --no-check-certificate --no-cookie  https://storage.googleapis.com/golang/go1.5.3.linux-amd64.tar.gz

1-2.解压安装包

  [root@10 ~]# tar -C /usr/local -zxvf go1.5.3.linux-amd64.tar.gz

安装到/usr/local

1-3.定义PATH环境变量

  [root@10 ~]# vim /etc/profile

 添加export PATH=$PATH:/usr/local/go/bin

  [root@10 ~]# source /etc/profile

1-4.校验

[root@10 ~]# go

出现参数信息,则安装成功

1-5.GOPATH 环境变量

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

2.gor工具

2-1.编译gor

 [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

2-2.工具部分使用方式

2-2-1.实时引流:

执行机器: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

2-2-2.保存请求到文件并回放

保存请求到文件

[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"

2-2-3.Load testing

只支持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

wiki:https://github.com/buger/gor

3.另一种引流方式:tcpcopy

  1. 机器资源多, gor只需在生产环境机器使用,“tcpcopy运行需要intercept的支持,tcpcopy负责抓包和发包工作,而intercept负责截获应答包”,需要单独一条机器作为intercept, assistant server(运行intercept的机器)原则上必须要和测试服务器(test server)在同一个网段。
  2. 配置较复杂,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地址。

  3. gor现只支持根据离线文件(–input-file),加速请求;tcpcopy支持在线流量放大(-n)。

4.Gor Docker镜像

为了方便部署,制作了Gor的Docker镜像:

docker pull neven7/docker-gor

使用方法:
执行 docker run -i -t –net=host neven7/docker-gor /bin/bash 启动容器;
–net=host: 容器将不会虚拟出自己的网卡,配置自己的IP等,而是使用宿主机的IP和端口。

 类似资料: