gRPC阅读日记(六)
学习如何调用服务方法
今天来学习如何调用服务方法,我看的是Go的gRPC教程,RPCs都采用同步阻塞模式,换句话说就是每个请求都需要等待服务器给与响应或者返回错误。
Simple RPC
调用该RPC几乎就是直观的就像调用本地方法那样
feature, err := client.GetFeature(context.Background(), &pb.Point{409146138, -746188906}) if err != nil { ... }
如上所示,方法参数中,我们传入了protocol buffer的消息对象Point。我们还传了context.Context对象,可以帮我们改变RPC's的行为如果有必要的话。比如超时处理和取消一个RPC请求。如果调用方法时没有返回错误。我们就可以读取到响应内容的信息了。
log.Println(feature)
Server-side streaming RPC
在下个例子中调用了ListFeatures, 该方法返回了地理特征的流式响应,在之前系列的gRPC阅读日记里写了如何创建RPC的服务端,跟下方的实现很相似,流式RPC的实现在两端都比较相似。
我之前读到这里的时候,回头翻看过去,以为是ListFeatures实现和调用很想,但是仔细想想,在调用响应流式RPC的时候,客户端是接收数据流的一方,那么服务端在处理请求流式RPC的时候,服务端也变成了接收数据流的一方。所以具体的实现,我觉得可以对照:
- server端请求流式RPC的处理RouteChat
- 和clietn端调用响应流式RPC的ListFeatures
rect := &pb.Rectangle{ ... } // initialize a pb.Rectangle stream, err := client.ListFeatures(context.Background(), rect) if err != nil { ... } for { feature, err := stream.Recv() if err == io.EOF { break } if err != nil { log.Fatalf("%v.ListFeatures(_) = _, %v", client, err) } log.Println(feature) }
我们获得了一个RoutGuide_ListFeaturesClient的实例而不是直接的响应对象,client可以使用RouteGuide_ListFeaturesClient流去读取来自服务端的响应信息。
获取流式响应的方式还是一样,调用RouteGuide_ListFeaturesClient的Recv()方法,如果没有错误且err不等于io.EOF的时候就持续读取。如果出现io.EOF证明阅读完毕,如果出现了其他错误,那么gRPC层就会处理,会返回rpc错误。