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

2021-04-12  本文已影响0人  voidFan

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通信

上一篇下一篇

猜你喜欢

热点阅读