go微服务开发入门

voidFan · · 193 次点击 · · 开始浏览    

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


有疑问加站长微信联系(非本文作者)

本文来自:简书

感谢作者:voidFan

查看原文:go微服务开发入门

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:701969077

193 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传