不能,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 形式,且首字母大写(导出)。
示例服务端关键片段:
立即学习“go语言免费学习笔记(深入)”;
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) // 方法名 = 结构体名.方法名
常见错误:
请注意以下说明:1、本程序允许任何人免费使用。2、本程序采用PHP+MYSQL架构编写。并且经过ZEND加密,所以运行环境需要有ZEND引擎支持。3、需要售后服务的,请与本作者联系,联系方式见下方。4、本程序还可以与您的网站想整合,可以实现用户在线服务功能,可以让客户管理自己的信息,可以查询自己的订单状况。以及返点信息等相关客户利益的信息。这个功能可提高客户的向心度。安装方法:1、解压本系统,放在
-
rpc: can't find service Arith.Multiply→ 没调用rpc.Register,或结构体没用指针传入 -
unexpected EOF→ 客户端连接后未及时关闭,或服务端未正确处理连接生命周期 - 参数/返回值类型未导出(小写字段)→
gob编码失败,静默无响应
想支持跨语言或 HTTP API,该换什么?
选 gRPC-Go(基于 Protocol Buffers + HTTP/2)。它生成强类型 stub,天然支持 Python/Java/JS 等语言客户端,自带流控、拦截器、TLS 和健康检查。
关键差异点:
- 接口定义写在
.proto文件里,不是 Go 源码 - 服务端启动用
grpc.NewServer(),不是http.ListenAndServe - 客户端 Dial 地址格式为
"127.0.0.1:50051"(纯 TCP),不是"tcp://..." - 必须显式调用
server.GracefulStop(),否则 SIGTERM 可能丢请求
不推荐用 REST 替代 RPC:HTTP/1.1 文本解析开销大,无内置流、超时传播、负载均衡策略支持。
为什么你的 net/rpc 服务压测时连接数暴涨又断连?
因为默认没有连接池和复用机制。每次 rpc.DialHTTP 都新建 TCP 连接,短连接下 TIME_WAIT 积压,服务端 Accept 队列满就拒绝新连接。
缓解方式有限:
- 客户端改用长连接:
rpc.DialHTTPPath+ 复用*rpc.Client实例(但需自行管理并发安全) - 服务端加
http.Server.ReadTimeout/WriteTimeout防僵死 - 无论如何,都比不上 gRPC 的连接多路复用(single TCP conn multiplexes many RPCs)
真正需要稳定、可观测、可运维的 RPC,从第一天就该用 gRPC 或者至少是 twirp(基于 JSON over HTTP/1.1,兼容性更好但性能略低)。









