go rpc example - modrpc/info GitHub Wiki

  • Server-side
    • arith := new(Arith)
    • rpc.Register(arith)
    • rpc.HandleHTTP()
      • http.Handle(rpcPath, server /* DefaultServer */)
    • l = net.Listen("tcp", ":1234")
    • go http.Serve(l /* *http.ResponseWrite */, nil /* httpReqest* */)
      • server.HandleHTTP(l, nil)
        • conn = l.(http.Hijacker).Hijack()
        • server.ServeConn(conn)
          • buf := bufio.NewWriter(conn)
          • codec := &gobServeCodec(conn, NewDecoder(conn), NewEncoder(buf), buf)
          • server.ServeCodec(codec)
            • service, mtype, req, argv, ... := server.readRequest(codec)
            • go service.call(server, sending, mtype, req, argv, replyv, codec)
              • function := mtype.method.Func
              • retval := func.Call([]reflect.Value(s.rcvr, argv, replyv})
              • server.sendResponse(sendijng, req, ...)
  • Client-side: Synchronous call
    • args := &server.Args{7, 8}
    • var reply int
    • client.Call("Arith.Multiply", args, &reply)
      • <-client.Go("Arith.Multiply", args.replay, make(chan *Call, 1)).Done
  • Client-side: Asynchronous call
    • args := &server.Args{7, 8}
    • var reply int
    • mycall := client.Go("Arith.Multiply", args, &reply)
      • call := new(Call)
      • call.ServiceMethod = "Arith.Multiply"
      • call.Args = args
      • call.Reply = reply
      • done = make(chan *Call, 10) // buffered
      • call.Done = done
      • client.send(call)
        • seq := client.seq
        • client.mutext.Lock()
        • client.seq++
        • client.pending[seq] = call
        • client.mutext.Unlock()
    • <- mycall.Done
⚠️ **GitHub.com Fallback** ⚠️