GRPC 概览

目前在使用grpc,在这儿做个笔记,以往只大概看了下unary的形式,忽略了stream,在一起开会讨论后,发现大家都不是很理解,在此查下资料做下笔记。

定义服务

grpc的IDL(interface define language)使用的protobuf,当然也可以替换为别的IDL。除了大家熟悉的各种message等的定义外,可以使用 service 来定义一个rpc服务:

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

上述的service服务,描述了一个远程调用服务,调用方的参数为 HelloRequest, 被调用方返回一个 HelloResponse, 就像调用一个函数那么简单。

Unary call

rpc SayHello(HelloRequest) returns (HelloResponse){
}

Unary call非常简单,就像上述的service一样,一个请求一个回应就完成了一个调用请求。大体的执行流程如下:

  1. 当调用方初始化调用的时候,服务方会收到请求被发起的通知,该通知会带上调用方的元数据信息、方法名、超时时间等信息。

  2. 服务方可以选择在返回回应前,返回服务方的初始元数据信息,或者等待请求到来。两者哪个先发生取决于程序。

  3. 当服务方完整的收到了调用方的请求后,回应请求。

  4. 客户端收到回应后,整个请求结束。

Server streaming rpc

服务方流式rpc,当调用方发送了一个请求后,可以得到一个stream来读取到多次的服务方的回应。

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

服务方流式rpc,表示服务方可以在客户端的一个请求来到后,批量写入回应。当服务方所有的回应写入完成后,服务方的状态信息以及附加元数据会被发送。当调用方获得了所有的回应后,该请求结束。

Client stream rpc

调用方流式rpc,调用方可以通过stream来批量写入请求。当请求写入完毕后,调用方将等待服务方读取请求直到回应。

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

调用方流式rpc,调用方可以批量写入请求,服务方可以在接到所有请求或者部分请求后,返回一个回应,同时整个请求结束。

Bidirectional stream rpc

双向流式rpc,调用方和服务方都可以通过读写stream来传输批量请求/回应,读写stream的操作是完全独立的,不必一个请求对应一个回应。

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

双向流式rpc,当调用方初始化请求后,服务方会收到调用方的元数据、请求名、超时信息等。接着服务方可以选择将它的初始元数据发送给调用方,或者等待调用方发送请求。

接着,它们会建立一条双向的stream,调用方可以向其中写入请求,服务方可以向其中写入回应,具体如何完全取决于程序逻辑。

共 0 条回复
暂时没有人回复哦,赶紧抢沙发
发表新回复

作者

sryan
today is a good day