首先看看GRPC的定义:
gRPC 是一种与语言无关的高性能远程过程调用 (RPC) 框架。
gRPC 的主要优点是:
- 现代高性能轻量级 RPC 框架。
- 协定优先 API 开发,默认使用协议缓冲区,允许与语言无关的实现。
- 可用于多种语言的工具,以生成强类型服务器和客户端。
- 支持客户端、服务器和双向流式处理调用。
- 使用 Protobuf 二进制序列化减少对网络的使用。
这些优点使 gRPC 适用于:
- 效率至关重要的轻量级微服务。
- 需要多种语言用于开发的 Polyglot 系统。
- 需要处理流式处理请求或响应的点对点实时服务。
GRPC远程过程调用的最大优点就是高性能,通过protobuf可以将数据序列化为二进制编码,这会大幅减少需要传输的数据量,从而大幅提高性能。
测试项目GitHub地址
https://github.com/luminqiang/RESTvsGRPC
先运行API项目:
dotnet run -p RestAPI.csproj -c Release
再运行GRPC项目:
dotnet run -p GrpcAPI.csproj -c Release
最后运行基准测试项目:
dotnet run -p RESTvsGRPC.csproj -c Release
等待测试结束后,测试结果如下:
BenchmarkDotNet=v0.12.1, OS=Windows 10.0.18362.720 (1903/May2019Update/19H1)
Intel Core i5-9600K CPU 3.70GHz (Coffee Lake), 1 CPU, 6 logical and 6 physical cores
.NET Core SDK=3.1.201
[Host] : .NET Core 3.1.3 (CoreCLR 4.700.20.11803, CoreFX 4.700.20.12001), X64 RyuJIT [AttachedDebugger]
DefaultJob : .NET Core 3.1.3 (CoreCLR 4.700.20.11803, CoreFX 4.700.20.12001), X64 RyuJIT
Method | IterationCount | Mean | Error | StdDev |
---|---|---|---|---|
RestGetSmallPayloadAsync | 100 | 9.244 ms | 0.0597 ms | 0.0558 ms |
RestGetLargePayloadAsync | 100 | 741.352 ms | 3.9088 ms | 3.6563 ms |
RestPostLargePayloadAsync | 100 | 835.936 ms | 4.9780 ms | 4.4129 ms |
GrpcGetSmallPayloadAsync | 100 | 12.143 ms | 0.0586 ms | 0.0548 ms |
GrpcStreamLargePayloadAsync | 100 | 800.875 ms | 6.4187 ms | 6.0041 ms |
GrpcGetLargePayloadAsListAsync | 100 | 130.948 ms | 1.2500 ms | 1.1692 ms |
GrpcPostLargePayloadAsync | 100 | 131.427 ms | 2.6249 ms | 4.4572 ms |
RestGetSmallPayloadAsync | 200 | 18.368 ms | 0.1172 ms | 0.1096 ms |
RestGetLargePayloadAsync | 200 | 1,509.909 ms | 4.7070 ms | 4.4029 ms |
RestPostLargePayloadAsync | 200 | 1,676.551 ms | 6.6714 ms | 5.5710 ms |
GrpcGetSmallPayloadAsync | 200 | 24.336 ms | 0.1501 ms | 0.1172 ms |
GrpcStreamLargePayloadAsync | 200 | 1,598.346 ms | 6.5488 ms | 5.4685 ms |
GrpcGetLargePayloadAsListAsync | 200 | 263.885 ms | 2.1572 ms | 2.0178 ms |
GrpcPostLargePayloadAsync | 200 | 259.290 ms | 3.4813 ms | 3.0861 ms |
- 当接口返回的数据量较小时,REST 的性能要比gRPC要好,当数据量变大之后gRPC的性能优势就比较明显了。
- .NET Core 3的 json 进行了大量的优化, 在处理消息有效负载中的小数据时会产生巨大的差异,但是实际上,对于大数据有效负载,差异就不复存在了。
- 总体来说 gRPC在这一领域仍然是赢家,在业务案例中使用哪种协议的适当策略,通常在与外部世界的外部通信(例如外部服务集成,与前端的通信)中使用REST通信,内部服务之间通信采用gRPC。
因此在大数据量下,同时希望保持较高性能时,应考虑使用RPC进行通信,因为通过protobuf我们可以将数据压缩编码转化为二进制格式,通常传递的数据量要小得多,而且通过http2我们可以实现异步的请求,从而大大提高了通信效率。