go微服务开发入门


本文摘自网络,作者,侵删。

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从学会到学废】(一) 下载、安装、配置

Golang如何打印单引号和双引号

Go语言函数方法

emacs支持Golang吗

手撸Golang 创建型设计模式 建造者模式

关于Golang中方法的receiver为指针和不为指针的区别

聊聊dubbo-Go-proxy的hostfilter

Golang不适合开发web吗

Golang如何接收输入

Golang flag是什么

更多相关阅读请进入《Go》频道 >>




打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...