首页 > 其他 > 详细

golang原生的RPC实现

时间:2020-02-08 18:36:08      阅读:79      评论:0      收藏:0      [点我收藏+]

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)
}

golang原生的RPC实现

原文:https://www.cnblogs.com/tomtellyou/p/12283774.html

(1)
(1)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!