Go 的 net/rpc 默认基于自定义二进制协议,不支持直接通过 HTTP curl 调用;但启用 rpc/jsonrpc 后可暴露 JSON-RPC 1.0 接口,此时可通过 curl 发送标准 JSON-RPC 请求与 Go RPC 服务交互。
go 的 `net/rpc` 默认基于自定义二进制协议,不支持直接通过 http curl 调用;但启用 `rpc/jsonrpc` 后可暴露 json-rpc 1.0 接口,此时可通过 curl 发送标准 json-rpc 请求与 go rpc 服务交互。
Go 标准库的 net/rpc 包默认使用私有、基于 TCP 的二进制编码协议(Gob),不兼容 HTTP 协议栈,因此无法直接用 curl 发起常规 HTTP 请求(如 GET/POST)进行调用。这也是你执行 curl -X CONNECT --url localhost:1234/_goRPC 时收到 404 Not Found 的根本原因:该端点并非 HTTP 服务器,而是一个裸 TCP RPC 服务,不理解 HTTP 方法或路径语义。
✅ 正确路径是切换至 net/rpc/jsonrpc 子包——它在保持 net/rpc 服务逻辑不变的前提下,将传输层封装为 JSON-RPC 1.0 格式,并通过标准 HTTP(通常是 POST)承载。注意:虽然协议名为 JSON-RPC,但 Go 的 jsonrpc 实现实际复用 HTTP 连接,且要求使用 POST 方法(非 CONNECT),这是社区常见误区。
✅ 正确的 curl 调用方式(JSON-RPC 1.0)
假设你已按如下方式启动了 JSON-RPC 服务(关键:使用 jsonrpc.ServeConn 或 http.HandlerFunc 包装):
// server.go
package main
import (
"log"
"net"
"net/http"
"net/rpc"
"net/rpc/jsonrpc"
)
type Args struct{ A, B int }
type Arith int
func (t *Arith) Multiply(r *Args, ret *int) error {
*ret = r.A * r.B
return nil
}
func main() {
rpc.Register(new(Arith))
rpc.HandleHTTP() // 注意:此行注册 /_goRPC 路径(仅对 jsonrpc 有效)
listener, _ := net.Listen("tcp", ":1234")
log.Println("RPC server listening on :1234")
http.Serve(listener, nil)
}此时服务监听 :1234,并通过 / _goRPC 路径提供 JSON-RPC 接口(由 rpc.HandleHTTP() 自动注册)。你可使用以下 curl 命令调用 Arith.Multiply 方法:
curl -X POST \
-H "Content-Type: application/json" \
--data '{"method":"Arith.Multiply","params":[{"A":7,"B":6}],"id":1}' \
http://localhost:1234/_goRPC✅ 输出示例:
{"id":1,"result":42,"error":null}⚠️ 关键注意事项
- 方法名格式:必须为 "ServiceName.MethodName"(首字母大写),如 Arith.Multiply,不可省略服务名;
- 参数结构:"params" 是单元素数组,即使方法只有一个参数,也需包裹为 [arg];若参数是结构体(如 Args),须严格匹配字段名与类型;
- HTTP 方法:必须用 POST,CONNECT 是隧道协议,不被 jsonrpc 处理;
- Content-Type:必须显式设置为 application/json,否则 Go 的 jsonrpc 解析器会拒绝请求;
- ID 字段:建议使用数字或字符串作为请求标识,便于客户端追踪响应(异步场景下尤其重要);
- 错误调试:若返回空响应或 500 Internal Server Error,请检查 Go 服务端日志——常见原因是参数类型不匹配、未导出字段、或 rpc.Register 未正确调用。
? 总结
要实现语言无关地调用 Go RPC 服务,不要尝试“模拟”原生 Gob 协议(复杂、脆弱、无标准),而应主动采用 net/rpc/jsonrpc 并遵循 JSON-RPC 1.0 规范。它提供了清晰的序列化契约(JSON)、标准的 HTTP 传输和广泛的语言支持(Python、JavaScript、Java 等均有成熟 JSON-RPC 客户端库)。对于新项目,也更推荐直接使用 gRPC 或 REST/HTTP+JSON,但理解 jsonrpc 的集成方式,是打通 Go 微服务与异构系统的重要基础能力。


















