首页 > 后端开发 > Golang > 正文

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

P粉602998670
发布: 2025-12-12 19:50:03
原创
413人浏览过
gRPC支持流式通信,因net/rpc仅支持同步请求响应,而gRPC基于HTTP/2提供客户端流、服务端流和双向流,适用于实时推送等场景,需通过proto文件定义stream并生成代码实现,配合goroutine管理读写。

如何使用golang实现rpc流式通信_golang rpc流式数据处理方法

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 插件)。

立即学习go语言免费学习笔记(深入)”;

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

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

Procys
Procys

AI驱动的发票数据处理

Procys 102
查看详情 Procys
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)
        }
    }()
<pre class="brush:php;toolbar:false;">// 主协程负责发送(例如定时广播、或响应某事件)
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 管理多协程生命周期。

以上就是如何使用Golang实现RPC流式通信_Golang RPC流式数据处理方法的详细内容,更多请关注php中文网其它相关文章!

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号