Go语言的RPC包
的路径为net/rpc
,也就是放在了net包
目录下面。因此我们可以猜测该RPC包
是建立在net包
基础之上的
1.服务端
package main
import (
"net"
"net/rpc"
)
type HelloWordService struct{}
func (h *HelloWordService) SayHelloWord(request string, reply *string) error {
*reply = request + " 打印了'Hello Word!'"
return nil
}
func main() {
_ = rpc.RegisterName("HelloWordService",&HelloWordService{})
listener, err := net.Listen("tcp",":8090")
if err != nil {
panic(err)
}
conn,err := listener.Accept()
if err != nil {
panic("建立连接失败!")
}
rpc.ServeConn(conn)
}
SayHelloWord方法,必须满足Go语言的RPC规则:方法只能有两个可序列化的参数,其中第二个参数是指针类型,并且返回一个error类型,同时必须是公开的方法。
2.客户端
package main
import (
"fmt"
"log"
"net/rpc"
)
func main() {
client,err := rpc.Dial("tcp","127.0.0.1:8090")
if err != nil {
log.Fatal("拨号失败!")
}
var reply string
err = client.Call("HelloWordService.SayHelloWord","spl",&reply)
if err != nil {
log.Fatal(err)
}
fmt.Println(reply)
}
首先是通过rpc.Dial拨号RPC服务,然后通过client.Call调用具体的RPC方法。在调用client.Call时,第一个参数是用点号链接的RPC服务名字和方法名字,第二和第三个参数分别我们定义RPC方法的两个参数。