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

如何使用Golang构建双向RPC通信_客户端与服务端互调数据

P粉602998670
发布: 2025-12-20 13:24:08
原创
647人浏览过
Go 语言 net/rpc 实现双向 RPC 需双方均启动 RPC Server 并互相注册 handler;客户端须监听地址、导出方法、告知服务端 callback 地址,服务端通过新建连接调用;推荐 JSON-RPC + HTTP,注意连接生命周期与资源泄漏防控。

如何使用golang构建双向rpc通信_客户端与服务端互调数据

Go 语言标准库net/rpc 包原生支持双向 RPC,但需注意:它本身不直接提供“客户端也能被服务端调用”的能力,必须通过双方都启动 RPC 服务并互相注册 handler 来实现双向调用。核心思路是:客户端既是 RPC 调用方(client),也是 RPC 服务端(server);服务端同理。

服务端主动调用客户端的关键:客户端也要启动 RPC Server

标准 rpc.ServeConnrpc.ServeHTTP 只监听连接,不自动反向暴露接口。要让服务端能调用客户端方法,客户端必须:

  • 监听一个本地或可访问的网络地址(如 localhost:8081),启动自己的 rpc.Server
  • 注册至少一个 handler(例如 ClientHandler),导出方法(首字母大写 + 符合 RPC 方法签名:func(*Args, *Reply) error
  • 在连接建立后,把自身服务地址告诉服务端(可通过初始握手消息、配置文件、或服务端预置方式)

使用 HTTP+JSON-RPC 实现双向通信更简洁

net/rpc/jsonrpc 比默认 gob 更易调试,且天然兼容 HTTP。推荐结构:

  • 服务端监听 :8080,提供 UserSvcNotifySvc 等服务
  • 客户端启动时监听 :8081,注册 ClientCallback 服务(含 OnDataUpdate 等方法)
  • 客户端首次连接服务端时,发送自身 callback 地址(如 http://127.0.0.1:8081/rpc),服务端保存并创建对应 client
  • 服务端后续可通过 jsonrpc.NewClient 连接该地址,发起回调

避免连接循环与资源泄漏的实用技巧

双向连接容易引发 goroutine 泄漏或死锁,务必注意:

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

MacsMind
MacsMind

电商AI超级智能客服

MacsMind 192
查看详情 MacsMind
  • 每个 RPC 连接应有明确生命周期,建议用 context.WithTimeout 控制调用超时
  • 客户端连接服务端后,不要复用同一连接发起反向调用(gob 编码不支持双工);应新建独立连接到客户端监听地址
  • 服务端保存客户端 callback client 时,用 sync.Map 并配合心跳/重连机制;客户端退出前主动通知服务端注销
  • 所有 handler 方法末尾加 defer 日志或计数器,便于排查未结束调用

一个最小可运行示例的核心片段

客户端启动 RPC server:

l, _ := net.Listen("tcp", ":8081")
s := rpc.NewServer()
s.RegisterName("Client", &ClientHandler{})
go http.Serve(l, s)
登录后复制

服务端调用客户端:

client, _ := jsonrpc.DialHTTP("tcp", "127.0.0.1:8081")
var reply string
client.Call("Client.OnDataUpdate", args, &reply)
登录后复制

关键点:方法名格式为 "ServiceName.MethodName",参数和返回值必须是导出类型,且有无参构造函数。

不复杂但容易忽略:双向 RPC 不是开箱即用的“对等通信”,而是两个独立 RPC 系统通过约定地址和协议协作完成的。只要双方都跑 server、都建 client、地址互通、方法匹配,就能稳定互调。

以上就是如何使用Golang构建双向RPC通信_客户端与服务端互调数据的详细内容,更多请关注php中文网其它相关文章!

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

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

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

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