一文吃透 Go 内置 RPC 原理

打印 上一主题 下一主题

主题 507|帖子 507|积分 1521

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. }
复制代码

  • 然后起一个 RPC  server:
  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. }
复制代码

  • 最后初始化 RPC Client,并发起调用:
[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 :=

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

徐锦洪

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表