5分钟学会 gRPC(中)

简介: 我猜测大部分长期使用 Java 的开发者应该较少会接触 gRPC,毕竟在 Java 圈子里大部分使用的还是 Dubbo/SpringClound 这两类服务框架。 我也是近段时间有机会从零开始重构业务才接触到 gRPC 的,当时选择 gRPC 时也有几个原因

Server stream


gRPC 除了常规的 unary 调用之外还支持服务端推送,在一些特定场景下还是很有用的。


网络异常,图片无法展示
|


func (o *Order) ServerStream(in *v1.OrderApiCreate, rs v1.OrderService_ServerStreamServer) error {
  for i := 0; i < 5; i++ {
    rs.Send(&v1.Order{
      OrderId: in.OrderId,
      Reason:  nil,
    })
  }
  return nil
}


服务端的推送如上所示,调用 Send 函数便可向客户端推送。


for {
    msg, err := rpc.RecvMsg()
    if err == io.EOF {
      marshalIndent, _ := json.MarshalIndent(msgs, "", "\t")
      fmt.Println(msg)
      return
    }
  }


客户端则通过一个循环判断当前接收到的数据包是否已经截止来获取服务端消息。


为了能更直观的展示这个过程,优化了之前开发的一个 gRPC客户端,可以直观的调试 stream 调用。


网络异常,图片无法展示
|


上图便是一个服务端推送示例。


Client Stream


网络异常,图片无法展示
|


除了支持服务端推送之外,客户端也支持。


客户端在同一个连接中一直向服务端发送数据,服务端可以并行处理消息。


// 服务端代码
func (o *Order) ClientStream(rs v1.OrderService_ClientStreamServer) error {
  var value []int64
  for {
    recv, err := rs.Recv()
    if err == io.EOF {
      rs.SendAndClose(&v1.Order{
        OrderId: 100,
        Reason:  nil,
      })
      log.Println(value)
      return nil
    }
    value = append(value, recv.OrderId)
    log.Printf("ClientStream receiv msg %v", recv.OrderId)
  }
  log.Println("ClientStream finish")
  return nil
}
  // 客户端代码
  for i := 0; i < 5; i++ {
    messages, _ := GetMsg(data)
    rpc.SendMsg(messages[0])
  }
  receive, err := rpc.CloseAndReceive()


代码与服务端推送类似,只是角色互换了。


网络异常,图片无法展示
|



相关文章
|
Java Go Apache
gRPC vs Thrift
远程过程调用(Remote Procedure Call,RPC)服务于分布式架构,本文从分布式构架面临的问题,期望的结果,引出两种比较受关注的RPC框架,并从框架的出身、实现原理、特性、性能等方面做了对比分析,从而给出两者之间的选择建议。
11402 0
|
3月前
|
负载均衡 监控 Java
10-7|gRPC是什么
10-7|gRPC是什么
|
5月前
|
XML JSON Java
GRPC与 ProtoBuf 的理解与总结
GRPC与 ProtoBuf 的理解与总结
216 0
|
6月前
|
存储 负载均衡 网络协议
gRPC 的原理 介绍带你从头了解gRPC
gRPC 的原理 介绍带你从头了解gRPC
299 2
|
7月前
|
Dubbo Java 应用服务中间件
grpc&rpc
grpc&rpc
|
7月前
|
负载均衡 监控 安全
介绍grpc
gRPC(gRPC Remote Procedure Call)是一种高性能、开源的远程过程调用(RPC)框架,最初由Google开发并开源。它基于HTTP/2协议传输,使用Protocol Buffers(ProtoBuf)作为默认的序列化机制,支持多种编程语言,并提供了强大的功能和特性。
|
XML JSON 网络协议
gRPC介绍
gRPC介绍
|
JSON Go 网络架构
《gRPC vs REST:何时选择哪一个》
《gRPC vs REST:何时选择哪一个》
105 0
|
XML JSON 自然语言处理
gRPC系列 :RPC 框架原理是?gRPC 是什么?gRPC设计原则
gRPC系列 :RPC 框架原理是?gRPC 是什么?gRPC设计原则
1734 0
gRPC系列 :RPC 框架原理是?gRPC 是什么?gRPC设计原则
|
JSON 网络协议 Dubbo
gRPC(一)入门:什么是RPC?
RPC是一种方法,而HTTP是一种协议。两者都常用于实现服务,在这个层面最本质的区别是RPC服务主要工作在TCP协议之上(也可以在HTTP协议),而HTTP服务工作在HTTP协议之上。由于HTTP协议基于TCP协议,所以RPC服务天然比HTTP更轻量,效率更胜一筹。
430 0
gRPC(一)入门:什么是RPC?