目前在使用grpc,在这儿做个笔记,以往只大概看了下unary的形式,忽略了stream,在一起开会讨论后,发现大家都不是很理解,在此查下资料做下笔记。
grpc的IDL(interface define language)使用的protobuf,当然也可以替换为别的IDL。除了大家熟悉的各种message等的定义外,可以使用 service 来定义一个rpc服务:
service HelloService {
rpc SayHello (HelloRequest) returns (HelloResponse);
}
上述的service服务,描述了一个远程调用服务,调用方的参数为 HelloRequest
, 被调用方返回一个 HelloResponse
, 就像调用一个函数那么简单。
rpc SayHello(HelloRequest) returns (HelloResponse){
}
Unary call非常简单,就像上述的service一样,一个请求一个回应就完成了一个调用请求。大体的执行流程如下:
当调用方初始化调用的时候,服务方会收到请求被发起的通知,该通知会带上调用方的元数据信息、方法名、超时时间等信息。
服务方可以选择在返回回应前,返回服务方的初始元数据信息,或者等待请求到来。两者哪个先发生取决于程序。
当服务方完整的收到了调用方的请求后,回应请求。
客户端收到回应后,整个请求结束。
服务方流式rpc,当调用方发送了一个请求后,可以得到一个stream来读取到多次的服务方的回应。
rpc LotsOfReplies(HelloRequest) returns (stream HelloResponse){
}
服务方流式rpc,表示服务方可以在客户端的一个请求来到后,批量写入回应。当服务方所有的回应写入完成后,服务方的状态信息以及附加元数据会被发送。当调用方获得了所有的回应后,该请求结束。
调用方流式rpc,调用方可以通过stream来批量写入请求。当请求写入完毕后,调用方将等待服务方读取请求直到回应。
rpc LotsOfGreetings(stream HelloRequest) returns (HelloResponse) {
}
调用方流式rpc,调用方可以批量写入请求,服务方可以在接到所有请求或者部分请求后,返回一个回应,同时整个请求结束。
双向流式rpc,调用方和服务方都可以通过读写stream来传输批量请求/回应,读写stream的操作是完全独立的,不必一个请求对应一个回应。
rpc BidiHello(stream HelloRequest) returns (stream HelloResponse){
}
双向流式rpc,当调用方初始化请求后,服务方会收到调用方的元数据、请求名、超时信息等。接着服务方可以选择将它的初始元数据发送给调用方,或者等待调用方发送请求。
接着,它们会建立一条双向的stream,调用方可以向其中写入请求,服务方可以向其中写入回应,具体如何完全取决于程序逻辑。