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 Maven
关于代码混淆,看这篇就够了
关于代码混淆,看这篇就够了
1454 4
|
机器学习/深度学习 Dart TensorFlow
TensorFlow Lite,ML Kit 和 Flutter 移动深度学习:6~11(5)
TensorFlow Lite,ML Kit 和 Flutter 移动深度学习:6~11(5)
316 0
|
11月前
|
前端开发 Java 数据库连接
表白墙/留言墙 —— 中级SpringBoot项目,MyBatis技术栈MySQL数据库开发,练手项目前后端开发(带完整源码) 全方位全步骤手把手教学
本文是一份全面的表白墙/留言墙项目教程,使用SpringBoot + MyBatis技术栈和MySQL数据库开发,涵盖了项目前后端开发、数据库配置、代码实现和运行的详细步骤。
246 0
表白墙/留言墙 —— 中级SpringBoot项目,MyBatis技术栈MySQL数据库开发,练手项目前后端开发(带完整源码) 全方位全步骤手把手教学
|
11月前
|
JavaScript 前端开发 UED
HTML 超链接的多种类型及应用
【10月更文挑战第17天】HTML 超链接类型丰富多样,它们共同构成了网页中不可或缺的导航和交互元素。通过合理地选择和运用这些超链接类型,我们可以为用户创造更加流畅和便捷的浏览体验,提升网站的可用性和吸引力。
443 1
|
SQL 测试技术 API
SqlAlchemy 2.0 中文文档(一)(1)
SqlAlchemy 2.0 中文文档(一)
443 1
SqlAlchemy 2.0 中文文档(一)(1)
JDK序列化原理问题之在JDK序列化中不同JDK版本字段不一致的情况如何解决
JDK序列化原理问题之在JDK序列化中不同JDK版本字段不一致的情况如何解决
179 0
|
机器学习/深度学习 自然语言处理 PyTorch
pytorch实战---IMDB情感分析
pytorch实战---IMDB情感分析
pytorch实战---IMDB情感分析
|
Java 数据库连接 数据库
JAVA Web项目开发SSM框架搭建(第一天)
JAVA Web项目开发SSM框架搭建(第一天)
|
SQL 存储 自然语言处理
玩转阿里云RDS PostgreSQL数据库通过pg_jieba插件进行分词
在当今社交媒体的时代,人们通过各种平台分享自己的生活、观点和情感。然而,对于平台管理员和品牌经营者来说,了解用户的情感和意见变得至关重要。为了帮助他们更好地了解用户的情感倾向,我们可以使用PostgreSQL中的pg_jieba插件对这些发帖进行分词和情感分析,来构建一个社交媒体情感分析系统,系统将根据用户的发帖内容,自动判断其情感倾向是积极、消极还是中性,并将结果存储在数据库中。
玩转阿里云RDS PostgreSQL数据库通过pg_jieba插件进行分词
|
传感器 存储 编解码
Baumer工业相机堡盟工业相机如何联合BGAPI SDK和OpenCV实现Mono12和Mono16格式位深度的图像保存(C++)
Baumer工业相机堡盟工业相机如何联合BGAPI SDK和OpenCV实现Mono12和Mono16格式位深度的图像保存(C++)
331 0