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协议的来举例!
