在 Golang 中,可以使用标准库中的 net/rpc 包实现 RPC 远程过程调用。通过 net/rpc 包提供的函数和类型,我们可以将一个函数暴露给其他机器或进程调用,也可以远程调用其他机器或进程暴露的函数。以下是一个简单的 RPC 例子:
// 定义一个 RPC 的请求和响应结构体
type Args struct {
A, B int
}
type Reply struct {
C int
}
// 定义一个计算器服务对象
type Calculator struct{}
func (c *Calculator) Add(args *Args, reply *Reply) error {
reply.C = args.A + args.B
return nil
}
// 注册计算器服务
calculator := new(Calculator)
rpc.Register(calculator)
// 开始监听指定的网络地址,并接收远程调用
listener, err := net.Listen("tcp", "127.0.0.1:1234")
if err != nil {
log.Fatal("listen error:", err)
}
for {
conn, err := listener.Accept()
if err != nil {
log.Fatal("accept error:", err)
}
// 处理远程调用
go rpc.ServeConn(conn)
}
在上面的例子中,我们定义了一个名为 Calculator 的服务对象,其中有一个 Add 方法可以将两个整数相加并返回结果。我们使用 rpc.Register(calculator) 将其注册为 RPC 服务,然后通过 net.Listen 开始监听指定的网络地址。最后,在一个无限循环中,我们通过 listener.Accept() 接收远程调用请求,并通过 rpc.ServeConn 处理请求。