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

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

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

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

  • 相关阅读:
    深入理解线程通信
    你应该知道的 volatile 关键字
    CSS-盒模型与文本溢出笔记
    Html-表单笔记
    浏览器中缓存Cache
    python-对requests请求简单的封装
    【译】MongoDb vs Mysql—以NodeJs为例
    太嚣张了!他竟用Python绕过了“验证码”
    【转】Python之道
    selenium-测试框架搭建(十三)
  • 原文地址:https://www.cnblogs.com/tomtellyou/p/12283774.html
Copyright © 2020-2023  润新知