如何在Golang中实现RPC调用_客户端与服务端通信

18次阅读

go 语言标准库 net/rpc 提供轻量级 RPC 框架,支持 TCP/http 传输与 Gob/jsON 编码;服务端需注册首字母大写、指针接收者、固定签名的方法,客户端通过 Dial 连接并用 Call/Go 调用,注意序列化要求与错误处理。

如何在Golang中实现RPC调用_客户端与服务端通信

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"

调用前确保 argsreply 是可序列化的(如 struct 字段首字母大写),否则编码失败。

编码与协议:Gob 默认,JSON 可选

标准 net/rpc 默认使用 Gob 编码,高效但仅限 Go 客户端。若需跨语言,应改用 net/rpc/jsonrpc 包。

  • Gob 服务端:直接用 rpc.ServeConn
  • JSON-RPC 服务端:用 jsonrpc.ServeConn 替代
  • JSON-RPC 客户端:用 jsonrpc.Dialjsonrpc.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 防止崩溃

生产环境建议配合健康检查、重试机制和日志记录,提升鲁棒性。

text=ZqhQzanResources