gRPC阅读日记(四)Client-side streaming RPC and Bidirectional streaming RPC

简介: gRPC阅读日记(四)Client-side streaming RPC and Bidirectional streaming RPC

gRPC阅读日记(四)

Client-side streaming RPC

今天介绍的是比较复杂的RPC了,Client-side streaming 方法RecordRoute,服务端处理来自客户端的流式请求,这次,client会发送连续的Point消息请求,然后服务端返回单次响应RouteSummary,响应带有行程中的信息。从下方的例子中可以看到,这次方法不需要请求参数,而是用了RouteGuide_RecordRouteServer流,可以同时读写消息,并且可以通过Recv()来接收客户端消息,然后返回单个响应通过SendAndClose()方法

func (s *routeGuideServer) RecordRoute(stream pb.RouteGuide_RecordRouteServer) error {
  var pointCount, featureCount, distance int32
  var lastPoint *pb.Point
  startTime := time.Now()
  for {
    point, err := stream.Recv()
    if err == io.EOF {
      endTime := time.Now()
      return stream.SendAndClose(&pb.RouteSummary{
        PointCount:   pointCount,
        FeatureCount: featureCount,
        Distance:     distance,
        ElapsedTime:  int32(endTime.Sub(startTime).Seconds()),
      })
    }
    if err != nil {
      return err
    }
    pointCount++
    for _, feature := range s.savedFeatures {
      if proto.Equal(feature.Location, point) {
        featureCount++
      }
    }
    if lastPoint != nil {
      distance += calcDistance(lastPoint, point)
    }
    lastPoint = point
  }
}

在方法中可以看到,RouteGuide_RecordRouteServer的Recv()方法一直重复阅读来自客户端的请求,在具体一点,Recv()一直获取来自请求流中的单个point消息直到读取不到更多的消息。服务端必须检查Recv()方法的error,如果error等于nil,证明仍然需要读取消息,如果error等于io.EOF证明已经读取完毕了。服务器就可以返回RouteSummary。如果error既不是读取完毕io.EOF也不是nil则返回该错误,因为gRPC层会将它翻译成RPC状态并返回给客户端。

Bidirectional streaming RPC

来看最后一种双向流RPC的实现RouteChat()

func (s *routeGuideServer) RouteChat(stream pb.RouteGuide_RouteChatServer) error {
  for {
    in, err := stream.Recv()
    if err == io.EOF {
      return nil
    }
    if err != nil {
      return err
    }
    key := serialize(in.Location)
                ... // look for notes to be sent to client
    for _, note := range s.routeNotes[key] {
      if err := stream.Send(note); err != nil {
        return err
      }
    }
  }
}

这次使用了RouteGuide_RouteChatServer流,在上一个客户端请求流式用例中,可以用来读写信息,这次我们通过方法的流来返回值的同时,客户端也仍然在像流中写消息。

从语法上也跟client-streaming方法很相似,除了服务端需要使用流的send()方法,而不是SendAndClose(),因为需要用俩写多重响应。尽管每一端总是能获取到按照他们写顺序的消息,但客户端和服务端都还能不根据顺序来读去消息,流的操作是完全独立的。


相关文章
|
7月前
|
缓存 网络协议 安全
计算机网络 TCP、RPC、GRPC、HTTP 对比
【1月更文挑战第1天】计算机网络 TCP、RPC、GRPC、HTTP 对比
|
编解码 中间件 Go
Go语言学习 - RPC篇:gRPC拦截器剖析
我们在前几讲提到过,优秀的RPC框架都提供了`middleware`的能力,可以减少很多重复代码的编写。在gRPC-Gateway的方案里,包括了两块中间件的能力: 1. gRPC中的`ServerOption`,是所有gRPC+HTTP都会被处理 2. gRPC-Gateway中的`ServeMuxOption`,只有HTTP协议会被处理 今天,我们先关注共同部分的`ServerOption`,它提供的能力最为全面,让我们一起了解下。
95 0
|
1月前
|
自然语言处理 负载均衡 API
gRPC 一种现代、开源、高性能的远程过程调用 (RPC) 可以在任何地方运行的框架
gRPC 是一种现代开源高性能远程过程调用(RPC)框架,支持多种编程语言,可在任何环境中运行。它通过高效的连接方式,支持负载平衡、跟踪、健康检查和身份验证,适用于微服务架构、移动设备和浏览器客户端连接后端服务等场景。gRPC 使用 Protocol Buffers 作为接口定义语言,支持四种服务方法:一元 RPC、服务器流式处理、客户端流式处理和双向流式处理。
|
4月前
|
前端开发 C# 开发者
WPF开发者必读:MVVM模式实战,轻松构建可维护的应用程序,让你的代码更上一层楼!
【8月更文挑战第31天】在WPF应用程序开发中,MVVM(Model-View-ViewModel)模式通过分离关注点,提高了代码的可维护性和可扩展性。本文详细介绍了MVVM模式的三个核心组件:Model(数据模型)、View(用户界面)和ViewModel(处理数据绑定与逻辑),并通过示例代码展示了如何在WPF项目中实现MVVM模式。通过这种模式,开发者可以更高效地构建桌面应用程序。希望本文能帮助你在WPF开发中更好地应用MVVM模式。
216 1
|
4月前
|
网络协议 编译器 Go
揭秘!TCP、RPC、gRPC、HTTP大PK,谁才是网络通信界的超级巨星?一篇文章带你秒懂!
【8月更文挑战第25天】本文以教程形式深入对比了TCP、RPC、gRPC与HTTP这四种关键通信协议,并通过Go语言中的示例代码展示了各自的实现方法。TCP作为一种可靠的传输层协议,确保了数据的完整性和顺序性;RPC与gRPC作为远程过程调用框架,特别适合于分布式系统的函数调用与数据交换,其中gRPC在性能和跨语言支持方面表现出色;HTTP则是广泛应用于Web浏览器与服务器通信的应用层协议。选择合适的协议需根据具体需求综合考量。
306 0
|
6月前
|
存储 C++
gRPC 四模式之 双向流RPC模式
gRPC 四模式之 双向流RPC模式
251 0
|
6月前
|
安全 C++
gRPC 四模式之 客户端流RPC模式
gRPC 四模式之 客户端流RPC模式
65 0
|
6月前
|
C++
gRPC 四模式之 服务器端流RPC模式
gRPC 四模式之 服务器端流RPC模式
138 0
|
6月前
|
JSON API 数据格式
gRPC 四模式之 一元RPC模式
gRPC 四模式之 一元RPC模式
73 0
|
7月前
|
Dubbo Java 应用服务中间件
grpc&rpc
grpc&rpc