.NET Core 3.1 下Rest API 与 GRPC 性能测试比较

首先看看GRPC的定义:

gRPC 是一种与语言无关的高性能远程过程调用 (RPC) 框架。

gRPC 的主要优点是:

  1. 现代高性能轻量级 RPC 框架。
  2. 协定优先 API 开发,默认使用协议缓冲区,允许与语言无关的实现。
  3. 可用于多种语言的工具,以生成强类型服务器和客户端。
  4. 支持客户端、服务器和双向流式处理调用。
  5. 使用 Protobuf 二进制序列化减少对网络的使用。

这些优点使 gRPC 适用于:

  1. 效率至关重要的轻量级微服务。
  2. 需要多种语言用于开发的 Polyglot 系统。
  3. 需要处理流式处理请求或响应的点对点实时服务。

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我们可以实现异步的请求,从而大大提高了通信效率。