使用API

从在一个proto文件中定义一个服务开始,gRPC提供了protocol buffer编译器插件可以用来生成服务端客户端代码。gRPC使用者只需要在客户端调用这些API,在服务端实现对应API即可。

  • 服务端,需要实现RPC服务中定义的方法,并运行gRPC服务器来处理客户端的调用。gRPC的底层会对请求(requests)进行解码,执行服务端方法,然后再编码成响应数据。
  • 客户端,客户端拥有一个本地的对象成为stub,也可以成为client,它与服务一样实现了相同的方法。客户端可以将调用参数包装在合适的protocol buffer的消息类型中,然后在本地对象中调用这些方法。gRPC会替你将请求发送给服务器然后返回服务端的protocol buffer响应。
同步&异步

同步RPC调用会阻塞直到服务端响应到达,这是最接近RPC期望的抽象过程调用。从另一方面,网络本身是异步的,并且许多场景都希望在不阻塞当前线程的情况下调动RPC。

RPC生命周期

在这部分,你会对gRPC客户端调用服务器方法时发生的内容有更详细的认识。如果想要知道更具体的细节就需要知道对应语言是如何实现RPC的。

一元的(Unary)RPC

首先考虑的最简单的RPC类型就是,客户端发送一个单一请求然后得到一个单一响应。

  1. 一旦客户端调用了stub方法(桩方法:类似没有实现具体逻辑的空接口),服务端被提醒RPC发生调用,并且收到客户端发送来本次调用的元数据,方法名,以及对应的响应超时时间。
  2. 服务器可以立马发送回自己的初始化元数据(这步要在任何响应之前就发送),也可以等待用户的请求消息
  3. 一旦服务器收到了客户端的请求消息,它就会做一些必要的工作来产生和填充响应。如果成功的话,然后响应、状态信息(状态码和一些可选的状态消息)以及可选的尾随的元数据就会被发送回客户端。
  4. 如果响应状态码是OK,客户端就会收到响应,客户端请求的调用就调用完成了。
服务器RPC流

服务端流式RPC和一元RPC类似,除了服务端在响应中返回的是一个流式消息给客户端请求。在发送完所有的消息之后,服务端的状态详细信息(状态码和其他可选的状态消息)以及可选的尾随元数据也会被发送给客户端。这就完成了服务端的处理流程,当客户端收到所有消息后,也相应结束流程。

客户端RPC流

客户端流式RPC与一元RPC类似,除了客户端会发送流式消息给服务端而不是单条消息。服务端响应单条消息,消息内也带着状态详细信息和尾随元数据,一次性发送回客户端。如果没有特殊内容需要返回给客户端的话,就只会返回状态详细信息和尾随元数据。

双向RPC流

在双向RPC流中,调用会被初始化,通过客户端唤醒方法以及服务端收到客户端元数据,方法名和超时时间。服务器能够选择发回自己的初始化元数据或者等待客户开始发送消息流。

客户端和服务器流的处理过程是特定于应用程序的,因为两个流式完全独立的,客户端和服务器会乱序读写消息。例如,服务器可以在写消息之前等待直到收到所有的客户端数据,也可以类似打乒乓球一样,服务端客户端反复收发请求和响应。

死线,超时

gRPC允许客户端声明他们的等待时间,超过这个时间RPC还未完成时就会主动终止并抛出一个DEADLINE_EXCEEDED错误。在服务端,服务器可以查询到某个特定的RPC请求是否超时,或者还剩多少时间等待RPC处理完成。
声明死线或者超时时间是特定于开发语言的,一些语言的API语法叫超时timeout(一个时间段),而一些语言的API语法称为死线deadline(一个特定时间点),并且有可能有设置默认值,也有可能没有。

RPC终止

在gRPC中,客户端和服务端都会在自己本地决定RPC是否成功执行,并且他们的结论可能不会相同。这就代表着,可能会服务端日志记录调用成功,而客户端日志记录调用失败。也有可能服务端在客户单还没完全发送完成请求之前就主动完成RPC。

取消RPC

客户端和服务器都有权在任何时候主动取消RPC。取消RPC的动作会马上终结RPC过程,所以不用再做其他处理,而RPC处理过程中发生的持久化的数据变动都无法被回滚

元数据

元数据是关于某个特定RPC调用的详细信息(类似授权信息),他们会被放到json中,key为string,value一般是string,也可以为二进制数据。元数据的内容对gRPC自身是不透明的,它让客户端自己提供调用与该调用相关的信息给服务端,反之也是。
访问元数据是独立于特定开发语言的。

通道

gRPC通道提供了一个连接,可以通过指定的host和port连接到gRPC服务端。当客户端创造stub的时候就会使用到。客户端可以指定通道的参数来修改gRPC的默认行为,例如开关消息的压缩。通道是有状态的,包括connectedidle

gRPC如何关闭通道是不依赖于语言的。一些语言也允许查询通道的状态。

Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐