RPC入门使用
-
服务端
-
注册rpc服务对象。给对象绑定方法(定义类、绑定类方法)
rpc.RegisterName("服务名",回调对象)
-
创建一个监听器
listener,err := net.Listen()
-
建立连接
conn,err := listener.Accept()
-
将连接绑定rpc
rpc.ServeConn(conn)
-
-
客户端
-
用rpc连接服务器
conn,err := rpc.Dial()
-
调用远程函数
conn.Call("服务名.方法名",传入参数,传出参数)
-
-
案例
-
server.go
//server.go package main import ( "fmt" "net" "net/rpc" ) //定义类对象 type World struct { } //绑定类方法 func (this *World)HelloWorld(name string, resp *string) error { *resp = name + "你好" return nil } func main() { //注册rpc服务,绑定对象方法 err := rpc.RegisterName("hello", new(World)) if err != nil { fmt.Println("注册rpc服务失败!:",err) return } //设置监听 listener, err := net.Listen("tcp", "127.0.0.1:8080") if err != nil { fmt.Println("设置监听失败!:",err) return } fmt.Println("开始监听") defer listener.Close() //建立连接 conn, err := listener.Accept() if err != nil { fmt.Println("建立连接失败!:",err) return } fmt.Println("连接建立成功") defer conn.Close() //绑定服务 rpc.ServeConn(conn) }
-
client.go
//client.go package main import ( "fmt" "net/rpc" ) func main() { //用rpc连接服务器 conn, err := rpc.Dial("tcp", "127.0.0.1:8080") if err != nil { fmt.Println("远程连接rpc失败:", err) return } defer conn.Close() //调用远程函数 var reply string err = conn.Call("hello.HelloWorld", "李白", &reply) if err != nil { fmt.Println("调用远程方法失败:", err) return } fmt.Println(reply) }
-
JSONRPC
-
由于rpc使用go语言特有的数据序列化gob,其他语言乱码
-
修改客户端
conn, err := jsonrpc.Dial("tcp", "127.0.0.1:8080")
-
修改服务器
jsonrpc.ServeConn(conn)