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
关于代码混淆,看这篇就够了
关于代码混淆,看这篇就够了
2239 4
|
消息中间件 弹性计算 Java
Rocketmq-spring入门与实践
本场景带您体验如何在 Spring 生态中优雅地使用 Apache RocketMQ,感受最受欢迎业务开发框架与最受欢迎消息平台结合的魅力。
|
Java
用java实现Client和Server之间的互相通信
本文介绍了如何使用Java实现客户端和服务器之间的通信,包括服务器端创建ServerSocket、接受客户端连接、读取和发送消息,以及客户端创建Socket连接、发送和接收消息的完整过程。
600 1
用java实现Client和Server之间的互相通信
|
小程序 前端开发 中间件
ThinkPHP 配置跨域请求,使用TP的内置跨域类配置,小程序和web网页跨域请求的区别及格式说明
本文介绍了如何在ThinkPHP框架中配置跨域请求,使用了TP内置的跨域类`\think\middleware\AllowCrossDomain::class`。文章还讨论了小程序和web网页在跨域请求格式上的区别,并提供了解决方案,包括修改跨域中间件源码以支持`Origin`和`token`。此外,还介绍了微信小程序跨域请求的示例和web网页前端发送Axios跨域请求的请求拦截器配置。
ThinkPHP 配置跨域请求,使用TP的内置跨域类配置,小程序和web网页跨域请求的区别及格式说明
|
存储 设计模式 网络协议
Netty网络框架(一)
Netty网络框架
1132 1
|
前端开发 Java 数据库连接
表白墙/留言墙 —— 中级SpringBoot项目,MyBatis技术栈MySQL数据库开发,练手项目前后端开发(带完整源码) 全方位全步骤手把手教学
本文是一份全面的表白墙/留言墙项目教程,使用SpringBoot + MyBatis技术栈和MySQL数据库开发,涵盖了项目前后端开发、数据库配置、代码实现和运行的详细步骤。
445 0
表白墙/留言墙 —— 中级SpringBoot项目,MyBatis技术栈MySQL数据库开发,练手项目前后端开发(带完整源码) 全方位全步骤手把手教学
|
存储 分布式计算 Hadoop
|
缓存 Linux 开发者
CentOS Linux 8 - AppStream 错误
CentOS Linux 8 - AppStream 错误
902 1
|
移动开发 算法 Linux
websocket介绍并模拟股票数据推流
websocket介绍并模拟股票数据推流
432 0
|
SQL 关系型数据库 MySQL
Go 语言使用 XORM 操作 MySQL 的陷阱
Go 语言使用 XORM 操作 MySQL 的陷阱
349 0