贝利信息

如何在Golang中实现RPC调用_RPC调用流程与实现方式

日期:2026-01-15 00:00 / 作者:P粉602998670
最简 net/rpc 调用需服务端用 rpc.RegisterName("Arith", new(Arith)) 注册、监听 TCP 并 Accept,客户端用 client.Call("Arith.Multiply", &args, &reply);方法签名必须为 func(T, Arg, *Reply) error,且字段全导出。

Go 标准库 net/rpc 怎么跑通一个最简调用

标准库的 net/rpc 默认基于 HTTP 或 TCP 传输,使用 Go 自带的 gob 编码。它不依赖外部框架,但要求服务端和客户端类型定义严格一致,且只支持导出(首字母大写)的方法。

关键约束:func (t *T) MethodName(argType *Arg, replyType *Reply) error 必须满足:接收者是指针、两个参数都是指针、返回 error

package main

import ( "net/rpc" "net" "log" )

type Args struct{ A, B int } type Reply struct{ Result int }

type Arith int

func (t Arith) Multiply(args Args, reply Reply) error { reply.Result = args.A args.B return nil }

func main() { rpc.RegisterName("Arith", new(Arith)) listener, _ := net.Listen("tcp", ":1234") rpc.Accept(listener) }

为什么用 jsonrpc 替代默认 gob 编码

gob 是 Go 专属二进制格式,跨语言调用完全不可行;而 jsonrpc 协议天然兼容 Python、Node.js、curl 等任意能发 HTTP POST 的客户端。Go 标准库提供了 net/rpc/jsonrpc 包,只需替换连接建立方式。

rpc.Client.Call 返回 rpc: can't find method 怎么排查

这个错误和网络无关,只表示服务端没找到对应方法。常见原因不是拼写错,而是结构体字段未导出或参数类型不匹配。

生产环境为什么不推荐裸用 net/rpc

它缺少超时控制、上下文传播、中间件、服务发现、负载均衡等现代 RPC 必备能力。例如 client.Call 没有 context.Context 参数,无法主动取消;也没有内置重试或熔断。

如果只是内部小工具或 PoC,net/rpc 足够快;但只要

涉及稳定性、可观测性或跨团队协作,就得接受它只是一个教学级参考实现。