zoukankan      html  css  js  c++  java
  • 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)
    }
    

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

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

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

  • 相关阅读:
    编译安装redis-3.2.9(latest stable version)
    MySQL之从忘记密码到重置密码
    Linux时间和时区设定
    java.net.UnknownHostException 异常处理(转)
    制作FastDFS的RPM包
    RPM包安装MySQL 5.7.18
    白鹭http请求post
    iframe嵌套页面 跨域
    git 配置 https和ssh 免密码登录 常用操作命令
    php 错误提示开启
  • 原文地址:https://www.cnblogs.com/tomtellyou/p/12283774.html
Copyright © 2011-2022 走看看