gRPC(二)|青训营笔记

116 阅读4分钟

这是我参与「第四届青训营 」笔记创作活动的第2天

服务定义

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

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

message HelloRequest {
  string greeting = 1;
}

message HelloResponse {
  string reply = 1;
}

gRPC 允许定义四种服务方法:

  • Unary RPC,其中客户端向服务器发送单个请求并获取单个响应,就像普通的函数调用一样。

    rpc SayHello(HelloRequest) returns (HelloResponse);
    
  • Server streaming 服务器流式处理 RPC,其中客户端向服务器发送请求并获取流以读回一系列消息。客户端从返回的流中读取,直到没有更多消息。gRPC 保证单个 RPC 调用中的消息排序。

    rpc LotsOfReplies(HelloRequest) returns (stream HelloResponse);
    
  • Client streaming 客户端流式处理 RPC,其中客户端写入一系列消息并将其发送到服务器,再次使用提供的流。客户端完成写入消息后,它将等待服务器读取这些消息并返回其响应。同样,gRPC 保证单个 RPC 调用中的消息排序。

    rpc LotsOfGreetings(stream HelloRequest) returns (HelloResponse);
    
  • Bidirectional streaming 双向流式处理 RPC,其中双方都使用读写流发送一系列消息。这两个流独立运行,因此客户端和服务器可以按照它们喜欢的任何顺序进行读取和写入:例如,服务器可以等待接收所有客户端消息,然后再写入其响应,或者它可以交替读取消息然后写入消息,或者其他一些读取和写入的组合。将保留每个流中消息的顺序。

    rpc BidiHello(stream HelloRequest) returns (stream HelloResponse);
    

使用接口

从文件中的服务定义开始,gRPC 提供协议缓冲区编译器插件来生成客户端和服务器端代码。gRPC 用户通常在客户端调用这些 API,并在服务器端实现相应的 API。.proto

  • 在服务器端,服务器实现服务声明的方法,并运行 gRPC 服务器来处理客户端调用。gRPC 基础结构解码传入请求、执行服务方法并对服务响应进行编码。
  • 在客户端,客户端具有一个称为 stub 的本地对象(对于某些语言,首选术语是 client),该对象实现与服务相同的方法。然后,客户端只需在本地对象上调用这些方法,将调用的参数包装在适当的协议缓冲区消息类型中 - gRPC 负责将请求发送到服务器并返回服务器的协议缓冲区响应。

同步与异步

在响应从服务器到达之前阻止的同步 RPC 调用是 RPC 所期望的过程调用的抽象最接近的近似值。另一方面,网络本质上是异步的,在许多情况下,能够在不阻塞当前线程的情况下启动RPC是很有用的。

大多数语言中的 gRPC 编程 API 具有同步和异步两种风格。

metadata 元数据

元数据是有关特定 RPC 调用(如身份验证详细信息)的信息,采用键值对列表的形式,其中键是字符串,值通常是字符串,但可以是二进制数据。

键不区分大小写,由 ASCII 字母、数字和特殊字符 、 组成,并且不得以 开头(这些字符是为 gRPC 本身保留的)。二进制值键以 结尾,而 ASCII 值键则不以 结尾。-``_``.``grpc-``-bin

元数据对 gRPC 本身是不透明的 - 它允许客户端提供与对服务器的调用相关联的信息,反之亦然。

对元数据的访问取决于语言。

channel 通道

gRPC 通道提供与指定主机和端口上的 gRPC 服务器的连接。它在创建客户端存根时使用。客户端可以指定通道参数来修改 gRPC 的默认行为,例如打开或关闭消息压缩。通道具有状态,包括 和 。connected``idle

gRPC 如何处理关闭频道取决于语言。某些语言还允许查询通道状态。