一文吃透 Go 内置 RPC 原理

本文深入剖析了Go语言内置的RPC实现,从一个简单的Demo入手,详细解释了RPC Server的注册服务、Http Handle注册和逻辑处理,以及RPC Client的gob编解码原理。Go的RPC基于Http协议,通过反射和异步调用来实现远程方法调用,同时利用对象池提高性能。文章未涉及RPC的优缺点和实际应用情况。
摘要由CSDN通过智能技术生成

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

从一个 Demo 入手

为了快速进入状态,我们先搞一个 Demo,当然这个 Demo 是参考 Go 源码 src/net/rpc/server.go,做了一丢丢的修改。

  • 首先定义请求的入参和出参:
package common

type Args struct {
   
	A, B int
}

type Quotient struct {
   
	Quo, Rem int
}
  • 接着在定义一个对象,并给这个对象写两个方法
type Arith struct{
   }

func (t *Arith) Multiply(args *common.Args, reply *int) error {
   
	*reply = args.A * args.B
	return nil
}

func (t *Arith) Divide(args *common.Args, quo *common.Quotient) error {
   
	if args.B == 0 {
   
		return errors.New("divide by zero")
	}
	quo.Quo = args.A / args.B
	quo.Rem = args.A % args.B
	return nil
}
  • 然后起一个 RPC server:
func main() {
   
	arith := new(Arith)
	rpc.Register(arith)
	rpc.HandleHTTP()
	l, e := net.Listen("tcp", ":9876")
	if e != nil {
   
		panic(e)
	}

	go http.Serve(l, nil)

	var wg sync.WaitGroup
	wg.Add(1)
	wg.Wait()
}
  • 最后初始化 RPC Client,并发起调用:
func main(
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值