不能,net/rpc仅适用于可信内网中两端均为Go且版本统一的轻量场景;它不支持跨语言、TLS、超时控制等生产必备特性,应优先选用gRPC。
Go 标准库 net/rpc 能直接用于生产环境吗?
不能,除非你控制两端且部署在可信内网。标准 net/rpc 使用 Go 自定义的二进制编码(gob),客户端和服务端必须都是 Go,并且版本兼容性敏感——比如 Go 1.20 编译的服务端,可能无法被 Go 1.18 客户端正常解码。它不支持 HTTP/2、TLS、超时控制、中间件或跨语言调用。
实操建议:
- 仅用于内部工具、CLI 间轻量通信,或教学演示
- 避免在微服务架构中作为主 RPC 协议
- 若坚持用,务必固定 Go 版本并统一
GOOS/GOARCH
如何用 net/rpc 快速跑通一个服务端和客户端?
核心是注册结构体方法、监听 TCP、用 rpc.Dial 连接。注意:方法签名必须严格满足 func(*T, *Args, *Reply) error 形式,且首字母大写(导出)。
示例服务端关键片段:
type Arith intfunc (t Arith) Multiply(args Args, reply Reply) error { reply.Value = args.A args.B return nil }
rpc.Register(new(Arith)) rpc.HandleHTTP() // 或 rpc.ServeConn(conn) http.ListenAndServe(":8080", nil)
客户端调用:
client, _ := rpc.DialHTTP("tcp", "localhost:8080")
defer client.Close()
args := &Args{A: 3, B: 4}
reply := &Reply{}
err := client.Call("Arith.Multiply", args, reply) // 方法名 = 结构体名.方法名
常见错误: