Golang中如何实现RPC远程过程调用?代码举例讲解

在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调用。