服务端
Golang RPC 的实现需要 5 个步骤
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()connconn.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