服务定义
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)
}