RPC工作流程图

  • 1.调用客户端句柄;执行传送参数
  • 2.调用本地系统内核发送网络消息
  • 3.消息传送到远程主机
  • 4.服务器句柄得到消息并取得参数
  • 5.执行远程过程
  • 6.执行的过程将结果返回服务器句柄
  • 7.服务器句柄返回结果,调用远程系统内核
  • 8.消息传回本地主机
  • 9.客户句柄由内核接收消息
  • 10.客户接收句柄返回的数据

Go语言提供对RPC的支持:HTTP、TCP、JSPNRPC,但是在GoRPC是独一无二的,它采用了GoLang Gob编码,只能支持Go语言!

  • GoLang Gob:是Golang包自带的一个数据结构序列化的编码/解码工具。编码使用Encoder,解码使用Decoder。一种典型的应用场景就是RPC(remote procedure calls)。

HTTP RPC Demo

  • 服务端的代码

    package main
    
    import (
    "errors"
    "fmt"
    "net/http"
    "net/rpc"
    ) type Arith int func rpcDemo() {
    arith := new(Arith)
    fmt.Println("arith===", arith) rpc.Register(arith)
    //HandleHTTP将RPC消息的HTTP处理程序注册到Debug服务器
    //DEFAUTUPCPATH和Debug调试路径上的调试处理程序。
    //仍然需要调用http.Services(),通常是在GO语句中。
    rpc.HandleHTTP()
    err := http.ListenAndServe(":1234", nil)
    if err != nil {
    fmt.Println("err=====", err.Error())
    }
    } type Args struct {
    A, B int
    } type Quotient struct {
    Quo, Rem int
    } //函数必须是导出的(首字母大写)
    //必须有两个导出类型的参数,
    //第一个参数是接收的参数,第二个参数是返回给客户端的参数,第二个参数必须是指针类型的
    //函数还要有一个返回值error
    func (t *Arith) Multiply(args *Args, reply *int) error {
    *reply = args.A * args.B
    fmt.Println("这个方法执行了啊---嘿嘿--- Multiply ", reply) return nil
    } func (t *Arith) Divide(args *Args, quo *Quotient) error {
    if args.B == {
    return errors.New("divide by zero")
    } quo.Quo = args.A / args.B
    quo.Rem = args.A % args.B
    fmt.Println("这个方法执行了啊---嘿嘿--- Divide quo==", quo) return nil
    } func main() {
    rpcDemo()
    }

    服务端运行:go run server.go

  • 客户端的代码
    package main
    
    import (
    "flag"
    "fmt"
    "log"
    "net/rpc"
    "strconv"
    ) type ArgsTwo struct {
    A, B int
    } type QuotientTwo struct {
    Quo, Rem int
    } type Conf struct {
    serverAddress string
    i1 string
    i2 string
    } var conf = Conf{} func SetConfiguration() {
    flag.StringVar(&conf.serverAddress, "address", "127.0.0.1:1234", "The address of the rpc")
    flag.StringVar(&conf.i1, "i1", "", "")
    flag.StringVar(&conf.i2, "i2", "", "")
    } func main() {
    SetConfiguration()
    flag.Parse()
    fmt.Println("severAddress = ", conf.serverAddress) // DelayHTTP在指定的网络地址连接到HTTP RPC服务器
    // 在默认HTTP RPC路径上监听。
    client, err := rpc.DialHTTP("tcp", conf.serverAddress)
    if err != nil {
    log.Fatal("发生错误了 在这里地方 DialHTTP", err)
    } i1_, _ := strconv.Atoi(conf.i1)
    i2_, _ := strconv.Atoi(conf.i2)
    args := ArgsTwo{A: i1_, B: i2_}
    var reply int //调用调用命名函数,等待它完成,并返回其错误状态。
    err = client.Call("Arith.Multiply", args, &reply)
    if err != nil {
    log.Fatal("Call Multiply 发生错误了哦 arith error:", err)
    }
    fmt.Printf("Arith 乘法: %d*%d=%d\n", args.A, args.B, reply) var quot QuotientTwo
    //调用调用命名函数,等待它完成,并返回其错误状态。
    err = client.Call("Arith.Divide", args, &quot)
    if err != nil {
    log.Fatal("arith error:", err)
    }
    fmt.Printf("Arith 除法取整数: %d/%d=%d 余数 %d\n", args.A, args.B, quot.Quo, quot.Rem)
    }

    客户端编译:go build client.go
    客户端运行:

  • [root@wangjq rpc]# ./client
    severAddress = 127.0.0.1:
    Arith 乘法: *=
    Arith 除法取整数: /= 余数
    [root@wangjq rpc]#
    [root@wangjq rpc]# ./client --address 127.0.0.1: -i1 -i2
    severAddress = 127.0.0.1:
    Arith 乘法: *=
    Arith 除法取整数: /= 余数

golang rpc demo的更多相关文章

  1. win7环境下,golang thrift demo代码编译不通过

    用官方的教程代码:http://thrift.apache.org/tutorial/go 用网友提供的代码:Golang RPC 之 Thrift 都出现如下情况 状况1: 编辑器中就会提醒 Can ...

  2. Windows RPC Demo实现

    Windows RPC Demo实现 本文参考并整理以下相关文章 1. <远程过程调用> -百度百科 2. <RPC 编程> -http://www.ibm.com/devel ...

  3. Golang RPC 性能测试

    Golang RPC 性能测试 | KDF5000 http://kdf5000.com/2017/03/28/Golang-RPC-性能测试/

  4. golang RPC通信读写超时设置

    golang RPC通信中,有时候就怕读写hang住. 那是否可以设置读写超时呢? 1.方案一: 设置连接的读写超时 1.1 client RPC通信基于底层网络通信,可以通过设置connection ...

  5. golang 并发demo 写入 redis

    原文链接:golang 并发demo 写入 redis 源代码: package main import ( "fmt" "runtime" "str ...

  6. golang grpc demo

    1.grpm 安装: git clone https://github.com/grpc/grpc-go.git $GOPATH/src/google.golang.org/grpc 2.proto, ...

  7. golang rpc 简单范例

    RPC(Remote Procedure Call Protocol)--远程过程调用协议,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议. 它的工作流程如下图:   go ...

  8. golang rpc介绍

    rpc包提供了通过网络或其他I/O连接对一个对象的导出方法的访问.服务端注册一个对象,使它作为一个服务被暴露,服务的名字是该对象的类型名.注册之后,对象的导出方法就可以被远程访问.服务端可以注册多个不 ...

  9. golang ctrie demo

    下载ctrie: go get -t github.com/Workiva/go-datastructures/trie/ctrie 测试demo1: package main import ( &q ...

随机推荐

  1. HttpServletRequest、HttpServletResponse

    doGet()/doPost()方法都有两个参数,一个为代表请求的request,另一个代表响应response. request是获取前台传递的内容,response是反馈给前台数据 HttpSer ...

  2. jmeter单接口和多接口测试

    @@@@@@@@@@@@@@@ # 路漫漫其修远 最近接触到了多接口串联,接口串联的技术会在其他帖子有说明,其核心技术点就是通过正则表达式和变量来实现接口的关联.目前为止呢笔者用到的地方还只有一个,就 ...

  3. PHP jdtojulian() 函数

    ------------恢复内容开始------------ 实例 把儒略历法的日期转换为儒略日计数,然后再转换回儒略历法的日期: <?php$jd=juliantojd(6,20,2007); ...

  4. Spring Joinpoint

    如果用maven管理 则需要 <artifactId> aopalliance </artifactId> <artifactId> spring-aspects ...

  5. 用python包xlwt将数据写入Excel中

    一般用两种格式的数据写入,不多说放上demo. 1.列表形式写入 import xlwt def data_write(file_path, datas): f = xlwt.Workbook() s ...

  6. 【转载】requests库的7个主要方法、13个关键字参数以及响应对象的5种属性

    Python爬虫常用模块:requests库的7个主要方法.13个关键字参数以及响应对象的5种属性 原文链接: https://zhuanlan.zhihu.com/p/67489739

  7. 嵌入式linux下获取flash分区大小

    在嵌入式系统中,由于flash存储空间有限,或者是存储数据,实现数据的循环删除,需要获取到分区的使用情况,可以通过系统下的函数statfs来获取使用情况:实现代码如下: flashInfo.cpp # ...

  8. 消息队列和事件循环(Event Loop)

    产生原因 为什么会有消息队列和事件循环呢?首先最关键的一点在于JS是个单线程,并且主线程非常繁忙,既要处理 DOM,又要计算样式,还要处理布局,同时还需要处理 JavaScript 任务以及各种输入事 ...

  9. C#LeetCode刷题之#344-反转字符串​​​​​​​(Reverse String)

    问题 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/3933 访问. 编写一个函数,其作用是将输入的字符串反转过来. 输 ...

  10. rocketMq安装及集群配置

    网上关于rocketMq安装.集群配置的文章有很多,作为一个初学者,跟着网上的各种教程安装遇到了各种坑,可谓是一路坎坷.本文记录下rocketMq安装的完整过程.希望对你有一点帮助 安装rocketM ...