Go 语言极速入门14 - jsonrpc 最简姿势

服务定义

package rpcdemo

import "errors"

// 服务
type DemoService struct {
}

// 参数
type Args struct {
    A, B int
}

// jsonrpc 的服务需要定义为参入参数和传出参数的格式
// 传出参数必须为指针格式
func (e DemoService) DIV(args Args, result *float64) error {
    if args.B == 0 {
        return errors.New("division by zero")
    }

    *result = float64(args.A) / float64(args.B)
    return nil
}

服务端

package main

import (
    "github.com/zhaojigang/crawler/rpc"
    "log"
    "net"
    "net/rpc"
    "net/rpc/jsonrpc"
)

func main() {
    // 注册服务
    rpc.Register(rpcdemo.DemoService{})
    // 启动 server
    listener, err := net.Listen("tcp", "127.0.0.1:1234")

    if err != nil {
        panic(err)
    }

    for {
        // 不断连接服务
        conn, err := listener.Accept()
        if err != nil {
            log.Printf("accept error, %v", err)
            continue
        }
        // 使用 Goroutine:ServeConn runs the JSON-RPC server on a single connection.
        go jsonrpc.ServeConn(conn)
    }
}

客户端

package main

import (
    "fmt"
    "github.com/zhaojigang/crawler/rpc"
    "log"
    "net/rpc/jsonrpc"
)

func main() {
    // 连接server并创建jsonrpc-client
    client, err := jsonrpc.Dial("tcp", "127.0.0.1:1234")
    if err != nil {
        log.Printf("create jsonrpc client error")
    }

    var result float64
    // 发起调用
    err = client.Call("DemoService.DIV", rpcdemo.Args{3, 4}, &result)
    if err != nil {
        log.Printf("call error")
    }
    fmt.Println(result)
}
    原文作者:原水寒
    原文地址: https://www.jianshu.com/p/692a243af3e2
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞