go实现json格式的rpc服务

Posted 利志分享

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了go实现json格式的rpc服务相关的知识,希望对你有一定的参考价值。


 

 //JSON RPC 方式
//jsonrpc方式是数据编码采用了json,而不是gob编码。
package main

import (
    "log"
    "net"
    "net/rpc"
    "net/rpc/jsonrpc"
)

//注意字段必须是导出
type Params struct {
    Width, Height int
}

type Rect struct{}

func (r *Rect) Area(p Params, ret *int) error {
    *ret = p.Width * p.Height
    return nil
}

func (r *Rect) Perimeter(p Params, ret *int) error {
    *ret = (p.Width + p.Height) * 2
    return nil
}

func chkError(err error) {
    if err != nil {
        log.Fatal(err)
    }
}

func main() {
    rect := new(Rect)
    //注册rpc服务
    rpc.Register(rect)
    //获取tcpaddr
    tcpaddr, err := net.ResolveTCPAddr("tcp4", "127.0.0.1:8080")
    chkError(err)
    //监听端口
    tcplisten, err2 := net.ListenTCP("tcp", tcpaddr)
    chkError(err2)
    for {
        conn, err3 := tcplisten.Accept()
        if err3 != nil {
            continue
        }
        //使用goroutine单独处理rpc连接请求
        //这里使用jsonrpc进行处理
        go jsonrpc.ServeConn(conn)
    }
}


//客户端

package main

import (
    "fmt"
    "log"
    "net/rpc/jsonrpc"
)

type Params struct {
    Width, Height int
}

func main() {
    //连接远程rpc服务
    //这里使用jsonrpc.Dial
    rpc, err := jsonrpc.Dial("tcp", "127.0.0.1:8080")
    if err != nil {
        log.Fatal(err)
    }
    ret := 0
    //调用远程方法
    //注意第三个参数是指针类型
    err2 := rpc.Call("Rect.Area", Params{30, 100}, &ret)
    if err2 != nil {
        log.Fatal(err2)
    }
    fmt.Println(ret)
    err3 := rpc.Call("Rect.Perimeter", Params{30, 100}, &ret)
    if err3 != nil {
        log.Fatal(err3)
    }
    fmt.Println(ret)
}


以上是关于go实现json格式的rpc服务的主要内容,如果未能解决你的问题,请参考以下文章

Jsonrpc4j 和 go 的 rpc/jsonrpc 之间的 JSONRPC 格式不同

Go微服务—— RPC

Go微服务—— RPC

一个方便调试JS的RPC工具PIGA-GO

api接口,RPC,WebService分别解决啥问题

JSON RPC 格式化