要实现 golang 的 rpc 跨语言调用,关键在于替换默认的 gob 编码为通用协议。1. 使用通用协议替代 gob:可选 json-rpc 或 grpc+protobuf,前者适合轻量级交互,后者适合高性能和强类型接口;2. json-rpc 实现要点:需定义导出字段的结构体参数,使用 jsonrpc 包实现服务端与客户端通信,但不支持流式通信;3. 更推荐的方式是 grpc+protobuf:通过定义 proto 文件生成多语言代码,实现清晰接口与高效通信,并支持高级功能;4. 注意事项包括编码一致性、错误处理统一、版本兼容性及性能考量,grpc 性能优于 json-rpc。

Golang 的 RPC 框架默认使用的是 Gob 编码,这在跨语言调用时是个障碍。因为其他语言比如 Python、Java、C++ 等通常不支持 Gob 协议,所以要实现跨语言的 RPC 调用,关键在于协议的兼容性设计和通信格式的选择。

Go 原生的 net/rpc 默认使用 Gob 进行序列化和反序列化,而这种格式只有 Go 支持。要想跨语言,就得换成 JSON 或 Protobuf 这样的通用协议。

rpc/jsonrpc 包,可以方便地实现基于 JSON 的 RPC 调用。这种方式结构清晰,其他语言也普遍支持。如果你只是想简单试水或者做轻量级服务交互,JSON-RPC 是个不错的起点;如果追求高性能、强类型接口和完整的 API 定义,建议直接上 gRPC。
立即学习“go语言免费学习笔记(深入)”;
Go 中使用 JSON-RPC 并不复杂:

type Args struct {
A, B int
}
type Arith int
func (t *Arith) Multiply(args *Args, reply *int) error {
*reply = args.A * args.B
return nil
}
// 服务端:
server := rpc.NewServer()
server.Register(&Arith{})
ln, _ := net.Listen("tcp", ":8080")
for {
conn, _ := ln.Accept()
go server.ServeCodec(jsonrpc.NewServerCodec(conn))
}客户端调用方式如下(Python 示例):
import jsonrpclib
server = jsonrpclib.Server('http://localhost:8080')
result = server.Multiply({'A': 3, 'B': 4})
print(result) # 输出 12需要注意几点:
如果你的应用需要更正式的服务定义、更好的性能和更强的扩展性,那还是应该用 gRPC。
基本步骤如下:
.proto 文件,声明 service 和 messageprotoc 工具生成对应语言的代码例如,一个简单的 proto 文件:
syntax = "proto3";
package example;
service Arith {
rpc Multiply (MultiplyRequest) returns (MultiplyResponse);
}
message MultiplyRequest {
int32 a = 1;
int32 b = 2;
}
message MultiplyResponse {
int32 result = 1;
}Go 实现服务端后,Java、Python、Node.js 都可以轻松生成对应的客户端代码进行调用。
优势很明显:
Name 对应 Python 的 name
基本上就这些。选好协议,定义好接口,剩下的就是各自语言的实现了。
以上就是Golang的RPC如何实现跨语言调用 协议兼容性与实践的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号