Gor,又称为GoReplay,是采用Golang 编写的一个开源的 HTTP 实时流量复制工具。它只需要在 LB 或者 Varnish 入口服务器上执行一个进程,就可以把生产环境的流量复制到任何地方,比如 Staging 环境、Dev 环境。常用于压测及线上问题复现。
Gor支持的常用功能
Gor 支持流量的放大和缩小、频率限制,这样不需要搭建和生产环境一致的服务器集群也可以正确测试。
Gor 还支持根据正则表达式过滤流量,这意味着可以单独测试某个 API 服务。
Gor还可以修改 HTTP 请求头,比如替换 User-Agent, 或者增加某些 HTTP Header 。
Gor 还可以把请求记录到文件,以备回放和分析。Gor 支持和 ElasticSearch 集成,将流量存入 ES 进行实时分
可用输入:
--input-raw - 用于捕获HTTP流量,您应该指定IP地址或接口和应用程序端口。有关捕获和重放流量的更多信息。
--input-file- 接受之前使用的文件--output-file。更多关于保存和从文件重播
--input-tcp - 如果您决定将来自多个转发器Gor实例的流量转发给它,则由Gor聚合实例使用。阅读关于使用Aggregator-forwarder设置。
可用输出:
--output-http - 重放HTTP流量到给定的端点,接受基础URL。阅读[关于它的更多信息](重播HTTP流量)
--output-file - 记录传入的流量到文件。更多关于保存和从文件重播
--output-tcp- 将传入数据转发给另一个Gor实例,并与其一起使用--input-tcp。阅读关于Aggregator-forwarder设置的更多信息。
--output-stdout - 用于调试,输出所有数据到stdout。
Gor 常用实践场景
1、当需要对线上服务进行整体性能压测时,可将线上请求扩大N倍,进行引流,将请求扩大1倍,也可缩小,调整"|"后面的百分比即可。
gor --input-raw :80 --http-allow-method GET --output-http "http://127.0.0.1:8080|200%"
2、流量实时复制引流
gor --input-raw :80 --output-http "http://10.x.x.x:8080"
3、如果目标服务器使用的库与线上机器一样,且只需要引流Get方法的请求。
gor --input-raw :80 --http-allow-method GET --output-http "http://10.x.x.x:8080"
4、只复制某个URL请求,--http-allow-url参数,-http-allow-url参数可用正则表达式(--output-http-url-regexp在gor 0.16已经过期,使用--http-allow-url代替)。
goreplay -input-raw 10.100.x.x:80 --output-http "http://10.200.x.x:80|100%" --http-set-header "Host:rec.api.mgtv.com" --http-allow-url '^/ott/like'
5、多目标服务器的流量复制引流,有点类似nginx的mirror。
gor --input-raw :80 --output-http "http://target_server:8080" --output-http "http://target_server2:8080"
6、性能压力测试(可以将流量复制到文件,然后再对他们进行回放。回放的时候,流量会维持原始的时间间隔。如果你使用了百分比来进行速率限制,那么回放的速率会相应的增加或减少。有了这种速率限制,gor就可以用来进行压力测试。)
gor -input-file="/root/test.gor|500%" -output-http="http://127.0.0.1:80|500%" --input-file-loop --exit-after 30s