内容简介:在前面文章,已经介绍了底层的transport和server
在前面文章,已经介绍了底层的transport和server
开源代码TarsGo-v1.0.0源码分析之transport
本篇文章讲解client。
Tars是腾讯开源的一款微服务框架。在去年9月, 腾讯宣布正式开源 Tars 的 Golang 版本TarsGo。
当TarGo开源的时候,就想对此开源代码进行学习。近期刚好有空,就看了看。说实话,本人并未使用Tars框架,本文只是对TarsGo源码进行分析。
Tars整体框架介绍,可以参考https://github.com/TarsCloud/Tars/blob/master/Introduction.md
还有文章:
腾讯 Tars 开源 Go 版本 Tars-Go,并发性能比 gRPC 高 5 倍
https://my.oschina.net/editorial-story/blog/2054185
关于TarsGo的介绍还有:
https://github.com/TarsCloud/TarsGo/blob/master/README.zh.md
源码地址:
https://github.com/TarsCloud/TarsGo
按照本人习惯,从低版本进行研究,此次源码分析定位v1.0.0版本
源码目录:
在Tarsgo中,有两个模块client和server
此图来源https://github.com/TarsCloud/Tars/blob/master/Introduction.md
https://github.com/TarsCloud/Tars/blob/master/Introduction.md
server服务运行后,会定期上报心跳到node,node然后把服务心跳信息上报到registry服务,由registry进行统一管理。 Client访问Server流程:client可以通过server的对象名Obj间接访问server,Client会从registry上拉取server的路由信息(如ip、port信息),然后根据具体的业务特性(同步或者异步,tcp或者udp方式)访问server(当然client也可以通过ip/port直接访问server)。
https://github.com/TarsCloud/Tars/blob/master/Introduction.md
在github.com/TarsCloud/TarsGo/tars/tools/Demo中有构建client和server,这将是源码开始的第一步。
看client的源码
github.com/TarsCloud/TarsGo/tars/tools/Demo/client/client.go
12:构建了一个communicator
13:obj(字符串)
14:app
15:stringToProxy是将app与obj对应的servant关联起来。重要
18:app的动作
整个client的分层,很明确,每一层都代表不同的作用。那么从分层开始:
communicator
github.com/TarsCloud/TarsGo/tars/communicator.go
s:是下一层,servantProxyFactory
初始化
init中做了一些参数设置。最后
61:new servantPrxoyFactory
62:servantProxyFactory的初始化
这是main函数中最重要的函数。
p是app。从ServantPrxoyFactory中获取servant,将其与app关联。
ServantProxyFactory与ServantProxy
github.com/TarsCloud/TarsGo/tars/servant.go
objs:存储了所有的servantProxy
init很简单
典型的工程模式。
但这里的代码,貌似有点问题。在100行的时候,有可能并发的话,会有多个new出现。这个确实是一个bug
obj:objectProxy,是下一层
34:new一个objectProxyFactory
35:init objectFactory
37:从工厂模式中获取obj
此函数为此层的入口
66:下一层的入口,obj.Invoke
objectProxyFactory与objectProxy
github.com/TarsCloud/TarsGo/tars/object.go
典型的工厂模式
objs:保存了所有的objectProxy
init不解释了
同样是工厂模式。ServantPrxoyFactory的时候,这个代码还是有bug的。
这里的代码已经消除了。
endpointManager:是下一层
init不解释了,代码太简单,一目了然
Invoke,此层的入口
26:调用endpointManager的SelectAdapterProxy,获取Adapter
137:此处很关键,存储了一个readch。这个将在AdapterProxy中用到。
144:调用了Adapter的send操作
EndpointManager
github.com/TarsCloud/TarsGo/tars/endpointmanager.go
16:AdapterProxy是下一层
对于同一个obj,可能会对应多个endpoint。endpointManager的作用是管理这些endpoint以及对应的Adapter,同时也能够做一些负载均衡之类的工作。
初始化,一目了然,就不解释了
获取Adapter,有两中模式,hash和非hash模式
提供了hash方式获取proxy
非hash模式
两个最后都调用了createProxy
另外也提供了hash和非hash方式获取endpoint
GetHashEndpoint和GetNextEndpoint,提供了两个方式直接获取Endpoint
下面继续看
114:构建了下一层的AdapterProxy
117:将AdapterProxy与Endpoint关联起来
AdapterProxy
github.com/TarsCloud/TarsGo/tars/adapter.go
19:很高兴,这里看到了transport的tarsClient
43:构建了transport的TarsClient
tarsClient需要的接口
github.com/TarsCloud/TarsGo/tars/transport/tarsclient.go
回到
github.com/TarsCloud/TarsGo/tars/adapter.go
这个不解释了
读recv
resp是一个map,在objectProxy的Invoke中有讲解到
67:获取chan
71:将读取的packet发送到chan中
写send
88:最后调用的是tarsClient的send
总结:对于client来说分层有点多
communicator
ServantProxyFactory与ServantProxy
objectProxyFactory与objectProxy
EndpointManager
AdapterProxy
tarsClient
好在每一层的功能比较单一,上下层衔接也比较好。
整体来说,client的代码逻辑还是比较简单。根据流程一步一步的跟踪,理解起来还是比较容易。
龚浩华
月牙寂道长
qq:29185807
2019年05月29日
如果你觉得本文对你有帮助,可以转到你的朋友圈,让更多人一起学习。
第一时间获取文章,可以关注本人公众号:月牙寂道长,也可以扫码关注
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Cracking the Coding Interview
Gayle Laakmann McDowell / CareerCup / 2015-7-1 / USD 39.95
Cracking the Coding Interview, 6th Edition is here to help you through this process, teaching you what you need to know and enabling you to perform at your very best. I've coached and interviewed hund......一起来看看 《Cracking the Coding Interview》 这本书的介绍吧!