最近项目上做服务间通信准备用gRPC,听说快,但是到底效果怎么样呢?
按照网上入门教程使用VS模板建了一个gRPC项目,不测不知道,居然比WebApi慢。
后来搜索到 RiccoYuan 的文章 .netcore - gRPC vs WebApi 耗时比较
他也提到gRPC比WebAPI还慢,不过他在测试中加入了按照官网教程创建的Console版本,这个版本倒是很快。
下面是他的测试结果(我也加入GrpcServiceConsoleApp,测试结果跟他一样)
最后 RiccoYuan 还在官方仓库提了个issue,不过官方直接说 it is still faster than JSON + WebAPI.
后来我又看到了一位越南小哥 Thang Chung 的博客
Performance benchmark: gRPC vs. REST in .NET Core 3 Preview 8
张队的文章在此基础上升级到了.NET Core 3.1并进行了测试
.NET Core 3.1 的REST 和gRPC 性能测试
得出结论:
当接口返回的数据量比较小时候,REST 的性能要比gRPC要好,当数据量变大之后gRPC的性能优势就比较明显了。
我也下载了张队的代码进行了测试,结果一致。
为什么我测小数据量的时候,gRPC还是不如WebApi呢?!
我循环100次请求 结果如下:
经过对比代码我发现了差别:
我按照网上及微软官方教程创建的客户端代码:
var channel = GrpcChannel.ForAddress("https://localhost:5001");var client = new Greeter.GreeterClient(channel);
越南小哥的代码,也是上面提到gRPC官网的Console版本客户端代码(这个方法比上面快哦):
var channel = new Channel("127.0.0.1:5000", ChannelCredentials.Insecure); var client = new Greeter.GreeterClient(channel);
修改代码后再来,我多跑了几遍供大家参考,提升迅猛有木有:
上面的测试我是在循环内部创建Channel的,既然这么耗时,那我把最初的代码中的创建部分放到循环外部,果然跟我想的一样,性能好了很多:
从 RiccoYuan 测试结果的图片也能看出来这个问题。
综上所述:创建Channel是关键(微软gRPC的介绍中也提到,如下图),还是采用gRPC官方的方式吧。
如果就想用微软的,尽量重用,避免频繁的创建操作。
写在最后:我没去研究这两种创建方式到底差在哪里,有大神如果清楚也可以在下面留言,告诉我一下,谢谢啦。