zoukankan      html  css  js  c++  java
  • golang rpc的两种调用方法

    golang的rpc有两种方法进行调用,一种是rpc例子中给的:

    package main
    
    import (
            "net/rpc"
            "net/http"
            "log"
            "net"
            "time"
    )
    
    
    type Args struct {
            A, B int
    }
    
    type Arith int
    
    func (t *Arith) Multiply(args *Args, reply *([]string)) error {
            *reply = append(*reply, "test")
            return nil
    }
    
    func main() {
            arith := new(Arith)
    
            rpc.Register(arith)
            rpc.HandleHTTP()
            
            l, e := net.Listen("tcp", ":1234")
            if e != nil {
                    log.Fatal("listen error:", e)
            }
            go http.Serve(l, nil)
            time.Sleep(5 * time.Second)
    
            client, err := rpc.DialHTTP("tcp", "127.0.0.1" + ":1234")
            if err != nil {
                    log.Fatal("dialing:", err)
            }
            
            args := &Args{7,8}
            reply := make([]string, 10)
            err = client.Call("Arith.Multiply", args, &reply)
            if err != nil {
                    log.Fatal("arith error:", err)
            }
            log.Println(reply)
    }

    另一种是使用NewServer

    这种是当rpc已经注册的时候就要使用了另外一种了。即一个server只能在DefaultRPC中注册一种类型。

    当Server使用rpc.NewServer的时候,client也需要进行下改动了

    package main
    
    import (
            "net/rpc"
            //"net/http"
            "log"
            "net"
            "time"
    )
    
    
    type Args struct {
            A, B int
    }
    
    type Arith int
    
    func (t *Arith) Multiply(args *Args, reply *([]string)) error {
            *reply = append(*reply, "test")
            return nil
    }
    
    func main() {
            newServer := rpc.NewServer()
            newServer.Register(new(Arith))
    
            l, e := net.Listen("tcp", "127.0.0.1:1234") // any available address
            if e != nil {
                    log.Fatalf("net.Listen tcp :0: %v", e)
            }
    
            go newServer.Accept(l)
            newServer.HandleHTTP("/foo", "/bar")
            time.Sleep(2 * time.Second)
    
            address, err := net.ResolveTCPAddr("tcp", "127.0.0.1:1234")
            if err != nil {
                    panic(err)
            }
            conn, _ := net.DialTCP("tcp", nil, address)
            defer conn.Close()
    
            client := rpc.NewClient(conn)
            defer client.Close()
    
            args := &Args{7,8}
            reply := make([]string, 10)
            err = client.Call("Arith.Multiply", args, &reply)
            if err != nil {
                    log.Fatal("arith error:", err)
            }
            log.Println(reply)
    }
    第二个例子中的
    newServer.HandleHTTP("/foo", "/bar") 
    可以任意设置,第一个例子其实是设置了默认的两个
     
    这里也顺便将reply作为[]slice的例子给演示了下
     

    实时了解作者更多技术文章,技术心得,请关注微信公众号“轩脉刃的刀光剑影”

    本文基于署名-非商业性使用 3.0许可协议发布,欢迎转载,演绎,但是必须保留本文的署名叶剑峰(包含链接http://www.cnblogs.com/yjf512/),且不得用于商业目的。如您有任何疑问或者授权方面的协商,请与我联系

  • 相关阅读:
    显示所有销售订单
    从 “香农熵” 到 “告警降噪” ,如何提升告警精度?
    KubeDL 0.4.0 Kubernetes AI 模型版本管理与追踪
    链路分析 K.O “五大经典问题”
    让容器跑得更快:CPU Burst 技术实践
    All in one:如何搭建端到端可观测体系
    【视频特辑】提效神器!如何用Quick BI高效配置员工的用数权限
    一文说清linux system load
    Flow vs Jenkins 实操对比,如何将Java应用快速发布至ECS
    实时数仓Hologres首次走进阿里淘特双11
  • 原文地址:https://www.cnblogs.com/yjf512/p/2937261.html
Copyright © 2011-2022 走看看