在Golang中,可以使用net/rpc实现RPC远程过程调用。代码示例:
服务端:
go
type Args struct {
A, B int
}
type Quotient struct {
Quo, Rem int
}
type Arith int
func (t *Arith) Multiply(args *Args, reply *int) error {
*reply = args.A * args.B
return nil
}
func (t *Arith) Divide(args *Args, quo *Quotient) error {
quo.Quo = args.A / args.B
quo.Rem = args.A % args.B
return nil
}
func main() {
arith := new(Arith)
rpc.Register(arith)
rpc.HandleHTTP()
listen, err := net.Listen("tcp", ":1234")
if err != nil {
log.Fatal("listen error:", err)
}
go http.Serve(listen, nil)
}
服务端注册Arith类型的RPC服务,包含Multiply和Divide两个方法,然后通过调用rpc.HandleHTTP()开启HTTP RPC服务。
客户端:
go
client, err := rpc.DialHTTP("tcp", "localhost:1234")
if err != nil {
log.Fatal("dialing:", err)
}
// 调用Multiply方法
args := &Args{7, 8}
var reply int
err = client.Call("Arith.Multiply", args, &reply)
if err != nil {
log.Fatal(err)
}
fmt.Printf("Arith: %d*%d=%d\n", args.A, args.B, reply)
// 调用Divide方法
quo := new(Quotient)
err = client.Call("Arith.Divide", args, quo)
if err != nil {
log.Fatal("arith error:", err)
}
fmt.Printf("Arith: %d/%d=%d rem %d\n", args.A, args.B, quo.Quo, quo.Rem)
客户端通过rpc.DialHTTP连接到RPC服务器,然后调用client.Call()方法远程调用Arith服务的Multiply和Divide方法,从而实现RPC调用。