美文网首页
GO微服务入门: 原生微服务实例

GO微服务入门: 原生微服务实例

作者: voidFan | 来源:发表于2021-04-12 21:27 被阅读0次

    rpc基础

    1. 服务端监听一个端口
      nc -l 127.0.0.1 8800
    2. 往服务器发送数据(返回服务器响应数据)
      echo -e '{"method":"hello.HelloWorld","params":["TTTT"],"id":0}' | nc 127.0.0.1 8880

    golang 自带rpc通信(gob)

    服务端代码

    package main
    import (
        "fmt"
        "net"
        "net/rpc"
    )
    
    type Hello struct {
    }
    
    func (h *Hello) HelloWorld(name string, resp *string) error {
        *resp = name + name
        return nil
    }
    
    func RpcHelloServerMain() {
        // 1、注册RPC服务,绑定对象方法
        err := rpc.RegisterName("hello", new(Hello))
        if err != nil {
            fmt.Println("register name is err :", err)
            return
        }
        // 2、设置监听
        listen, err := net.Listen("tcp", "127.0.0.1:8880")
        if err != nil {
            fmt.Println("net listen err :", err)
            return
        }
        defer listen.Close()
        fmt.Println("start listen")
        // 3、建立连接
        conn, err := listen.Accept()
        if err != nil {
            fmt.Println("Accept() err :", err)
            return
        }
        defer conn.Close()
        fmt.Println("connected!")
    
        // 4、绑定服务
        rpc.ServeConn(conn)
    }
    

    客户端代码

    package main
    
    import (
        "fmt"
        "net/rpc"
    )
    
    func main() {
        // 1、用RPC链接服务器
        conn, err := rpc.Dial("tcp", "127.0.0.1:8080")
        if err := nil {
            fmt.Println("dial localhost:8080 error :", err)
            return 
        }
        defer conn.close()
    
        // 2、调用远程函数
        var reply string  //接收返回值。。。。
        err = conn.Call("hello.HelloWorld", "hello world ", &reply)
        if err != nil {
            fmt.Println("call error:", err)
            return
        }
        fmt.Println(reply)
    }
    
    

    golang 自带jsonrpc通信

    jsonrpc服务端代码

    package main
    import (
        "fmt"
        "net"
        "net/rpc"
        "net/rpc/jsonrpc"
    )
    
    type Hello struct {
    }
    
    func (h *Hello) HelloWorld(name string, resp *string) error {
        *resp = name + name
        return nil
    }
    
    func RpcHelloServerMain() {
        // 1、注册RPC服务,绑定对象方法
        err := rpc.RegisterName("hello", new(Hello))
        if err != nil {
            fmt.Println("register name is err :", err)
            return
        }
        // 2、设置监听
        listen, err := net.Listen("tcp", "127.0.0.1:8880")
        if err != nil {
            fmt.Println("net listen err :", err)
            return
        }
        defer listen.Close()
        fmt.Println("start listen")
        // 3、建立连接
        conn, err := listen.Accept()
        if err != nil {
            fmt.Println("Accept() err :", err)
            return
        }
        defer conn.Close()
        fmt.Println("connected!")
    
        // 4、绑定服务
        jsonrpc.ServeConn(conn)
    }
    

    jsonrpc客户端代码

    package main
    
    import (
        "fmt"
        "net/rpc/jsonrpc"
    )
    
    func main() {
        // 1、用RPC链接服务器
        conn, err := jsonrpc.Dial("tcp", "127.0.0.1:8080")
        if err := nil {
            fmt.Println("dial localhost:8080 error :", err)
            return 
        }
        defer conn.close()
    
        // 2、调用远程函数
        var reply string  //接收返回值。。。。
        err = conn.Call("hello.HelloWorld", "hello world ", &reply)
        if err != nil {
            fmt.Println("call error:", err)
            return
        }
        fmt.Println(reply)
    }
    
    

    golang 自带jsonrpc通信(封装)

    jsonrpc服务端代码(封装)

    package main
    import (
        "fmt"
        "net"
        "net/rpc"
        "net/rpc/jsonrpc"
    )
    
    type MyInterface interface {
        HelloWorld(string, *string) error 
    }
    
    type Hello struct {
    }
    
    func (h *Hello) HelloWorld(name string, resp *string) error {
        *resp = name + name
        return nil
    }
    
    func RegisterService(i MyInterface) {
        rpc.RegisterName("hello", i)
    }
    
    func RpcHelloServerMain() {
        // 1、注册RPC服务,绑定对象方法
        RegisterService(&Hello{})
        // 2、设置监听
        listen, err := net.Listen("tcp", "127.0.0.1:8880")
        if err != nil {
            fmt.Println("net listen err :", err)
            return
        }
        defer listen.Close()
        fmt.Println("start listen")
        // 3、建立连接
        conn, err := listen.Accept()
        if err != nil {
            fmt.Println("Accept() err :", err)
            return
        }
        defer conn.Close()
        fmt.Println("connected!")
    
        // 4、绑定服务
        jsonrpc.ServeConn(conn)
    }
    

    jsonrpc客户端代码(封装)

    package main
    
    import (
        "fmt"
        "net/rpc/jsonrpc"
    )
    
    type MyClient struct {
        c *rpc.Client
    }
    
    func InitClient(addr string) MyClient{
        conn, _ := jsonrpc.Dial("tcp", addr)
        return MyClient{
            c:conn,
        }
    }
    
    func (this* MyClient) HelleWorld(a string, b *string) error {
        // a是传入参数, b 是传出参数
        this.c.Call("hello.HelloWorld", a, b)
        return nil
    }
    
    func main() {
        // 1、用RPC链接服务器
        client := InitClient("127.0.0.1:8880")
        // 2、调用远程函数
        var reply string  //接收返回值。。。。
        client.HelleWorld("lei lei", &reply)
        fmt.Println(reply)
    }
    
    

    golang protobuf rpc通信

    相关文章

      网友评论

          本文标题:GO微服务入门: 原生微服务实例

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