设为首页 加入收藏

TOP

Golang 1.4 net/rpc client源码解析
2015-07-16 12:57:14 来源: 作者: 【 】 浏览:6
Tags:Golang 1.4 net/rpc client 源码 解析

net/rpc是golang标准库提供的rpc框架,下面我们重点看下net/rpc是如何实现的。 我本机源码安装路径在/usr/local/go,这net/rpc(golang 1.4版本)涉及到的相关代码主要有:


client.go


server.go


首先我们先从client.go,客户端入手看:


我们使用rpc的时候,都知道client是线程安全的,client其实是基于单个socket连接来,依赖channel来实现复用连接以及并行的。而临时的调用对象Call都是保存在Client的map中的,至于每个call怎么查找,也是根据seq序列号在请求server时候转发过去,之后response的时候,client根据返回的seq再反查结果的。不难看出,实现了ClientCodec之后就可以自定义rpc协议请求头和内容了。那么send???数中的Call对象是从哪里来的?


在初始化client的时候,我们会指定ip,port等


最后,NewClient会后台开启一枚goroutine,就是接受server返回然后转发具体调用者了。


最后call.done做了什么了,相比你也猜到:


大致的分析就结束了,但是完整的rpc框架,还应该包括,服务发现,服务降级,服务追踪,服务容错等, 服务发现:可以使用zk,以及配合client定制的方式实现


服务降级:可以在zk中指定服务质量,以及根据回馈系统来drop request


服务追踪:最近我在看Twitter的Zipkin和Google的Dapper,对核心rpc库修改的方式避免大量植入代码,但是golang要做到这点有点困难,一是AOP不好支持,所以现在只能考虑用侵入代码,有更好思路的可以联系我!


服务容错:因为input本身单连接请求获取server,有可能<-call一直不返回,导致业务大量hang,这个可以考虑加上一些channel的timeout特性来实现,只不过浪费了一些内存。


总体来说net/rpc还是一个不错的框架,但是几个地方需要考虑,一个是全局大锁reqMutex,另外是call对象会大量创建(可否考虑call pool等)


】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇Intel? INDE for Google Android .. 下一篇Golang 1.4 net/rpc server源码解..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: