IT评测·应用市场-qidao123.com技术社区

标题: 一文吃透 Go 内置 RPC 原理 [打印本页]

作者: 徐锦洪    时间: 2023-3-2 22:19
标题: 一文吃透 Go 内置 RPC 原理
hello 大家好呀,我是小楼,这是系列文《Go底层原理剖析》的第三篇,依旧分析 Http 模块。我们今天来看 Go内置的 RPC。说起 RPC 大家想到的一般是框架,Go 作为编程语言竟然还内置了 RPC,着实让我有些吃鲸。

从一个 Demo 入手

为了快速进入状态,我们先搞一个 Demo,当然这个 Demo 是参考 Go 源码 src/net/rpc/server.go,做了一丢丢的修改。
  1. package common
  2. type Args struct {
  3.         A, B int
  4. }
  5. type Quotient struct {
  6.         Quo, Rem int
  7. }
复制代码
  1. type Arith struct{}
  2. func (t *Arith) Multiply(args *common.Args, reply *int) error {
  3.         *reply = args.A * args.B
  4.         return nil
  5. }
  6. func (t *Arith) Divide(args *common.Args, quo *common.Quotient) error {
  7.         if args.B == 0 {
  8.                 return errors.New("divide by zero")
  9.         }
  10.         quo.Quo = args.A / args.B
  11.         quo.Rem = args.A % args.B
  12.         return nil
  13. }
复制代码
  1. func main() {
  2.         arith := new(Arith)
  3.         rpc.Register(arith)
  4.         rpc.HandleHTTP()
  5.         l, e := net.Listen("tcp", ":9876")
  6.         if e != nil {
  7.                 panic(e)
  8.         }
  9.         go http.Serve(l, nil)
  10.         var wg sync.WaitGroup
  11.         wg.Add(1)
  12.         wg.Wait()
  13. }
复制代码
[code]func main() {        client, err := rpc.DialHTTP("tcp", "127.0.0.1:9876")        if err != nil {                panic(err)        }        args := common.Args{A: 7, B: 8}        var reply int  // 同步调用        err = client.Call("Arith.Multiply", &args, &reply)        if err != nil {                panic(err)        }        fmt.Printf("Call Arith: %d * %d = %d\n", args.A, args.B, reply)  // 异步调用        quotient := new(common.Quotient)        divCall := client.Go("Arith.Divide", args, quotient, nil)        replyCall :=




欢迎光临 IT评测·应用市场-qidao123.com技术社区 (https://dis.qidao123.com/) Powered by Discuz! X3.4