什么是grpc

grpc中,客户端应用程序可以直接调用不同机器上的服务器应用程序上的方法,就像它是本地方法一样,让我们更容易创建分布式应用程序和服务。和其它rpc系统一样,grpc基于定义服务的思想,指定可以远程调用的方法及其参数和返回类型。在服务端,服务端实现这个接口并运行一个grpc服务器来处理客户端调用。在客户端,客户端有一个存根(在某些语言中仅称为客户端),它提供与服务端相同的方法。

grpc

grpc客户端和服务端可以在各种环境中运行和相互通信,并且可以用任何grpc支持的语言编写。因此,grpc是跨语言异构微服务的选择之一。

主要特性:

  • 客户端和服务端之间可跨平台跨语言。
  • 基于高效的protobuf编解码。
  • 基于HTTP/2连接,允许在单个连接上复用多个数据流。

grpc四种服务类型

grpc允许定义四类服务方法,分别如下:

单向RPC

基于传统请求/响应模型,客户端发送一个请求给服务端,服务端回复一个应答,客户端阻塞直到得到结果。

1
rpc SayHello(HelloRequest) returns (HelloReply) {}

使用场景:普通同步远程调用。

服务端流式RPC

客户端发送一个请求给服务端,服务端回应一个响应数据流,客户端可从数据流中一直读取消息直到没有更多消息为止。

1
rpc LotsOfReplies(HelloRequest) returns (stream HelloResponse) {}

使用场景:一次请求,客户端建立连接后,服务端多次返回数据。

客户端流式RPC

客户端以流的形式向服务端发送一系列消息,一旦客户端完成全部消息的写入,就等待服务端读取这些消息并返回其响应。

1
rpc LotsOfGreetings(stream HelloRequest) returns (HelloResponse) {}

使用场景:一次请求,客户端建立连接后,向服务端多次发送数据,待客户端发送完成后,服务端再返回响应。

双向流式RPC

双向流式RPC,客户端和服务端双方使用读写流发送一系列消息。这两个流相互独立,因此客户端和服务端可以按照任意顺序进行读写,例如,服务端可以在写入响应之前等待接收所有客户端的消息,或者它可以交替读取消息然后写入消息,或其它任意的读写组合。保留每个数据流中消息的顺序。

1
rpc BidiHello(stream HelloRequest) returns (stream HelloResponse) {}

使用场景:一次请求,建立连接后,客户端和服务端可向双方发送信息。例如在线聊天室。