前言
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.B
return nil
}
server.go利用 Go官方提供的一个RPC库: net/rpc 进行实现
package main
import (
"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 main
import (
"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 等其他编码方式。