2

go微服务开发入门

 3 years ago
source link: https://studygolang.com/articles/34548?fr=sidebar
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

go微服务开发入门

voidFan · 大约12小时之前 · 112 次点击 · 预计阅读时间 4 分钟 · 大约8小时之前 开始浏览    

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


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

280

本文来自:简书

感谢作者:voidFan

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

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


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK