本文为译文 作者: ALEX PLIUTAU 原文地址: http://pliutau.com/benchmark-grpc-protobuf-vs-http-json/
服务之间通信的最简单的解决方案是使用JSON over HTTP。尽管JSON具有许多明显的优点(比如它具有很好的可读性,易于理解,且通常性能良好),但它还是有一些问题的。在局域网内的数据交互,Google的Protocal Buffer这种结构编码是比JSON更好的选择。
gRPC默认使用protobuf,它更快,因为它是二进制的且是类型安全的。我编写了一个演示项目,使用JSON over HTTP与使用gRPC API的方式进行了一次基准测试。
该库包含2个相同的API:基于Protobuf的gRPC和JSON over HTTP。目的是进行两种方式的基准测试,并对结果进行比较。API只包含一个创建用户的接口,请求(Request)的过程包含验证的步骤。在2种方式的程序中,请求、验证和响应这几个步骤都是相同的,所以我们只是测试整个响应过程。当然,基准测试还包括响应解析。
我使用Go 1.9,结果表明,gRPC性能是JSON over HTTP的10倍:
BenchmarkGRPCProtobuf-8 10000 197919 ns/op
BenchmarkJSONHTTP-8 1000 1720124 ns/op
重新启动应用程序,我使用性能测试工具pprof
对API服务器进行了30秒的请求,命令行如下:
go tool pprof http://localhost:6060/debug/pprof/profile
go tool pprof http://localhost:6061/debug/pprof/profile
我每次运行pprof
后使用top
中查看CPU使用情况,结果显示,Protobuf的资源消耗较少,是Http消耗资源的的70%。
如果要自己测试,可以复制此库https://github.com/plutov/benchmark-grpc-protobuf-vs-http-json的代码并运行:
glide i
go run grpc/main.go
go run json/main.go
go test -bench=.
很明显,在内部网络通讯时最好是使用gRPC,客户端调用将更加简洁,您不必担心数据的序列与反序列化,因为这些gRPC都为您提供了。