美文网首页
Go RPC demo

Go RPC demo

作者: 来到了没有知识的荒原 | 来源:发表于2020-07-18 23:53 被阅读0次

模拟RPC调用

文件目录结构

server.go

package main

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

//数学计算
type MathUtil struct {
}

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

func (mu *MathUtil) Add(param param.AddParma, resp *float32) error {
    *resp = param.Args1 + param.Args2 //实现两数相加的功能
    return nil
}

//main 方法
func main() {

    //1、初始化指针数据类型
    mathUtil := new(MathUtil) //初始化指针数据类型

    //2、调用net/rpc包的功能将服务对象进行注册
    err := rpc.Register(mathUtil)
    if err != nil {
        panic(err.Error())
    }

    //3、通过该函数把mathUtil中提供的服务注册到HTTP协议上,方便调用者可以利用http的方式进行数据传递
    rpc.HandleHTTP()

    //4、在特定的端口进行监听
    listen, err := net.Listen("tcp", ":8881")
    if err != nil {
        panic(err.Error())
    }
    http.Serve(listen, nil)
}

client.go

package main

import (
    "fmt"
    "net/rpc"
)

//客户端逻辑实现
func main() {

    client, err := rpc.DialHTTP("tcp", "localhost:8881")
    if err != nil {
        panic(err.Error())
    }

    var req float32 //请求值
    req = 5

    //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)
    //fmt.Println(*respSync)
    replayDone := <-syncCall.Done  // 从channel里读取,阻塞在这里,必须等到syncCall拿到数据。达到同步的效果
    fmt.Println(replayDone)  // chan 类型
    fmt.Println(*respSync)
}

client2.go

多参数
把多参数封装入结构体中

package main

import (
    "./param"
    "fmt"
    "net/rpc"
)

func main() {
    client, err := rpc.DialHTTP("tcp", ":8881")
    if err != nil {
        panic(err.Error())
    }

    var result *float32
    addParma := &param.AddParma{Args1: 1.2, Args2: 2.3}
    err = client.Call("MathUtil.Add", addParma, &result)
    if err != nil {
        panic(err.Error())
    }
    fmt.Println("计算结果:", *result)
}

addParam.go

package param

type AddParma struct {
    Args1 float32 //第一个参数
    Args2 float32 //第二个参数
}

相关文章

  • Go RPC demo

    模拟RPC调用 server.go client.go client2.go 多参数把多参数封装入结构体中 add...

  • Go RPC

    Go RPC Go 原生的网络RPC需要关联Go的net框架和库内容(net,tpc,http等等) 理论 总体来...

  • rpc demo

    client server

  • RPC demo

    RPC Server端代码,主要是使用ServerSocket获得rpc调用客户端发送过来的类信息,方法信息及方法...

  • grpc

    Go的RPC标准库 简单使用 Go语言标准库(net/rpc)的RPC规则:方法只能有两个可序列化的参数,其中第二...

  • golang中的net/rpc包

    本文先介绍RPC,然后go原生对RPC的使用,之后是介绍go语言中有哪些RPC框架以及一些其他常见的框架,最后是探...

  • go-zero开发-rpc

    通过修改go-zero rpc的模板 下方指令用于生成rpc服务

  • 【golang微服务】RPC原理与Go RPC

    本文介绍了RPC的概念以及Go语言中标准库rpc的基本使用。 什么是RPC RPC(Remote Procedur...

  • Micro (3)

    go-micro RPC框架源码分析 最近由于辞职,心想着要好好研究下RPC的实现,于是乎,就拿go-micro开...

  • Go RPC

    什么是RPC? RPC全称Remote Procedure Call译为远程过程调用 RPC是一个计算机通信协议,...

网友评论

      本文标题:Go RPC demo

      本文链接:https://www.haomeiwen.com/subject/waifkktx.html