当前位置: 首页 > 工具软件 > gRPC-rs > 使用案例 >

gRPC Concepts

徐杰
2023-12-01

本文档介绍了一些关键的gRPC概念,概述了gRPC的架构和RPC生命周期。

假设你已经阅读了What is gRPC?有关特定于语言的详细信息,请参阅可用的所选语言的快速入门,教程和参考文档(完整参考文档即将推出)。

概述

服务定义

像许多RPC系统一样,gRPC基于定义服务的思想,指定可以使用其参数和返回类型远程调用的方法。默认情况下,gRPC使用协议缓冲区作为接口定义语言(IDL),
用于描述有效负载消息的服务接口和结构。如果需要,可以使用其他替代品。

service HelloService {
  rpc SayHello (HelloRequest) returns (HelloResponse);
}

message HelloRequest {
  string greeting = 1;
}

message HelloResponse {
  string reply = 1;
}

gRPC可以定义四种服务方式:

  • 一元RPC,客户端向服务器发送单个请求并获得单个响应,就像正常的函数调用一样。
rpc SayHello(HelloRequest) returns (HelloResponse){
}
  • 服务器流RPC,其中客户端向服务器发送请求并获取流以读取一系列消息。客户端读取返回的流,直到没有更多的消息。
rpc LotsOfReplies(HelloRequest) returns (stream HelloResponse){
}
  • 客户端流式RPC,其中客户端写入一系列消息并将其发送到服务器,再次使用提供的流。一旦客户端写完消息,它等待服务器读取它们并返回其响应。
rpc LotsOfGreetings(stream HelloRequest) returns (HelloResponse) {
}
  • 双向流RPC,其中双方使用读写流发送消息序列。这两个流独立运行,所以客户端和服务器可以按照他们喜欢的顺序进行读写:例如,服务器可能会在写入响应之前等待接收所有客户端消息,
    或者它可以交替地读取消息然后写入消息,或读取和写入的其他组合。每个流中的消息顺序被保留。
rpc BidiHello(stream HelloRequest) returns (stream HelloResponse){
}

我们将在下面的RPC生命周期部分中详细介绍不同类型的RPC。

RPC生命周期

现在我们来仔细看一下gRPC客户端调用gRPC服务器方法时会发生什么。我们不会查看实现细节,您可以在我们的特定语言页面中了解更多信息。

一元RPC

首先,我们来看一下最简单的RPC类型,客户端发送单个请求并返回单个响应。

  • 一旦客户端调用存根/客户端对象上的方法,就会通知服务器RPC已被调用,客户端的元数据用于此调用,方法名称和指定的期限(如果适用)。
  • 然后,服务器可以立即发回自己的初始元数据(必须在任何响应之前发送),或等待客户端的请求消息 - 谁先发生由应用程序指定。
  • 一旦服务器有客户端的请求消息,它就可以开始创建和填充其响应所需的任何工作。然后将响应(如果成功)以及状态详细信息(状态代码和可选状态消息)以及可选的尾随元数据返回给客户端。
  • 如果状态为“OK”,则客户机将获得响应,从而在客户端完成该调用。

服务器流式RPC

服务器流RPC类似于我们的简单示例,除了服务器在获取客户端的请求消息之后发送回响应流。在发回所有响应后,服务器端的状态信息(状态码和可选状态消息)和可选的尾随元数据也将被发送回客户端,以此来完成服务端的工作。
客户端完成所有服务器响应后即可完成。

客户端流式RPC

客户端流RPC也类似于我们的简单示例,除了客户端将请求流发送到服务器,而不是单个请求。服务器通常但不一定在收到所有客户端的请求后发回单个响应,其中附带有其状态详细信息和可选的尾随元数据。

双向流RPC

在双向流RPC中,调用由客户端调用方法来初始化,而服务端则接收到客户端的元数据,方法名和截止时间。服务端可以选择发送回它的初始元数据或等待客户端发送请求。下一步怎样发展取决于应用,
因为客户端和服务端能在任意顺序上读写 - 这些流的操作是完全独立的。例如服务端可以一直等直到它接收到所有客户端的消息才写应答,或者服务端和客户端可以像”乒乓球”一样:服务端后得到一个请求就回送一个应答,接着客户端根据应答来发送另一个请求,以此类推。

截止时间

gRPC允许客户端指定在RPC终止之前愿意等待RPC完成的时间,超过这个时间值RPC将结束并返回DEADLINE_EXCEEDED错误。在服务器端,可以查询特定的RPC是否超时,或者还剩多长时间来完成这个RPC。

指定的截止日期或超时时间因语言而异 - 例如,并不是所有语言都有默认的最后期限,某些语言API使用的是固定时间点来指定截止时间,而某些语言API的则使用持续时间来指定截止时间。

RPC终止

在gRPC里,客户端和服务端对调用成功的判断是独立的、本地的,他们的结论可能不一致。这意味着,比如你有一个 RPC 在服务端成功结束(“我已经返回了所有应答!”),到那时在客户端可能是失败的(“应答在最后期限后才来到!”)。也可能在客户端把所有请求发送完前,服务端却判断调用已经完成了。

取消RPC

无论客户端还是服务端均可以再任何时间取消一个RPC 。一个取消会立即终止RPC这样可以避免更多操作被执行。它不是一个”撤销”,在取消前已经完成的操作不会被回滚。

元数据

元数据是特定RPC调用(例如认证细节)对应的信息,这些信息以键值对的形式存在,其中键是字符串,值的类型一般也是字符串(当然也可以是二进制数据)。元数据对于gRPC本身是不透明的 - 它让客户端提供调用相关的信息给服务端,反之亦然。

对于元数据的访问是因语言而异的。

通道

gRPC通道提供与指定主机和端口上的gRPC服务器的连接,被用于创建客户端存根(或仅某些语言的“客户端”)。客户端可以指定通道参数来修改gRPC的默认行为,例如打开和关闭消息压缩。通道具有状态,包括连接和空闲状态。

gRPC处理关闭通道的方式与语言有关。某些语言还允许查询通道状态。

参考链接: gRPC Concepts

 类似资料:

相关阅读

相关文章

相关问答