golang版本的http协议的rpc服务

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

此条目发表在 网站开发 分类目录,贴了 , 标签。将固定链接加入收藏夹。

评论功能已关闭。