Go 语言 net/rpc 实现双向 RPC 需双方均启动 RPC Server 并互相注册 handler;客户端须监听地址、导出方法、告知服务端 callback 地址,服务端通过新建连接调用;推荐 JSON-RPC + HTTP,注意连接生命周期与资源泄漏防控。

Go 语言标准库的 net/rpc 包原生支持双向 RPC,但需注意:它本身不直接提供“客户端也能被服务端调用”的能力,必须通过双方都启动 RPC 服务并互相注册 handler 来实现双向调用。核心思路是:客户端既是 RPC 调用方(client),也是 RPC 服务端(server);服务端同理。
标准 rpc.ServeConn 或 rpc.ServeHTTP 只监听连接,不自动反向暴露接口。要让服务端能调用客户端方法,客户端必须:
localhost:8081),启动自己的 rpc.Server
ClientHandler),导出方法(首字母大写 + 符合 RPC 方法签名:func(*Args, *Reply) error)net/rpc/jsonrpc 比默认 gob 更易调试,且天然兼容 HTTP。推荐结构:
:8080,提供 UserSvc 和 NotifySvc 等服务:8081,注册 ClientCallback 服务(含 OnDataUpdate 等方法)http://127.0.0.1:8081/rpc),服务端保存并创建对应 clientjsonrpc.NewClient 连接该地址,发起回调双向连接容易引发 goroutine 泄漏或死锁,务必注意:
立即学习“go语言免费学习笔记(深入)”;
context.WithTimeout 控制调用超时sync.Map 并配合心跳/重连机制;客户端退出前主动通知服务端注销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中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号