本博客采用创作共用版权协议, 要求署名、非商业用途和保持一致. 转载本博客文章必须也遵循署名-非商业用途-保持一致的创作共用协议.
RPC(Remote Procedure Call)是分布式系统中的一个关键机制.
Go HTTP RPC
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76
| package main
import ( "fmt" "net" "net/rpc" "log" "net/http" )
type Args struct { A, B int }
type Arith int
func (t *Arith) Multiply(args *Args, reply *int) error { *reply = args.A * args.B return nil }
func makeService() {
rpc.Register(new(Arith))
rpc.HandleHTTP()
l, e := net.Listen("tcp", ":1234") if e != nil { log.Fatal("listen error:", e) }
go http.Serve(l, nil) }
func makeClient() {
client, err := rpc.DialHTTP("tcp", "127.0.0.1" + ":1234") defer client.Close() if err != nil { log.Fatal("dialing:", err) } args := &Args{7, 8} var reply int
err = client.Call("Arith.Multiply", args, reply) if err != nil { log.Fatal("Arith rpc call error:", err) } fmt.Println(reply) }
func main() { makeService() makeClient() }
|
Go JSON RPC
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69
| package main
import ( "fmt" "net" "net/rpc" "log" "net/http" "net/rpc/jsonrpc" )
type Args struct { A, B int }
type Arith int
func (t *Arith) Multiply(args *Args, reply *int) error { *reply = args.A * args.B return nil }
func makeJSONService() { rpc.Register(new(Arith)) tcpAddr, err := net.ResolveTCPAddr("tcp", ":1234") if err != nil { panic(err) }
listener, err := net.ListenTCP("tcp", tcpAddr) if err != nil { panic(err) } go func () { for { conn, err := listener.Accept() if err != nil { continue }
jsonrpc.ServeConn(conn) } }() }
func makeJSONClient() { client, err := jsonrpc.Dial("tcp", "127.0.0.1:1234") if err != nil { log.Fatal("dialing:", err) } args := &Args{17, 8} var reply int err = client.Call("Arith.Multiply", args, &reply) if err != nil { log.Fatal("Arith rpc call error:", err) } fmt.Println(reply) }
|
6.824 labrpc结构
数据结构:
Network用于模拟网络, 使整个RPC调用过程中在内部发生, 不需要真正的执行网路请求
Server一个RPC Server, 内部包含多个注册的Service
ClientEnd表示RPC客户端的数据结构
Service用于客户端来注册struct, 然后封装入该数据结构
reqSrc RPC调用的参数被解析然后重新封装到整个数据结构中
replyMsg封装RPC调用的返回结果
架构(可以选择性忽略Network部分)

参考链接