https://github.com/kevwan/tproxy
介绍
tproxy 是一款代理支持多种协议的代理程序,并监控查看协议内容,收集常规的通信指标如tcp连接数等,支持常见的 http2,mqtt,mongo,grpc,redis
快速图解
代码分析
启动
直接从主入口函数main开始看起
这其中关于flag包较为完整的用法还是值得借鉴的
startListener 建立连接对,并启动连接监视器
监视器
主要记录tcp连接信息如下
- 总计处理过的连接数
- 当前并发连接数
- 历史最大并发连接数
- 连接开始创建的时间
- 连接存活最长的时间
处理客户端请求
接收客户端链接,建立 客户端<->tproxy<->服务端 的连接对,并设置 MultiWriter,MultiReader,将客户端数据与服务端数据发送至io.Pipe 的内存管道,提供给Dump对象,进行打印,同时对 客户端连接 与 服务端连接包装上限流和延迟发送的功能
处理Crtl+C信号的代码
接收 Crtl+C 信号,优雅的停止信号 挺有意思的
连接对
接下来看项目中最重要的代理功能的实现
连接对结构
连接对创建
连接对数据流处理
服务端数据处理
客户端数据处理
连接对关闭
代码细节
贡献说明
在代码细节中说的 可以不用判断 io.Copy 的 io.EOF 的判断被项目作者merge了,😄
https://github.com/kevwan/tproxy/pull/86
如果你看不到评论,那么就真的看不到评论w(゜Д゜)w