前言
RPC在分布式系统中经常使用,这里写一个简单的demo实践一下。
code
先生成 go.mod 文件
go mod init rpc-try01
定义方法
package model// Args 是 RPC 方法的参数结构体
type Args struct {A, B int
}// Arith 定义了一个简单的算术服务
type Arith struct{}// Multiply 是 Arith 类型的一个方法,实现乘法
func (a *Arith) Multiply(args *Args, reply *int) error {*reply = args.A * args.Breturn nil
}
server.go利用 Go官方提供的一个RPC库: net/rpc 进行实现
package mainimport ("fmt""net""net/rpc""rpc-try01/model"
)func main() {arith := new(model.Arith)rpc.Register(arith) // 注册服务listener, err := net.Listen("tcp", ":1234")if err != nil {fmt.Println("Error starting RPC server:", err)return}defer listener.Close()fmt.Println("RPC server listening on port 1234...")for {conn, err := listener.Accept()if err != nil {fmt.Println("Error accepting connection:", err)continue}go rpc.ServeConn(conn) // 开个协程处理连接}
}
client.go
package mainimport ("fmt""net/rpc""rpc-try01/model"
)func main() {// 连接到 RPC 服务器client, err := rpc.Dial("tcp", "localhost:1234")if err != nil {fmt.Println("Error connecting to RPC server:", err)return}defer client.Close()// 准备参数args := &model.Args{A: 7, B: 8}var reply int// 调用远程方法, 这里将会用到反射err = client.Call("Arith.Multiply", args, &reply)if err != nil {fmt.Println("Error calling RPC method:", err)return}// 输出结果fmt.Printf("Result of %d * %d = %d\n", args.A, args.B, reply)
}
run
开两个终端,一个跑server,一个跑 client
Go 的 RPC 使用 gob 编码进行数据序列化。如果你需要与其他语言互操作,可以考虑使用 JSON 或 Protobuf 等其他编码方式。