6.824 RPC lesson2 2020(一)
                                                            生活随笔
收集整理的這篇文章主要介紹了
                                6.824  RPC lesson2 2020(一)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.                        
                                resources
https://pdos.csail.mit.edu/6.824/notes/crawler.go
 https://pdos.csail.mit.edu/6.824/notes/l-rpc.txt
 https://pdos.csail.mit.edu/6.824/notes/kv.go
RPC_concept
19 | 分布式通信之遠程調用:我是你的千里眼(https://time.geekbang.org)
RPC_simple_example
http_RPC
package mainimport ("errors""fmt""net/http""net/rpc" )type Args struct {A, B int }type Quotient struct {Quo, Rem int }type Arith intfunc (t *Arith) Multiply(args *Args, reply *int) error {*reply = args.A * args.Breturn nil }func (t *Arith) Divide(args *Args, quo *Quotient) error {if args.B == 0 {return errors.New("divide by zero")}quo.Quo = args.A / args.Bquo.Rem = args.A % args.Breturn nil }func main() {arith := new(Arith)rpc.Register(arith)rpc.HandleHTTP()err := http.ListenAndServe(":1234", nil)if err != nil {fmt.Println(err.Error())} }client
package mainimport ("fmt""log""net/rpc" )type Args struct {A, B int }type Quotient struct {Quo, Rem int }func main() {serverAddress := "127.0.0.1"client, err := rpc.DialHTTP("tcp", serverAddress+":1234")if err != nil {log.Fatal("dialing:", err)}// Synchronous callargs := Args{17, 8}var reply interr = client.Call("Arith.Multiply", args, &reply)if err != nil {log.Fatal("arith error:", err)}fmt.Printf("Arith: %d*%d=%d\n", args.A, args.B, reply)var quot Quotienterr = client.Call("Arith.Divide", args, ")if err != nil {log.Fatal("arith error:", err)}fmt.Printf("Arith: %d/%d=%d remainder %d\n", args.A, args.B, quot.Quo, quot.Rem) }http_TCP
server
這個客戶端代碼和http的客戶端代碼對比,唯一的區別一個是DialHTTP,一個是Dial(tcp),其他處理一模一樣。
package mainimport ("errors""fmt""net""net/rpc""os" )type Args struct {A, B int }type Quotient struct {Quo, Rem int }type Arith intfunc (t *Arith) Multiply(args *Args, reply *int) error {*reply = args.A * args.Breturn nil }func (t *Arith) Divide(args *Args, quo *Quotient) error {if args.B == 0 {return errors.New("divide by zero")}quo.Quo = args.A / args.Bquo.Rem = args.A % args.Breturn nil }func main() {arith := new(Arith)rpc.Register(arith)tcpAddr, err := net.ResolveTCPAddr("tcp", ":1234")checkError(err)listener, err := net.ListenTCP("tcp", tcpAddr)checkError(err)for {conn, err := listener.Accept()if err != nil {continue}rpc.ServeConn(conn)}}func checkError(err error) {if err != nil {fmt.Println("Fatal error ", err.Error())os.Exit(1)} }client
package mainimport ("fmt""log""net/rpc" )type Args struct {A, B int }type Quotient struct {Quo, Rem int }func main() {service := "127.0.0.1:1234"client, err := rpc.Dial("tcp", service)if err != nil {log.Fatal("dialing:", err)}// Synchronous callargs := Args{17, 8}var reply interr = client.Call("Arith.Multiply", args, &reply)if err != nil {log.Fatal("arith error:", err)}fmt.Printf("Arith: %d*%d=%d\n", args.A, args.B, reply)var quot Quotienterr = client.Call("Arith.Divide", args, ")if err != nil {log.Fatal("arith error:", err)}fmt.Printf("Arith: %d/%d=%d remainder %d\n", args.A, args.B, quot.Quo, quot.Rem) }crawler.go
crawler.go
感覺這個例子太晦澀。有點強行把幾個原理在一個例子講明
總結
以上是生活随笔為你收集整理的6.824 RPC lesson2 2020(一)的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: golang并发官方示例
- 下一篇: 治疗男性不育专家
