服务端
Golang RPC 的实现需要 5 个步骤
- 定义一个服务结构
- 为这个服务结构定义几个服务方法,每个方法接受两个参数和返回 error 类型
- 使用
rpc.Register()
方法注册 「服务结构」 的实例 - 监听套接字
- 为每一个套接字调用
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 有两个步骤
- 使用
jsonrpc.Dial()
方法连接到服务,并返回一个连接conn
- 调用
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) }
运行
-
运行服务端
go run serv.go
输出结果
2020/04/06 09:22:42 listen at :8080
-
运行客户端
go run cli.go
输出结果
MathService.Add(15,3)=18 MathService.Mul(15,3)=45
目前尚无回复