内容简介:在前面文章,已经介绍了底层的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日
如果你觉得本文对你有帮助,可以转到你的朋友圈,让更多人一起学习。
第一时间获取文章,可以关注本人公众号:月牙寂道长,也可以扫码关注
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:- 优秀开源库SDWebImage源码浅析
- 优秀开源库SDWebImage源码浅析
- Californium开源框架之源码分析(三)
- Californium开源框架之源码分析(四)
- Android开源框架源码分析:Okhttp
- Android开源框架源码分析:Okhttp
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。