【Golang】Golang的RPC(Remote Procedure Call)

Golang 的 RPC(Remote Procedure Call)是一种用于不同计算机之间通信的技术。它允许在不同的计算机之间调用函数,就像本地调用一样。

在 Golang 中,可以使用net/rpc包来实现 RPC。它允许您将函数标记为可以远程调用,并在客户端和服务器之间自动序列化和反序列化参数和结果。

要使用 RPC,首先需要创建一个 RPC 服务端。这可以通过调用new()函数来完成。然后,可以通过调用rpc.Register()`函数来将函数注册到该服务端。这些函数必须满足一定的规则,比如必须是导出的(即首字母大写),并且只有两个参数,第一个参数是要传递的参数,第二个参数是要返回的结果,例如:

package main

import (
	"log"
	"net/http"
	"net/rpc"
)

type MyType struct{
    
    }

type Args struct {
    
    
	A, B int
}

func (t *MyType) Multiply(args *Args, reply *int) error {
    
    
	*reply = args.A * args.B
	return nil
}

func main() {
    
    
	rect := new(MyType)
	err := rpc.Register(rect)
	if err != nil {
    
    
		log.Fatal(err)
	}
	rpc.HandleHTTP()

	err = http.ListenAndServe(":9999", nil)
	if err != nil {
    
    
		log.Fatal(err)
	}
}

上面的代码定义了一个名为MyType的类型,其中包含一个名为Multiply的函数。Multiply 函数接受一个名为 args 的参数,其中包含要相乘的两个数字,并将结果存储在名为 reply 的指针中。它返回一个 error类型,该类型用于表示是否发生了任何错误。

接下来,可以启动服务端并开始侦听传入的连接。这可以通过调用 server.Accept() 函数来完成,它将一直阻塞,直到有新的连接建立。在连接建立后,服务器会自动调用注册的函数,并将结果发送回客户端。

客户端可以通过调用 rpc.DialHTTP() 函数来连接到 RPC 服务器,并使用 client.Call() 函数调用注册的函数。Call() 函数的第一个参数是要调用的函数名称,第二个参数是要传递的参数,并且第三个参数是用于存储结果的指针。例如:

package main

import (
	"fmt"
	"log"
	"net/rpc"
)

type Args struct {
    
    
	A, B int
}

func main() {
    
    
	// 连接 RPC 服务
	client, err := rpc.DialHTTP("tcp", "localhost:9999")
	if err != nil {
    
    
		log.Fatal("dialing:", err)
	}

	// 准备调用参数
	args := &Args{
    
    A: 7, B: 8}

	// 调用 Multiply 方法
	var reply int
	err = client.Call("MyType.Multiply", args, &reply)
	if err != nil {
    
    
		log.Fatal("Multiply error:", err)
	}

	// 输出调用结果
	fmt.Printf("MyType.Multiply(%d, %d) = %d\n", args.A, args.B, reply)
}

上面的代码创建了一个名为client的 RPC 客户端,并使用 Call()函数调用了名为 MyType.Multiply 的函数,并将结果存储在名为 reply 的变量中。

运行结果:
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/linjiuxiansheng/article/details/130190511