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)
}
----------------------------------【喜欢打赏】-------------------------------------------
小主,辛苦啦!文章棒棒哒,赏杯咖啡吧...
----------------------------------【喜欢打赏】-------------------------------------------
【励志篇】:
古之成大事掌大学问者,不惟有超世之才,亦必有坚韧不拔之志。