新闻中心

Golang如何使用gRPC客户端Stream发送数据_Golang gRPC客户端Stream通信实践

2025-11-29
浏览次数:
返回列表
Go语言中gRPC客户端流通过Send发送多条数据,CloseAndRecv关闭并接收响应,适用于日志上传等场景。

golang如何使用grpc客户端stream发送数据_golang grpc客户端stream通信实践

在Go语言中使用gRPC客户端Stream发送数据,关键在于理解流式RPC的类型和正确调用生成的客户端接口。gRPC支持四种类型的RPC,其中客户端流(Client Streaming)允许客户端向服务器发送多个消息,服务器接收后返回单个响应。这种模式适用于日志上传、批量数据提交等场景。

定义gRPC客户端流式接口

要在gRPC中使用客户端流,首先需要在.proto文件中声明流式方法。客户端流通过stream关键字修饰请求参数来标识:

service DataCollector {
  rpc UploadLogs(stream LogEntry) returns (UploadResult);
}

message LogEntry {
  string timestamp = 1;
  string level     = 2;
  string message   = 3;
}

message UploadResult {
  bool success = 1;
  int32 count  = 2;
}

上述定义表示UploadLogs方法接收一个日志条目流,并在所有数据发送完成后返回一个结果。

生成gRPC代码并实现客户端

使用protoc配合gRPC插件生成Go代码:

protoc --go_out=. --go-grpc_out=. data_collector.proto

生成的客户端会提供一个流对象,其类型为DataCollector_UploadLogsClient,具备Send()CloseAndRecv()方法。

在客户端代码中按以下方式使用:

GoEnhance GoEnhance

全能AI视频制作平台:通过GoEnhance AI让视频创作变得比以往任何时候都更简单。

GoEnhance 347 查看详情 GoEnhance
  • 调用客户端方法获取流对象
  • 循环调用Send()发送每一条数据
  • 调用CloseAndRecv()关闭发送并等待服务器响应

示例代码:

conn, err := grpc.Dial("localhost:50051", grpc.WithInsecure())
if err != nil {
    log.Fatalf("无法连接: %v", err)
}
defer conn.Close()

client := NewDataCollectorClient(conn)
stream, err := client.UploadLogs(context.Background())
if err != nil {
    log.Fatalf("调用失败: %v", err)
}

logs := []LogEntry{
    {Timestamp: "2025-04-01T10:00:00", Level: "INFO", Message: "启动服务"},
    {Timestamp: "2025-04-01T10:01:00", Level: "ERROR", Message: "数据库连接失败"},
    {Timestamp: "2025-04-01T10:02:00", Level: "WARN", Message: "磁盘空间不足"},
}

for _, log := range logs {
    if err := stream.Send(&log); err != nil {
        log.Printf("发送日志失败: %v", err)
    }
}

// 关闭发送并接收最终结果
result, err := stream.CloseAndRecv()
if err != nil {
    log.Fatalf("接收响应失败: %v", err)
}

fmt.Printf("上传成功: %v, 条数: %d\n", result.Success, result.Count)

处理错误与超时控制

客户端流通信中可能遇到网络中断、超时或服务器拒绝等情况。建议设置上下文超时以避免长时间阻塞:

ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second)
defer cancel()

stream, err := client.UploadLogs(ctx)

Send()过程中如果返回错误,通常意味着连接已断开,应停止后续发送。而CloseAndRecv()的错误则代表服务器处理失败或响应异常。

基本上就这些。掌握Send和CloseAndRecv的配合使用,就能稳定实现gRPC客户端流数据传输。

以上就是Golang如何使用gRPC客户端Stream发送数据_Golang gRPC客户端Stream通信实践的详细内容,更多请关注其它相关文章!


# 并在  # 卫辉网站建设规划  # 安顺网站优化平台  # 认准seo价格  # 青岛企业网站如何建设  # 网站建设的问题  # 余杭seo怎么做  # 福州关键词排名服务商  # seo完全重合  # 谷歌浏览器 seo插件  # 创意动画广告营销推广  # 要在  # go  # 长时间  # 多个  # 就能  # 上传  # 流式  # 适用于  # 如何使用  # 客户端  # stream  # go语言  # golang 


相关栏目: 【 科技资讯46185 】 【 网络学院92790


相关推荐: 《明末:渊虚之羽》设计师谈设计角色:那会刚毕业 充满激情  漫画星球免费下拉式入口 漫画星球免费漫画在线阅读网站  汽水音乐网页版使用入口_汽水音乐电脑版播放指南  漫蛙漫画官方首页 漫蛙2漫画在线阅读入口  C++ map遍历方法大全_C++ map迭代器使用总结  AO3访问入口汇总 AO3网页版同人作品一键直达  Surface怎么安装系统 微软Surface Pro U盘重装win11教程  晋江读书网页版在线登录 晋江读书电脑版官网  Win10系统服务哪些可以禁用 Win10安全优化服务列表【干货】  Golang如何实现Web接口签名验证_Golang Web接口签名校验开发方法  CSS子选择器:如何区分并样式化嵌套列表的子层级  AO3最新官网入口公告_2025AO3镜像站实时查询方法  智慧团建扫码登录入口 智慧团建扫码登录入口官网版​  向日葵客户端怎么进行远程CentOS控制_向日葵客户端远程CentOS控制操作教程  Win10如何清理注册表垃圾 Win10手动清理无效注册表【技巧】  实现分段式页面滚动导航:CSS与J*aScript教程  将HTML Canvas内容转换为可上传的图像文件(File对象)  React Hooks最佳实践:动态组件状态管理的组件化方案  精准捕获:如何在页面中监听除特定元素外的所有点击事件  qq游戏免费畅玩入口_qq游戏电脑版快速启动  html怎么在cmd下运行php文件_cmd运行html中php文件方法【教程】  CSS Box Model与弹性按钮:维持布局稳定的动画实践  J*aScript中高效管理与清空动态列表:避免循环陷阱  QQ邮箱官方登录入口_QQ邮箱网页版快捷使用平台  sublime如何处理大型CSV文件的列对齐_sublime高级表格编辑插件指南  win11开机启动修复循环怎么办 Win11无法进入系统高级启动解决方法【修复】  c++如何使用std::memory_order控制原子操作顺序_c++ C++11内存模型详解  C++如何连接MySQL数据库_C++使用Connector/C++操作MySQL数据库教程  虚幻5科幻题材ARPG大作遭取消!本是《奇异人生》厂商新作  一加 14R 快充无反应_一加 14R 充电优化  HuggingFaceEmbeddings中向量嵌入维度调整的限制与理解  Node.js 中使用 node-cron 实现定时 API 数据抓取与处理  抖音创作助手登录入口_抖音创作辅助工具官网直达  地铁跑酷免费秒玩入口链接 地铁跑酷小游戏免费秒玩网站  Django表单提交验证失败后保持字段值不刷新  在FastAPI中利用lifespan与依赖注入高效管理Redis连接池  ACG动漫视频网入口 ACG动漫*免费正版观看地址  搜狗浏览器如何使用密码生成器创建强密码 搜狗浏览器内置密码安全工具  Highcharts 雷达图径向轴标签定制指南:利用多Y轴实现数值标注  妖精漫画网页版登录入口免费_妖精漫画官网主页直接阅读漫画  MAC怎么安装Homebrew包管理器_MAC为开发者和高级用户安装命令行工具  探索高级语言到C/C++的转译路径:以Go为例及内存管理策略  腾讯视频怎么举报不良内容_腾讯视频内容举报流程与违规信息处理方法  极速漫画官方主页网址 极速漫画漫画在线浏览官网链接  知音漫客官网漫画下载_知音漫客网页版阅读记录  在J*a中如何在J*a中使用异常机制记录错误日志_异常日志实践经验  豆包手机助手发布技术预览版:直接嵌入手机系统!努比亚样机发售  如何在 Excel Online 和 Google 表格中更改日期格式  PDF文件体积过大处理_PDF压缩技巧详解  c++ 命名空间怎么用 c++ namespace使用指南 

搜索