gRPC阅读日记(七)客户端的RPC构建2

简介: gRPC阅读日记(七)客户端的RPC构建2

gRPC阅读日记(七)客户端的RPC构建

Client-side streaming RPC

客户端的流式方法RecordRoute跟服务端的相似,除了我们只传了context,获取到RouteGuide_RecordRouteClient流对象回来。流可以让我们既可以写也可以读消息。

// Create a random number of random points
r := rand.New(rand.NewSource(time.Now().UnixNano()))
pointCount := int(r.Int31n(100)) + 2 // Traverse at least two points
var points []*pb.Point
for i := 0; i < pointCount; i++ {
  points = append(points, randomPoint(r))
}
log.Printf("Traversing %d points.", len(points))
stream, err := client.RecordRoute(context.Background())
if err != nil {
  log.Fatalf("%v.RecordRoute(_) = _, %v", client, err)
}
for _, point := range points {
  if err := stream.Send(point); err != nil {
    log.Fatalf("%v.Send(%v) = %v", stream, point, err)
  }
}
reply, err := stream.CloseAndRecv()
if err != nil {
  log.Fatalf("%v.CloseAndRecv() got error %v, want %v", stream, err, nil)
}
log.Printf("Route summary: %v", reply)

RouteGuide_RecordRouteClient有Send方法,可以发送请求给server,一旦我们用Send发完了请求,让gRPC知道我们已经结束写阶段,希望获取响应了,就能从CloseAndRecv()返回的err得治RPC状态。如果状态是nil,那么CloseAndRecv()返回的就是有效的服务响应。

Bidirectional streaming RPC

双向流RPC RouteChat(),使用了goroutine去对steam做读,然后主的goroutine去做写,最后client端洗完了,调用了CloseSend()最后还做了线程同步,等goroutine都结束。

stream, err := client.RouteChat(context.Background())
waitc := make(chan struct{})
go func() {
  for {
    in, err := stream.Recv()
    if err == io.EOF {
      // read done.
      close(waitc)
      return
    }
    if err != nil {
      log.Fatalf("Failed to receive a note : %v", err)
    }
    log.Printf("Got message %s at point(%d, %d)", in.Message, in.Location.Latitude, in.Location.Longitude)
  }
}()
for _, note := range notes {
  if err := stream.Send(note); err != nil {
    log.Fatalf("Failed to send a note: %v", err)
  }
}
stream.CloseSend()
<-waitc

外加再补充一句,客户端和服务端请求和响应的消息顺序一直是有序的,但是他们处理消息的顺序可以in any orider。这句话基础教程里提了好多次了

下一期讲gRPC basics tutorial的总结, respect!!!

Reference

https://grpc.io/docs/languages/go/basics/


相关文章
|
4月前
|
缓存 网络协议 安全
计算机网络 TCP、RPC、GRPC、HTTP 对比
【1月更文挑战第1天】计算机网络 TCP、RPC、GRPC、HTTP 对比
|
7月前
|
编解码 中间件 Go
Go语言学习 - RPC篇:gRPC拦截器剖析
我们在前几讲提到过,优秀的RPC框架都提供了`middleware`的能力,可以减少很多重复代码的编写。在gRPC-Gateway的方案里,包括了两块中间件的能力: 1. gRPC中的`ServerOption`,是所有gRPC+HTTP都会被处理 2. gRPC-Gateway中的`ServeMuxOption`,只有HTTP协议会被处理 今天,我们先关注共同部分的`ServerOption`,它提供的能力最为全面,让我们一起了解下。
45 0
|
3月前
|
Dubbo Java 应用服务中间件
grpc&rpc
grpc&rpc
|
4月前
|
网络协议 安全 API
计算机网络 TCP、RPC、GRPC、HTTP 总结
【1月更文挑战第1天】计算机网络 TCP、RPC、GRPC、HTTP 总结
|
5月前
|
缓存 网络协议 安全
tcp、http、rpc和grpc得一些个人总结
tcp、http、rpc和grpc得一些个人总结
81 0
|
5月前
|
XML Go 开发工具
RPC简介和grpc的使用
RPC简介和grpc的使用
56 0
|
7月前
|
JSON Cloud Native 网络协议
gRPC简介: Google的高性能RPC框架
gRPC简介: Google的高性能RPC框架
79 0
|
Go 流计算
gRPC阅读日记(六)来看看客户端的rpc请求如何实现
gRPC阅读日记(六)来看看客户端的rpc请求如何实现
|
3月前
|
负载均衡 Dubbo Java
Dubbo 3.x:探索阿里巴巴的开源RPC框架新技术
随着微服务架构的兴起,远程过程调用(RPC)框架成为了关键组件。Dubbo,作为阿里巴巴的开源RPC框架,已经演进到了3.x版本,带来了许多新特性和技术改进。本文将探讨Dubbo 3.x中的一些最新技术,包括服务注册与发现、负载均衡、服务治理等,并通过代码示例展示其使用方式。
81 9
|
8月前
|
消息中间件 负载均衡 Dubbo
如何自己设计一个类似Dubbo的RPC框架?
如何自己设计一个类似Dubbo的RPC框架?
63 0