Rpc就是一个远程调用协议,采用客户端调用服务端的方式来实现一些功能。现在我们以http协议来做一个rpc服务为例
package main import ( "net/rpc" "net" "log" "net/http" ) //自己的数据类 type MyMath struct{ } //加法--只能两个参数--方法名第一个字母必须大写 func (mm *MyMath) Add(num map[string]int,reply *int) error { *reply = num["num1"] + num["num2"] return nil } //减法--只能两个参数--方法名第一个字母必须大写写 func (mm *MyMath) Sub(num map[string]int,reply *int) error { *reply = num["num1"] - num["num2"] return nil } func main() { //注册MyMath类,以代客户端调用 rpc.Register(new(MyMath)) rpc.HandleHTTP() l, e := net.Listen("tcp", ":1215") if e != nil { log.Fatal("listen error:", e) } http.Serve(l, nil) }
这样我们就完成了一个简单的http版本的rpc服务端,现在我们来看客户端怎么来调用上面的服务.
package main import ( "net/rpc" "fmt" "log" ) func main() { //连接服务 client, err := rpc.DialHTTP("tcp", "127.0.0.1:1215") if err != nil { log.Fatal("dialing:", err) } var reply int var num = make(map[string]int) num["num1"] = 3 num["num2"] = 2 //调用远程MyMath的Add方法,也只能是三个参数 err = client.Call("MyMath.Add",num,&reply) if err != nil { log.Fatal("arith error:", err) } //输出结果 fmt.Println(reply) //调用远程MyMath的Sub方法,也只能是三个参数 err = client.Call("MyMath.Sub",num,&reply) if err != nil { log.Fatal("arith error:", err) } //输出结果 fmt.Println(reply) client.Close() }
以上我们就完成了一个http协议的rpc的实现和调用,后续我们会以tcp协议的来举例!