gRPC基本概念

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具有如下优势:

应用广泛:由于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实现。二者并不是互斥的关系,我们可以根据实际情况结合使用。

gRPC的四种通信方式

基于HTTP2协议,gRPC支持如下4种通信方式:

  1. Unary RPC:最简单也最常用的RPC方式,客户端发送请求服务端返回响应。
  2. Server Stream RPC:服务端以流的形式返回多个消息,客户端可以对多个消息进行监听和异步处理,服务端发送完成后可以主动结束连接,可以用于实现服务端实时推送数据等场景。
  3. Client Stream RPC:客户端以流的形式发送多个消息,服务端可以对多个消息进行监听和异步处理,客户端发送完成后可以主动结束连接,可以用于实现分片上传大文件、Iot设备不断发送消息等场景。
  4. Bidirectional Streaming RPC:服务端和客户端都可以发送多个消息,这可以理解为一种全双工通信,可以用来实现聊天和实时游戏等场景。

在protobuf的IDL中定义gRPC接口

前一篇关于protobuf的笔记中,我们只介绍了如何定义消息结构。对于gRPC,我们还需要在.proto文件中定义gRPC接口,下面是一个例子。

service DemoService {
  rpc foo(DemoRequest) returns (DemoResponse) {}
}

代码中,service关键字定义接口名,rpc关键字定义接口的具体方法,其中包含方法名、传入参数和返回值。其中,DemoRequestDemoResponse是我们定义的入参和返回值消息,它们都需要使用message关键字定义。

gRPC环境搭建

使用gRPC前我们需要安装protoc编译器,有关这部分内容可以参考上一篇关于protobuf的介绍。不同编程语言的开发环境搭建可能各不相同,具体方法我们会在后续章节中结合具体使用场景进行介绍。

作者:Gacfox
版权声明:本网站为非盈利性质,文章如非特殊说明均为原创,版权遵循知识共享协议CC BY-NC-ND 4.0进行授权,转载必须署名,禁止用于商业目的或演绎修改后转载。
Copyright © 2017-2024 Gacfox All Rights Reserved.
Build with NextJS | Sitemap