go的rpc

本文介绍了Go语言中RPC的实现过程,从初始化service开始,利用反射获取远程服务的类类型和实例。接着详细阐述了如何处理暴露的方法,包括创建一个方法映射,筛选符合条件的方法(非私有,特定参数数量和类型),并将这些方法注册到server的methods成员。最后,通过rpc.HandleHttp将RPC处理程序绑定到HTTP路径,当HTTP请求到达时,rpc包中的server作为HTTP handler响应请求。
摘要由CSDN通过智能技术生成
我们先从服务端开始分析,先调用rpc.register方法注册暴露的服务对象。里面调用了DefaultServer的register方法
func (server *Server) register(rcvr interface{}, name string, useName bool) error {
	s := new(service)
	s.typ = reflect.TypeOf(rcvr)
	s.rcvr = reflect.ValueOf(rcvr)
	sname := reflect.Indirect(s.rcvr).Type().Name()
	if useName {
		sname = name
	}
	if sname == "" {
		s := "rpc.Register: no service name for type " + s.typ.String()
		log.Print(s)
		return errors.New(s)
	}
	if !isExported(sname) && !useName {
		s := "rpc.Register: type " + sname + " is not exported"
		log.Print(s)
		return errors.New(s)
	}
	s.name = sname

	// Install the methods
	s.method = suitableMethods(s.typ, true)

	if len(s.method) == 0 {
		str := ""

		// To help the user, see if a pointer receiver would work.
		method := suitableMethods(reflect.PtrTo(s.typ), false)
		if len(method) != 0 {
			str = "rpc.Register: type " + sname + " has no exported methods of suitable type 
                                                                (hint: pass a pointer to value of that type)"
		} else {
			str = "rpc.Register: type " + sname + " has no exported methods of suitable type"
		}
		log.Print(str)
		return errors.New(str)
	}

	if _, dup := server.serviceMap.LoadOrStore(sname, s); dup {
		return errors.New("rpc: service already defined: " + sname)
	}
	return nil
}

先初始化service,再调用反射得到远程需要被调用的类的类型,跟值即实例,再通过参数看其有无指定名称,如果没有则默认是类名(这个名字首字母需要大写来作为暴露的类)。然后调用suitableMethods()方法,处理所要暴露的

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值