打赏

golang原生的RPC实现

server端代码

package main

import (
	"math"
	"net"
	"net/http"
	"net/rpc"
)

//math calculate
type MathUtil struct {

}

//该方法对外暴露,提供计算圆形面积的服务
func (mu *MathUtil)CalculateCircleArea(req float32,resp *float32)error{
	*resp = math.Pi * req * req  //计算圆形面积 s= pi * r * r
	return nil
}

func main(){
	//1.初始化指针数据类型
	mathUtil := new(MathUtil)
	//2.调用net/rpc包的功能 将服务对象进行注册
	err := rpc.Register(mathUtil)   //如果想自定义服务名,可以使用rpc.RegisterName("MathUtil",mathUtil)
	if err != nil {
		panic(err.Error())
	}
	//3.通过该函数把mathUtil中提供的服务注册到http协议上,方便调用者可以利用http的方式进行数据传递
	rpc.HandleHTTP()
	//4.在特定的端口进行监听
	listen,err := net.Listen("tcp",":8081")
	if err!=nil {
		panic(err.Error())
	}
	http.Serve(listen,nil)
}

client端实现

package main

import (
	"fmt"
	"net/rpc"
)

func main(){
	client,err := rpc.DialHTTP("tcp","localhost:8081")
	if err != nil {
		panic(err.Error())
	}
	var req float32  //如果req参数为多个参数,可以自定义结构体,对参数进行封装
	req = 3

	var resp *float32
	//同步的方式进行调用
	err = client.Call("MathUtil.CalculateCircleArea",req,&resp)
	if err != nil {
		panic(err.Error())
	}
	fmt.Println(*resp)

	//异步调用
	var respSync *float32
	syncCall := client.Go("MathUtil.CalculateCircleArea",req,&respSync,nil)
	replayDone := <-syncCall.Done   //读取channel中的数据,感知异步调用的返回结果,没有结果一直阻塞
	fmt.Println(replayDone)
	fmt.Println(*respSync)
}

----------------------------------【喜欢打赏】-------------------------------------------

小主,辛苦啦!文章棒棒哒,赏杯咖啡吧...
打赏

----------------------------------【喜欢打赏】-------------------------------------------

posted @ 2020-02-08 16:15  苍山落暮  阅读(594)  评论(0编辑  收藏  举报