分布式高并发中,如何发挥gRPC的威力?来看看它的底层实现原理!
- 2020 年 4 月 7 日
- 筆記
gRPC是什么
gRPC是什么可以用官网的一句话来概括:
A high-performance, open-source universal RPC framework
所谓RPC(remote procedure call 远程过程调用)框架实际是提供了一套机制,使得应用程序之间可以进行通信,而且也遵从server/client模型。使用的时候客户端调用server端提供的接口就像是调用本地的函数一样。如下图所示就是一个典型的RPC结构图。

gRPC的优点
gRPC和restful API都提供了一套通信机制,用于server/client模型通信,而且它们都使用http作为底层的传输协议(严格地说, gRPC使用的http2.0,而restful api则不一定)。不过gRPC还是有些特有的优势,如下:
- gRPC可以通过protobuf来定义接口,从而可以有更加严格的接口约束条件。
- 另外,通过protobuf可以将数据序列化为二进制编码,这会大幅减少需要传输的数据量,从而大幅提高性能。
- gRPC可以方便地支持流式通信(理论上通过http2.0就可以使用streaming模式, 但是通常web服务的restful api似乎很少这么用,通常的流式数据应用如视频流,一般都会使用专门的协议如HLS,RTMP等,这些就不是我们通常web服务了,而是有专门的服务器应用。)

gRPC+K8S
gRPC目前是k8s生态里的事实标准,而Kubernetes又是容器编排的事实标准。gRPC已经广泛应用于Istio体系,包括:
- Envoy与Pilot(现在叫istiod)间的XDS协议
- mixer的handler扩展协议
- MCP(控制面的配置分发协议)
在Cloud Native的潮流下,开放互通的需求必然会产生基于HTTP/2的RPC。即使没有gRPC,也会有其它基于HTTP/2的RPC。一方面,通过gRPC接入扩展兼具了sdk与RESTful的优势: 支持跨语言调用的同时支持友好安全的接入方式。另一方面,gRPC的stream特性虽然好多答主说用不上,但在服务治理的场景下是非常合适的。轻舟微服务框架就使用了gRPC stream实现心跳检查、配置下发,ServiceMesh服务发现、路由规则的下发用的也是gRPC协议。在这些场景下,gRPC stream成为了很常用的一种手段。
