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框架,并从框架的出身、实现原理、特性、性能等方面做了对比分析,从而给出两者之间的选择建议。
11328 0
|
8天前
|
负载均衡 监控 Java
10-7|gRPC是什么
10-7|gRPC是什么
|
4月前
|
存储 负载均衡 网络协议
gRPC 的原理 介绍带你从头了解gRPC
gRPC 的原理 介绍带你从头了解gRPC
198 2
|
5月前
|
Dubbo Java 应用服务中间件
grpc&rpc
grpc&rpc
|
5月前
|
负载均衡 监控 安全
介绍grpc
gRPC(gRPC Remote Procedure Call)是一种高性能、开源的远程过程调用(RPC)框架,最初由Google开发并开源。它基于HTTP/2协议传输,使用Protocol Buffers(ProtoBuf)作为默认的序列化机制,支持多种编程语言,并提供了强大的功能和特性。
|
5月前
|
JSON 网络协议 API
GRPC远程调用
GRPC远程调用
148 0
|
5月前
|
XML Go 开发工具
RPC简介和grpc的使用
RPC简介和grpc的使用
88 0
|
11月前
|
XML JSON 网络协议
gRPC介绍
gRPC介绍
|
12月前
|
JSON Go 网络架构
《gRPC vs REST:何时选择哪一个》
《gRPC vs REST:何时选择哪一个》
88 0
|
XML JSON 自然语言处理
gRPC系列 :RPC 框架原理是?gRPC 是什么?gRPC设计原则
gRPC系列 :RPC 框架原理是?gRPC 是什么?gRPC设计原则
1679 0
gRPC系列 :RPC 框架原理是?gRPC 是什么?gRPC设计原则