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 实例。
立即学习“go语言免费学习笔记(深入)”;
- 同步调用用
client.Call("Service.Method", args, &reply),阻塞直到返回或超时 - 异步调用用
client.Go("Service.Method", args, &reply, doneChan),结果通过 channel 获取 - 注意:方法名格式为
"StructName.MethodName",如"Arith.Add"
调用前确保 args 和 reply 是可序列化的(如 struct 字段首字母大写),否则编码失败。
采用HttpClient向服务器端action请求数据,当然调用服务器端方法获取数据并不止这一种。WebService也可以为我们提供所需数据,那么什么是webService呢?,它是一种基于SAOP协议的远程调用标准,通过webservice可以将不同操作系统平台,不同语言,不同技术整合到一起。 实现Android与服务器端数据交互,我们在PC机器java客户端中,需要一些库,比如XFire,Axis2,CXF等等来支持访问WebService,但是这些库并不适合我们资源有限的android手机客户端,
编码与协议:Gob 默认,JSON 可选
标准 net/rpc 默认使用 Gob 编码,高效但仅限 Go 客户端。若需跨语言,应改用 net/rpc/jsonrpc 包。
- Gob 服务端:直接用
rpc.ServeConn - JSON-RPC 服务端:用
jsonrpc.ServeConn替代 - JSON-RPC 客户端:用
jsonrpc.Dial或jsonrpc.DialHTTP
JSON-RPC 请求体为标准 JSON 格式,兼容性更好,但性能略低,字段名需匹配 JSON tag(如 json:"a")。
错误处理与超时控制
RPC 调用可能因网络、服务不可用或方法 panic 失败,返回的 error 需检查;超时需靠底层连接控制。
- 设置连接超时:
net.DialTimeout("tcp", addr, 5*time.Second),再传给rpc.NewClient - 调用超时:Go 1.8+ 支持
context,但标准net/rpc不原生支持;可封装带 context 的 dial 或改用第三方库(如 gRPC) - 服务端 panic 会断开连接,建议在 RPC 方法内加
defer/recover防止崩溃
生产环境建议配合健康检查、重试机制和日志记录,提升鲁棒性。









