GoReplay是什么
最恐怖的事情莫过于生产环境来了问题,可能是突然流量大了,也可能是接收到了奇怪的参数,在监控
、日志不全
的情况下,心态肯定崩了。这时候,GoReplay就应该出场了。
1 | bash复制代码监控和日志也要做好啊喂(#`O′) |
GoReplay是Go语言写的一个网络流量(http)转发的应用,无需侵入代码或者修改现有配置。配置简单,单文件命令行即可部署。
通过监听网卡,直接录制请求,后续可以进行流量回放、压力测试、监控等。
实现原理
图中Capture netowrk
部分是基于pcap
实现的,使用BPF设置指定端口的过滤表达式
1 | 复制代码是不是想到了tcpdump,所以对于比较复杂的流量,更推荐使用tcpcopy来进行流量复制 |
常见用法
1 | bash复制代码# 1. 简单的 HTTP 流量复制: |
我在什么场景下使用了
线上某个程序平稳运行了很久,最近阿里云监控一直报警带宽。由于老旧项目没有接入prometheus,并不是很清楚实际运行情况,所以准备用GoReplay录制线上流量,然后对接口进行分析。
首先肯定先将线上流量保存下来,使用root运行命令行
1 | bash复制代码./gor --input-raw :7018 \ # 设置监听端口 |
分块读取
1 | go复制代码// 通过回调函数,在外面解析具体的请求 |
实现bufio.SplitFunc
1 | go复制代码// copy from bufio.ScanWords |
结语
完整代码放在Gist上了
这次实战的收货
- 对http的流量有了更深一步的理解。经过统计分析,实际上http header占据了很大一部分流量
- 对于请求频次的很高的接口,通过合并上报接口、延长轮训返回时间等手段,可以极大的降低流量
- 调用一些不常用的接口
http.ReadRequest
、http.ReadResponse
- 为了优化读取性能,自己实现了
bufio.SplitFunc
本文转载自: 掘金