前言前段时间,一个项目即将上线,需要对核心接口进行测试;由于我们的接口是gRPC协议,所以我们发现压测工具不像HTTP那么多。终于找到了ghz这个工具,也很全。后来就想为什么gRPC压力测试的工具这么少。有什么困难?为了验证这个问题,我打算自己写一个工具。完成功能前后的相关功能大概用了一个周末的时间。https://github.com/crossoverJie/ptg/也是一个命令行工具,使用效果如上图;完整的命令如下:NAME:ptg-Performancetestingtool(Go)USAGE:ptg[globaloptions]command[commandoptions][arguments...]COMMANDS:help,hShowsalistofcommandsorhelpforonecommandGLOBALOPTIONS:--threadvalue,-tvalue-t10(default:1thread)--Requestvalue,--protovalue-protohttp/grpc(default:http)--protocolvalue,--pfvalue-pf/file/order.proto--fully-qualifiedvalue,--fqnvalue-fqnpackage.Service.Method--durationvalue,-dvalue-d10s(default:Durationoftestinseconds,Default10s)--requestvalue,-cvalue-c100(default:100)--HTTPvalue,-Mvalue-mGET(default:GET)--bodyPathvalue,--bodyvalue-bodyPath.json--headervalue,-HvalueHTTPheadertoaddtorequest,e.g."-HContent-Type:application/json"--targetvalue,--tgvaluehttp://gobyexample.com/grpc:127.0.0.1:5000--help,-hshowhelp(default:false)考虑到受众,同时支持HTTP和gRPC接口压测。gRPC压测需要更多参数:ptg-t10-c100-protogrpc-pf/xx/xx.proto-fqnhello.Hi.Say-bodytest.json-tg"127.0.0.1:5000"例如需要提供proto文件的路径,具体的请求参数,请求接口的全路径名。目前只支持最常见的unarycall,后续有需要的可以推流。同时还支持压力测量时间和次数。想体验安装的朋友,如果你本地有go环境,直接运行:gogetgithub.com/crossoverJie/ptg没有环境也没关系,你可以在release上下载你环境对应的版本页面并解压以供使用。https://github.com/crossoverJie/ptg/releases设计模式在整个开发过程中还有几个点想和大家分享一下。首先是设计模式。因为在设计之初就考虑到需要支持不同的压力测量模式(次数,时间;其他模式也可以后期加入)。于是我根据压测的生命周期定义了一组接口:type(Modelinterface{Init()Run()Finish()PrintSate()Shutdown()})从名字也能看出来,对应:Pressure测试初始化??运行测压停止测压打印测压信息关闭程序、释放资源和实现两种不同的模式。这其实就是一个典型的依赖倒置原则。程序员应该依赖抽象接口编程,而不是依赖具体的实现。其实大白话就是我们常说的Java面向接口编程;这种编程技术通常用于开发框架、SDK或具有多种实现的业务。好处当然是显而易见的:定义了接口后,不同的业务只需要根据接口实现自己的业务,完全不会相互影响;维护和扩容都非常方便。支持HTTP和gRPC也是同样的实现方式:type(Clientinterface{Request()(*Response,error)})当然前提是前期的接口定义需要考虑周到,接口定义以后不能经常修改,这样的接口起来就没有意义了。关于goroutine还有一点不得不感叹,goroutine+select+channel的并发编程模型真的很好用,非常容易理解。很容易写出一组并发代码:func(c*CountModel)Init(){c.wait.Add(c.count)c.workCh=make(chan*Job,c.count)fori:=0;i
