gRPC调用方式

在gRPC中,一共包含四种调用方式。

  • Unary RPC:一元RPC
  • Server-side streaming RPC: 服务端流式RPC
  • Client-side streaming RPC: 客户端流式RPC
  • Bidirectional streaming RPC: 双向流式RPC

Streaming RPC

streaming RPC 适用于大数据包场景,可以进行实时交互;

**服务端流式RPC **:客户端发起一次普通的RPC请求,服务端通过流式响应多次发送数据集,客户端Recv接收数据集
客户端流式RPC:客户端发起多次请求给服务端,而服务端仅响应客户端一次
双向流式RPC: 由客户端以流式请求服务端,服务端同样以流式响应客户端。

代码实现

1、proto文件:创建proto文件定义三种流模式服务,执行protoc命令编译代码;

syntax = "proto3";package pb;option go_package = "pb/;pb";message Reply {string type = 1;string value = 2;
}message Request {string type = 1;string value = 2;
}service Streaming {rpc ServerStream (Request) returns (stream Reply);rpc ClientStream (stream Request) returns (Reply);rpc Bidirectional (stream Request) returns (stream Reply);
}

2、server:
客户端流模式下 服务端手到 io._EOF时服务端需要通过 _stream.SendAndClose 向客户端返回;客户端 stream.CloseAndRecv 与之对应

var port stringfunc init() {flag.StringVar(&port, "p", "8000", "启动端口号")flag.Parse()
}type StreamServer struct {pb.UnimplementedStreamingServer
}func (ss StreamServer) ServerStream(in *pb.Request, stream pb.Streaming_ServerStreamServer) error {for i := 0; i < 20; i++ {err := stream.Send(&pb.Reply{Type: "Server-Side stream", Value: fmt.Sprintf("val:%d", i)})if err != nil {return err}}return nil
}func (ss StreamServer) ClientStream(stream pb.Streaming_ClientStreamServer) error {for {recv, err := stream.Recv()if err == io.EOF {return stream.SendAndClose(&pb.Reply{Type:  "Client-Side stream",Value: "close",})}if err != nil {return err}log.Printf("%v", recv)}
}
func (ss StreamServer) Bidirectional(stream pb.Streaming_BidirectionalServer) error {i := 0for {_ = stream.Send(&pb.Reply{Type: "Bidirectional stream", Value: fmt.Sprintf("val:%d", i)})recv, err := stream.Recv()if err == io.EOF {return nil}if err != nil {return err}log.Printf("%v", recv)i++}
}func main() {server := grpc.NewServer()pb.RegisterStreamingServer(server, &StreamServer{})reflection.Register(server)lis, _ := net.Listen("tcp", ":"+port)_ = server.Serve(lis)
}

3、client :未方便后面测试,通过参数 -m 启动不同流模式客户端;

var port string
var method intfunc init() {flag.StringVar(&port, "p", "8000", "启动端口号")flag.IntVar(&method, "m", 1, "流模式")flag.Parse()
}
func ServerStreamClient(client pb.StreamingClient, r *pb.Request) error {stream, err := client.ServerStream(context.Background(), r)if err != nil {return err}for {recv, err := stream.Recv()if err == io.EOF {break}if err != nil {return err}log.Printf("response:%v", recv)}return nil
}func ClientStreamClient(client pb.StreamingClient) error {stream, err := client.ClientStream(context.Background())if err != nil {return err}for i := 0; i < 10; i++ {_ = stream.Send(&pb.Request{Type: "ClientStreamClient", Value: fmt.Sprintf("val:%d", i)})}recv, err := stream.CloseAndRecv()log.Printf("resp :%v", recv)return err
}func Bidirectional(client pb.StreamingClient) error {stream, err := client.Bidirectional(context.Background())if err != nil {return err}for i := 0; i < 10; i++ {_ = stream.Send(&pb.Request{Type: "BidirectionalClient", Value: fmt.Sprintf("val:%d", i)})recv, err := stream.Recv()if err == io.EOF {break}if err != nil {log.Printf("resp :%v", err)return err}log.Printf("resp :%v", recv)}return stream.CloseSend()
}func main() {conn, _ := grpc.Dial(":"+port, grpc.WithTransportCredentials(insecure.NewCredentials()))defer conn.Close()log.Printf("mothod %d", method)client := pb.NewStreamingClient(conn)switch method {case 1:_ = ServerStreamClient(client, &pb.Request{Type: "ss client", Value: "ok"})case 2:_ = ClientStreamClient(client)case 3:_ = Bidirectional(client)default:log.Fatal("error method")}
}

4、启动测试;

go run server.go
go run client.go -m 1/2/3

gRPC 快速体验 (2):Streaming RPC相关推荐

  1. 【rnnoise快速体验】rnnoise从编译到训练

    运行环境为Ubuntu18.04 C部分 下载源码 从github上下载源码,目前只有master分支,就拿master分支下来. 准备编译环境 干净的linux环境可能会没有安装gcc等编译工具 所 ...

  2. 基于android os 5.1,Android 5.1.1版氢OS快速体验

    本文约5304字,需9分钟阅读(全文浏览) [更新2015.07.15]作为一加氢OS的内测成员,小编在今天收到了氢OS最新的测试包.然而这个测试包有些不一样,它不再是基于Android 5.0.2系 ...

  3. go test 如何输出到控制台_GO笔记之GO命令快速体验

    上篇文章利用go run和go build命令分析介绍了GO的编译执行流程.GO提供给我们的命令当然远不止这两个.本文将在所能及的范围内,尽量地介绍GO提供的所有命令,从而实现对它们有个整体的认识. ...

  4. gRPC快速入门记录

    为什么使用grpc 1.protocl buffer一种高效的序列化结构. 2.支持http 2.0标准化协议. http/2 1.http/2对每个源只需创建一个持久连接,在这一个连接内,可以并行的 ...

  5. 【华为云技术分享】使用CloudIDE快速体验基于华为云ModelArts SDK的AI开发

    华为云ModelArts一站式AI开发与管理平台,能够支撑开发者从数据到AI应用的全流程开发过程,包含数据处理.算法开发.模型训练.模型管理.部署等,支持图像分类.图像检测.视频分析.语音识别.产品推 ...

  6. uniapp开发:uniapp快速体验vue3.2之setup语法糖,怎么使用怎么爽

    目录 概要 拉开序幕的setup语法糖 生命周期钩子 ref函数与reactive函数对比 computed计算属性 监视(watch.watchEffect) 组件注册 组件传值 provide/i ...

  7. gRPC快速入门(三)——Protobuf应用示例

    gRPC快速入门(三)--Protobuf应用示例 一.Protobuf使用流程 在工程开发中使用Protobuf流程如下: (1)定义proto描述文件,以proto作为后缀名. (2)使用Prot ...

  8. Android 集成 Agora SDK 快速体验 RTC 版多人视频聊天|掘金技术征文

    RTC (Real-Time Communication) 作为实时通讯领域的"新贵",在互动直播.远程控制.多人视频会议.屏幕共享等领域广受好评,如果你还不了解 RTC ,Tak ...

  9. 如何快速体验腾迅信鸽推送

    作者:zhanhailiang 日期:2014-10-13 信鸽是什么 腾讯信鸽(XG Push)是一款专业的免费移动App推送平台,支持百亿级的通知/消息推送,秒级触达移动用户,现已全面支持Andr ...

最新文章

  1. shell命令卸载mysql_centos8中的MySQL卸载和安装
  2. Oracle 数据库表空间不足拓展方法实例演示,表空间剩余大小查看,通过新增表空间文件拓展表空间,表空间文件路径查看
  3. 2019 年百度之星·程序设计大赛 - 初赛一 C. HDU 6670 Mindis 离散化+dijkstra
  4. 抽象背景素材|纯粹为了视觉兴趣而存在
  5. Phpcms V9全站伪静态设置方法
  6. 2018蓝桥杯B组:猴子分香蕉(C++/JAVA)
  7. java常量映射_java-基础 - 常量与变量
  8. 多个文件进行合并取前10个数(多线程方式)
  9. php做一个每天的考勤表,教你做一个酷毙的考勤表!|
  10. mac的word中添加带圆圈的数字
  11. PyTorch YOLOV3 模型转换问题
  12. iPhone软件KK唱响评测 在线视频比拼歌声
  13. python找出3或者5的倍数_在 python 中,确定3或者5的倍数
  14. mean函数 median函数【Matlab】
  15. 技术领导力 程序员如何才能带团队 文摘 (三)
  16. python执行sql 语句
  17. 抖音企业号抖音智能营销系统源码待开发技术。。。。。
  18. 腾讯大讲堂之每年3万行代码,你达标了吗?
  19. C:\Windows\system32\config\systemprofile\Desktop不可用,win10
  20. Unity3d 技巧(5) 了解VR 游戏开发 美术和资源规范

热门文章

  1. Mac遇到浏览器能上网,大部分软件无法上网,恢复后共享网络给手机又上不了网的情况及解决办法
  2. Excel如何快速选择某一数据全部单元格
  3. 商品管理系统属性分组关联属性功能实现
  4. 一键脚本查看硬盘通电时间?
  5. Elastic App Search 快速构建 ES 应用
  6. 计算机网络基础知识【5】(08-09)
  7. GC1262E/S 单线圈无刷直流电机驱动芯片 PWM调速 、斜率控制、软启动、自锁保护 可匹配APX9262S
  8. 游戏音乐及音效的使用(附Demo)
  9. SQLite学习笔记-多个分隔符分割字符串并删除后缀
  10. 微商必死?揭秘那些江湖骗局!