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