全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

如何使用Golang实现RPC流式通信_Golang RPC流式数据处理方法

gRPC支持流式通信,因net/rpc仅支持同步请求响应,而gRPC基于HTTP/2提供客户端流、服务端流和双向流,适用于实时推送等场景,需通过proto文件定义stream并生成代码实现,配合goroutine管理读写。

Go 语言的 net/rpc 包本身不支持流式通信(streaming),它只提供“请求-响应”式的同步调用。若需实现真正的流式 RPC(如服务端持续推送数据、客户端边发边收、双向实时传输),应使用 gRPC —— 这是 Google 开发的高性能 RPC 框架,原生支持四种通信模式,其中三种为流式:单向流(client/server streaming)、双向流(bidirectional streaming)。

选择 gRPC 而非标准 net/rpc 的原因

标准 net/rpc 基于 Go 的反射和编码(如 gob/json),每次调用都是一次完整封包与解包,无法复用连接、无法中途传递多段数据。而 gRPC 基于 HTTP/2,天然支持多路复用、头部压缩、连接复用和真正的流式语义。实际项目中,凡涉及日志推送、实时指标、消息广播、大文件分块上传/下载等场景,都应优先选用 gRPC。

定义流式 gRPC 接口(.proto 文件)

流式能力由 Protocol Buffers 的 service 定义决定。关键看 stream 关键字位置:

  • 客户端流式rpc Upload(stream Chunk) returns (Status);(客户端连续发,服务端收完统一回)
  • 服务端流式rpc Subscribe(Request) returns (stream Event);(客户端发一次,服务端持续推多个响应)
  • 双向流式rpc Chat(stream Message) returns (stream Message);(双方可随时发、随时收,独立异步)

定义后用 protoc 工具生成 Go 代码(需安装 protoc-gen-goprotoc-gen-go-grpc 插件)。

服务端实现双向流式逻辑(示例节选)

以双向聊天流为例,服务端需在 handler 中启动 goroutine 处理接收,同时保持发送通道开放:

func (s *chatServer) Chat(stream pb.Chat_ChatServer) error {
    // 启动接收协程
    go func() {
        for {
            msg, err := stream.Recv()
            if err == io.EOF {
                return
            }
            if err != nil {
                log.Printf("recv err: %v", err)
                return
            }
            // 广播或转发逻辑(如存入 map 或发给其他 client)
        }
    }()
// 主协程负责发送(例如定时广播、或响应某事件)
ticker := time.NewTicker(5 * time.Second)
defer ticker.Stop()
for {
    select {
    case <-ticker.C:
        _ = stream.Send(&pb.Message{Content: "server heartbeat"})
    case <-stream.Context().Done():
        return stream.Context().Err()
    }
}

}

客户端使用流式客户端(发送+接收并行)

客户端需显式调用 Send()Recv(),通常用两个 goroutine 分离读写:

  • 一个 goroutine 循环调用 stream.Send() 发送用户输入或心跳
  • 另一个 goroutine 循环调用 stream.Recv() 读取服务端推送,处理或打印
  • 注意检查 io.EOF(流正常结束)和 context.Canceled(主动断开)

务必用 stream.CloseSend() 显式关闭发送端(尤其客户端流或双向流),否则服务端可能一直等待。

基本上就这些。gRPC 流式不是“配置开关”,而是由 proto 定义驱动、由生成代码约束、靠手动管理读写 goroutine 实现的协作模型。不复杂但容易忽略上下文控制和错误传播,建议搭配 errgroup 管理多协程生命周期。


# js  # json  # go  # golang  # 编码  # 工具  # stream  # google  # EOF  # 循环  # 接口  # Event  # 异步  # http  # rpc  # 流式  # 服务端  # 客户端  # 复用  # 封包  # 都是  # 这是  # 多个  # 是由  # 适用于 


相关文章: MySQL查询结果复制到新表的方法(更新、插入)  网站视频怎么制作,哪个网站可以免费收看好莱坞经典大片?  免费公司网站制作软件,如何申请免费主页空间做自己的网站?  大连网站制作费用,大连新青年网站,五年四班里的视频怎样下载啊?  建站VPS推荐:2025年高性能服务器配置指南  青岛网站建设如何选择本地服务器?  免费ppt制作网站,有没有值得推荐的免费PPT网站?  *服务器网站为何频现安全漏洞?  浙江网站制作公司有哪些,浙江栢塑信息技术有限公司定制网站做的怎么样?  常州企业建站如何选择最佳模板?  如何用免费手机建站系统零基础打造专业网站?  如何通过多用户协作模板快速搭建高效企业网站?  高端智能建站公司优选:品牌定制与SEO优化一站式服务  兔展官网 在线制作,怎样制作微信请帖?  道歉网站制作流程,世纪佳缘致歉小吴事件,相亲网站身份信息伪造该如何稽查?  宝塔Windows建站如何避免显示默认IIS页面?  如何选择长沙网站建站模板?H5响应式与品牌定制哪个更优?  如何用wdcp快速搭建高效网站?  建站主机是否等同于虚拟主机?  建站之星在线版空间:自助建站+智能模板一键生成方案  建站之星如何实现五合一智能建站与营销推广?  平台云上自助建站如何快速打造专业网站?  如何登录建站主机?访问步骤全解析  建站中国官网:模板定制+SEO优化+建站流程一站式指南  一键网站制作软件,义乌购一件代发流程?  佛山网站制作系统,佛山企业变更地址网上办理步骤?  免费网站制作appp,免费制作app哪个平台好?  制作假网页,招聘网的薪资待遇,会有靠谱的吗?一面试又各种折扣?  整人网站在线制作软件,整蛊网站退不出去必须要打我是白痴才能出去?  浅谈Javascript中的Label语句  如何选择PHP开源工具快速搭建网站?  如何通过免费商城建站系统源码自定义网站主题与功能?  建站主机类型有哪些?如何正确选型  学校建站服务器如何选型才能满足性能需求?  北京网站制作的公司有哪些,北京白云观官方网站?  天津个人网站制作公司,天津网约车驾驶员从业资格证官网?  如何在Windows虚拟主机上快速搭建网站?  如何快速建站并高效导出源代码?  西安专业网站制作公司有哪些,陕西省建行官方网站?  智能起名网站制作软件有哪些,制作logo的软件?  零服务器AI建站解决方案:快速部署与云端平台低成本实践  XML的“混合内容”是什么 怎么用DTD或XSD定义  建站之星免费版是否永久可用?  青浦网站制作公司有哪些,苹果官网发货地是哪里?  如何在云服务器上快速搭建个人网站?  深圳网站制作设计招聘,关于服装设计的流行趋势,哪里的资料比较全面?  php能控制zigbee模块吗_php通过串口与cc2530 zigbee通信【介绍】  武汉网站如何制作,黄黄高铁武穴北站途经哪些村庄?  无锡制作网站公司有哪些,无锡优八网络科技有限公司介绍?  南京网站制作费用,南京远驱官方网站? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。