gRPC是谷歌推出的一款高性能开源RPC框架,具有性能开销小、传输效率高、支持多种编程语言的特点,在微服务架构中广泛使用,gRPC能够和Kubernetes/Istio服务网格体系良好集成,是该架构下RPC方案的首选之一。
gRPC底层使用HTTP2协议实现网络通信,使用protobuf进行数据序列化和反序列化,原生支持C、Java、Go三种编程语言,Java中网络通信部分使用Netty框架实现,对于NodeJS、C#、Python等其它编程语言的支持则是通过C语言支持间接实现的。
官方网站:https://grpc.io/
官方Github仓库:https://github.com/grpc
gRPC具有如下优势:
应用广泛:由于gRPC有Google公司背书,目前gRPC归属于CNCF基金会的项目,应用比较广泛且生态良好,gRPC也能够和Kubernetes/Istio服务网格体系无缝集成。
跨语言支持:不像Java中的一些专有技术(如RMI、Dubbo等),gRPC支持大部分主流开发语言和框架,比如Java、Go、C、NodeJS、Python、C#等均能集成gRPC。
高性能:gRPC底层使用protobuf对数据进行序列化和反序列化,网络通信协议则采用HTTP2,性能要远高于Restful、SOAP等基于文本和HTTP网络协议的RPC方式。
强类型:protobuf通过自定义的IDL定义消息,它采用强类型语法,满足工业级的使用场景。
流式处理:gRPC基于HTTP2进行通信,对异步进行了支持,还能够实现流式客户端、流式服务端、以及全双工通信,这是Restful、SOAP等RPC方式所不具备的。
当然,gRPC也有一些缺点,比如使用方法复杂(比如Java中相对于OpenFeign和JSON实现微服务,gRPC使用明显更复杂)等。一般来说,对于性能要求不高的微服务工程,我们还是推荐优先考虑JSON方式通信,毕竟使用简单,而且文本可读性更好,定位问题更方便;而对于有一定性能要求的服务,则推荐优先考虑gRPC实现。二者并不是互斥的关系,我们可以根据实际情况结合使用。
基于HTTP2协议,gRPC支持如下4种通信方式:
前一篇关于protobuf
的笔记中,我们只介绍了如何定义消息结构。对于gRPC,我们还需要在.proto
文件中定义gRPC接口,下面是一个例子。
service DemoService {
rpc foo(DemoRequest) returns (DemoResponse) {}
}
代码中,service
关键字定义接口名,rpc
关键字定义接口的具体方法,其中包含方法名、传入参数和返回值。其中,DemoRequest
和DemoResponse
是我们定义的入参和返回值消息,它们都需要使用message
关键字定义。
使用gRPC前我们需要安装protoc
编译器,有关这部分内容可以参考上一篇关于protobuf
的介绍。不同编程语言的开发环境搭建可能各不相同,具体方法我们会在后续章节中结合具体使用场景进行介绍。