gRPC简介
gRPC(Google Remote Procedure Call,gRPC)是一种开源的高性能远程过程调用框架,为管理和配置网络设备提供了一种API接口设计的方法。它可以使用协议缓冲区(Protocol Buffers)作为接口定义语言(IDL)和消息交换格式。
协议缓冲区:是由Google开发的一种语言无关、平台无关的数据序列化方法。它用于序列化结构化数据,类似于XML,但比XML更小、更快、更简单。协议缓冲区被广泛用于通信协议、数据存储等多种场景。
- 定义服务接口:在gRPC中,协议缓冲区用作定义服务接口的语言。这包括定义服务中可以远程调用的方法、这些方法的参数类型和返回类型。使用协议缓冲区编写的.proto文件,为gRPC服务和其操作提供了清晰、结构化的定义。
- 定义消息交换格式:除了定义服务接口,协议缓冲区还用于序列化和反序列化在网络上传输的数据。这意味着当gRPC客户端和服务器通信时,它们使用协议缓冲区定义的格式来编码(序列化)和解码(反序列化)发送和接收的消息。协议缓冲区提供了一种高效、紧凑的方式来表示数据,这对于提高网络通信的性能和效率非常重要。
- 通过序列化和反序列化提升传输效率:GPB编码格式的内容只是提供给操作者阅读的,实际上并不会以这种文本形式进行传输,而是以序列化后的二进制数据进行传输。而JSON编码格式则以数据文本形式呈现,传输时也以数据文本形式传输,所以GPB编码格式的传输效率相对JSON、XML编码格式有着天然的优势。
在gRPC中,客户端应用可以直接调用不同机器上服务器应用的方法,就像调用本地对象一样,便于创建分布式应用和服务。gRPC基于定义服务的概念,指定可以远程调用的方法及其参数和返回类型。服务器端实现这些接口,并运行gRPC服务器来处理客户端调用。客户端有一个存根,提供与服务器相同的方法。
gRPC客户端和服务器可以在各种环境中运行和通信,包括在Google内部服务器到个人桌面,并且支持多种语言。
Ref link:
交互过程
gRPC采用客户端和服务端模型,以网络设备为gRPC客户端,采集器为gRPC服务器为例,说明gRPC的交互过程:
设备在开启gRPC功能后作为gRPC客户端,采集器作为gRPC服务器。
- 设备会根据应用服务(如订阅的事件)构建对应数据的格式(GPB/JSON),通过ProtoBuf(Protocol Buffers)编写Proto文件。然后,设备与采集器建立gRPC通道,通过gRPC协议向采集器发送请求消息。
- 采集器收到请求消息后,会通过ProtoBuf解译Proto文件,还原出事先定义好的数据结构,进行业务处理。
- 采集器处理完数据后,需要使用ProtoBuf重新编译应答数据,通过gRPC协议向设备发送应答消息。
- 设备收到应答消息后,结束本次的gRPC交互。
简单地说,设备主动和采集器建立gRPC连接,将设备上配置的订阅数据推送给采集器。在整个gRPC交互的过程中,设备和采集器都需要使用ProtoBuf来定义Proto文件。
性能基准测试(benchmarking)
概述
gRPC旨在为分布式应用的高性能和高效率设计提供支持。持续的性能基准测试是gRPC开发工作流程的关键部分。多语言性能测试每隔几小时对master分支进行一次,测试结果报告到仪表板进行可视化展示。
多语言性能仪表板 @master(最新开发版本):https://grafana-dot-grpc-testing.appspot.com/?orgId=1
传统仪表板(数据与上面相同):https://performance-dot-grpc-testing.appspot.com/explore?dashboard=5180705743044608
性能测试设计
每种语言都实现了一个执行gRPC WorkerService的性能测试工作者(performance testing worker)。gRPC WorkerService指导工作者扮演基准测试中的客户端或服务器,代表BenchmarkService。该服务有两种方法:
- UnaryCall – 一个简单请求的单次RPC,指定响应中返回的字节数。
- StreamingCall – 允许重复请求和响应消息往返的流式RPC,类似于UnaryCall。
这些工作者由驱动程序控制,输入包括场景描述(JSON格式)和指定每个工作进程 主机:端口 的环境变量。
测试语言
以下语言可以在master上持续进行客户端和服务器的性能测试:C++、Java、Go、C#、Node.js、Python、Ruby
除了作为性能测试的客户端和服务器端运行外,所有语言都作为客户端对C++服务器进行测试,以及作为服务器对C++客户端进行测试。这项测试旨在 在不测试另一方的前提下 提供给定语言的客户端或服务器实现的当前性能上限。
尽管PHP或移动环境不支持性能测试所需的gRPC服务器,但可以使用用另一种语言编写的代理WorkerService对其客户端性能进行基准测试。这段代码已为PHP实现,但尚未进入持续测试模式。
测试场景
在上述仪表板中展示的几个重要测试场景包括:
- 无竞争的时延 –只有1个客户端使用StreamingCall一次发送一条消息 时的中位数和尾响应延迟。
- 尾延迟:指在性能下降与随机干扰的情况下,占所有延迟敏感请求中第90%分位、95%分位或99%分位的延迟,它们往往远高于平均延迟,而对于延迟敏感服务,这些尾延迟导致了非常差的用户体验,所以如何正确评估云平台在尾延迟性能上的表现一直是企业界关注的重要问题。
- QPS –当有2个客户端和总共64个频道,每个频道使用StreamingCall一次发送100条消息时的每秒消息数。
- 可扩展性(对选定语言) – 每个服务器核的每秒消息数。
大多数性能测试使用安全通信和protobufs。一些C++测试还使用不安全通信和通用(非protobuf)API来展示峰值性能。将来可能会增加额外的场景。
测试基础设施
所有性能基准测试都在专用的GKE集群中运行,其中每个基准测试工作者(客户端或服务器)被安排到工作池中的不同GKE节点(每个GKE节点是一个单独的GCE虚拟机)。基准测试框架的源代码在test-infra github仓库中公开。
大多数测试实例是8核系统,用于延迟和QPS测量。对于C++和Java,还支持在32核系统上进行QPS测试。所有QPS测试都使用2台相同的客户端机器对每个服务器进行,以确保QPS测量不受客户端限制。
Ref link:
https://grpc.io/blog/performance-benchmarks-gke/
GitHub - grpc/test-infra: Repo for gRPC testing infrastructure support code
部署方法https://github.com/grpc/test-infra/blob/master/doc/deployment.md
非官方的开源测试工具ghz:
https://github.com/LesnyRumcajs/grpc_bench
https://www.lixueduan.com/posts/grpc/10-benchmark/