Golang JSONRPC 简单范例代码

yufei       3 年, 11 月 前       2140

服务端

Golang RPC 的实现需要 5 个步骤

  1. 定义一个服务结构
  2. 为这个服务结构定义几个服务方法,每个方法接受两个参数和返回 error 类型
  3. 使用 rpc.Register() 方法注册 「服务结构」 的实例
  4. 监听套接字
  5. 为每一个套接字调用 jsonrpc.ServerConn(conn) 方法
package main

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

// Golang RPC 的实现需要 5 个步骤
// 1. 定义一个服务结构
// 2. 为这个服务结构定义几个服务方法,每个方法接受两个参数和返回 error 类型
// 3. 使用 rpc.Register() 方法注册 「服务结构」 的实例
// 4. 监听套接字
// 5. 为每一个套接字调用 jsonrpc.ServerConn(conn) 方法

// 1
// 定义一个服务,因为提供的是数学服务,所以就叫 MathService
type MathService struct {
}

// 定义 MathService 所需要的参数,一般是两个,int 类型
type Args struct {
    Arg1, Arg2 int
}

// 2.
// 实现加法服务,加法需要两个参数
// 所有的 jsonrpc 方法只有两个参数,第一个参数用于接收所有参数,
// 第二个参数用于处理返回结果,是一个指针
// 所有的 jsonrpc 都只有一个返回值,error,用于指示是否发生错误
func (that *MathService) Add(args Args, reply *int) error {
    *reply = args.Arg1 + args.Arg2
    return nil
}

// 实现减法服务
func (that *MathService) Sub(args Args, reply *int) error {
    *reply = args.Arg1 - args.Arg2
    return nil
}

// 实现乘法服务
func (that *MathService) Mul(args Args, reply *int) error {
    *reply = args.Arg1 * args.Arg2
    return nil
}

// 实现除法服务
func (that *MathService) Div(args Args, reply *int) error {
    *reply = args.Arg1 / args.Arg2
    return nil
}

func main() {
    // 3.
    rpc.Register(new(MathService))
    // 4.
    sock, err := net.Listen("tcp", ":8080")
    log.Println("listen at :8080")
    if err != nil {
        log.Fatal("listen error:", err)
    }

    for {
        conn, err := sock.Accept()
        if err != nil {
            continue
        }
        // 5.
        go jsonrpc.ServeConn(conn)
    }

}

客户端

客户端调用 jsonrpc 有两个步骤

  1. 使用 jsonrpc.Dial() 方法连接到服务,并返回一个连接 conn
  2. 调用 conn.Call() 方法调用服务
package main

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

// 客户端调用 jsonrpc 有两个步骤
// 1. 使用 jsonrpc.Dial() 方法连接到服务,并返回一个连接 conn
// 2. 调用 conn.Call() 方法调用服务

// 定义 MathService 所需要的参数,一般是两个,int 类型
type Args struct {
    Arg1, Arg2 int
}

func main() {

    // 1.
    conn, err := jsonrpc.Dial("tcp", "127.0.0.1:8080")
    if err != nil {
        log.Fatal("can't not connect to 127.0.0.1:8080")
    }

    var reply int
    var args = Args{15, 3}

    // 调用 Add() 方法
    err = conn.Call("MathService.Add", args, &reply)
    if err != nil {
        log.Fatal("call MathService.Add error:", err)
    }
    fmt.Printf("MathService.Add(%d,%d)=%d\n", args.Arg1, args.Arg2, reply)

    // 调用 Mul() 方法
    err = conn.Call("MathService.Mul", args, &reply)
    if err != nil {
        log.Fatal("call MathService.Mul error:", err)
    }
    fmt.Printf("MathService.Mul(%d,%d)=%d\n", args.Arg1, args.Arg2, reply)
}

运行

  1. 运行服务端

    go run serv.go
    

    输出结果

    2020/04/06 09:22:42 listen at :8080
    
  2. 运行客户端

    go run cli.go
    

    输出结果

    MathService.Add(15,3)=18
    MathService.Mul(15,3)=45
    
目前尚无回复
简单教程 = 简单教程,简单编程
简单教程 是一个关于技术和学习的地方
现在注册
已注册用户请 登入
关于   |   FAQ   |   我们的愿景   |   广告投放   |  博客

  简单教程,简单编程 - IT 入门首选站

Copyright © 2013-2022 简单教程 twle.cn All Rights Reserved.