

新闻资讯
技术学院Go 语言标准库 net/rpc 提供轻量级 RPC 框架,支持 TCP/HTTP 传输与 Gob/JSON 编码;服务端需注册首字母大写、指针接收者、固定签名的方法,客户端通过 Dial 连接并用 Call/Go 调用,注意序列化要求与错误处理。
Go 语言原生支持 RPC(Remote Procedure Call),标准库 net/rpc 提供了基于 HTTP 或 TCP 的简单 RPC 框架,适合轻量级、内部服务间通信。它默认使用 Gob 编码,也支持 JSON-RPC。实现的关键在于:服务端注册方法、客户端连接并调用,且方法签名必须满足特定规则。
RPC 方法必须定义在结构体上,且满足三个条件:首字母大写(导出)、接收者为指针、参数和返回值类型固定(两个,第二个必须是 error)。
Arith,包含 Add 方法rpc.Register 注册服务rpc.ServeConn 处理单个连接,或 rpc.HandleHTTP + http.Serve 启 HTTP 服务示例中常用 TCP 监听:listener, _ := net.Listen("tcp", ":8080"),再用 rpc.Accept(listener) 持续接受连接。
客户端通过 rpc.Dial(TCP)或 rpc.DialHTTP(HTTP)连接服务端,返回 *rpc.Client 实例。
client.Call("Service.Method", args, &reply),阻塞直到返回或超时client.Go("Service.Method", args, &reply, doneChan),结果通过 channel 获取"StructName.MethodName",如 "Arith.Add"
调用前确保 args 和 reply 是可序列化的(如 struct 字段首字母大写),否则编码失败。
标准 net/rpc 默认使用 Gob 编码,高效但仅限 Go 客户端。若需跨语言,应改用 net/rpc/jsonrpc 包。
rpc.ServeConn
jsonrpc.ServeConn 替代jsonrpc.Dial 或 jsonrpc.DialHTTP
JSON-RPC 请求体为标准 JSON 格式,兼容性更好,但性能略低,字段名需匹配 JSON tag(如 json:"a")。
RPC 调用可能因网络、服务不可用或方法 panic 失败,返回的 error 需检查;超时需靠底层连接控制。
net.DialTimeout("t
cp", addr, 5*time.Second),再传给 rpc.NewClient
context,但标准 net/rpc 不原生支持;可封装带 context 的 dial 或改用第三方库(如 gRPC)defer/recover 防止崩溃生产环境建议配合健康检查、重试机制和日志记录,提升鲁棒性。