开源代码TarsGo-v1.0.0源码分析之client

栏目: 后端 · 发布时间: 5年前

内容简介:在前面文章,已经介绍了底层的transport和server

在前面文章,已经介绍了底层的transport和server

开源代码TarsGo-v1.0.0源码分析之transport

开源代码TarsGo-v1.0.0源码分析之server

本篇文章讲解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-v1.0.0源码分析之client

源码目录:

开源代码TarsGo-v1.0.0源码分析之client

在Tarsgo中,有两个模块client和server

开源代码TarsGo-v1.0.0源码分析之client

此图来源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,这将是源码开始的第一步。

开源代码TarsGo-v1.0.0源码分析之client

看client的源码

github.com/TarsCloud/TarsGo/tars/tools/Demo/client/client.go

开源代码TarsGo-v1.0.0源码分析之client

12:构建了一个communicator

13:obj(字符串)

14:app

15:stringToProxy是将app与obj对应的servant关联起来。重要

18:app的动作

整个client的分层,很明确,每一层都代表不同的作用。那么从分层开始:

communicator

github.com/TarsCloud/TarsGo/tars/communicator.go

开源代码TarsGo-v1.0.0源码分析之client

s:是下一层,servantProxyFactory

开源代码TarsGo-v1.0.0源码分析之client

初始化

开源代码TarsGo-v1.0.0源码分析之client

init中做了一些参数设置。最后

61:new servantPrxoyFactory

62:servantProxyFactory的初始化

开源代码TarsGo-v1.0.0源码分析之client

这是main函数中最重要的函数。

p是app。从ServantPrxoyFactory中获取servant,将其与app关联。

ServantProxyFactory与ServantProxy

github.com/TarsCloud/TarsGo/tars/servant.go

开源代码TarsGo-v1.0.0源码分析之client

objs:存储了所有的servantProxy

开源代码TarsGo-v1.0.0源码分析之client

init很简单

开源代码TarsGo-v1.0.0源码分析之client

典型的工程模式。

但这里的代码,貌似有点问题。在100行的时候,有可能并发的话,会有多个new出现。这个确实是一个bug

开源代码TarsGo-v1.0.0源码分析之client

obj:objectProxy,是下一层

开源代码TarsGo-v1.0.0源码分析之client

34:new一个objectProxyFactory

35:init objectFactory

37:从工厂模式中获取obj

开源代码TarsGo-v1.0.0源码分析之client

此函数为此层的入口

66:下一层的入口,obj.Invoke

objectProxyFactory与objectProxy

github.com/TarsCloud/TarsGo/tars/object.go

开源代码TarsGo-v1.0.0源码分析之client

典型的工厂模式

objs:保存了所有的objectProxy

开源代码TarsGo-v1.0.0源码分析之client

init不解释了

开源代码TarsGo-v1.0.0源码分析之client

同样是工厂模式。ServantPrxoyFactory的时候,这个代码还是有bug的。

这里的代码已经消除了。

开源代码TarsGo-v1.0.0源码分析之client

endpointManager:是下一层

开源代码TarsGo-v1.0.0源码分析之client

init不解释了,代码太简单,一目了然

开源代码TarsGo-v1.0.0源码分析之client

Invoke,此层的入口

26:调用endpointManager的SelectAdapterProxy,获取Adapter

137:此处很关键,存储了一个readch。这个将在AdapterProxy中用到。

144:调用了Adapter的send操作

EndpointManager

github.com/TarsCloud/TarsGo/tars/endpointmanager.go

开源代码TarsGo-v1.0.0源码分析之client

16:AdapterProxy是下一层

对于同一个obj,可能会对应多个endpoint。endpointManager的作用是管理这些endpoint以及对应的Adapter,同时也能够做一些负载均衡之类的工作。

开源代码TarsGo-v1.0.0源码分析之client

初始化,一目了然,就不解释了

开源代码TarsGo-v1.0.0源码分析之client

获取Adapter,有两中模式,hash和非hash模式

开源代码TarsGo-v1.0.0源码分析之client

提供了hash方式获取proxy

开源代码TarsGo-v1.0.0源码分析之client

非hash模式

两个最后都调用了createProxy

另外也提供了hash和非hash方式获取endpoint

开源代码TarsGo-v1.0.0源码分析之client

开源代码TarsGo-v1.0.0源码分析之client

GetHashEndpoint和GetNextEndpoint,提供了两个方式直接获取Endpoint

下面继续看

开源代码TarsGo-v1.0.0源码分析之client

114:构建了下一层的AdapterProxy

117:将AdapterProxy与Endpoint关联起来

AdapterProxy

github.com/TarsCloud/TarsGo/tars/adapter.go

开源代码TarsGo-v1.0.0源码分析之client

19:很高兴,这里看到了transport的tarsClient

开源代码TarsGo-v1.0.0源码分析之client

43:构建了transport的TarsClient

tarsClient需要的接口

github.com/TarsCloud/TarsGo/tars/transport/tarsclient.go

开源代码TarsGo-v1.0.0源码分析之client

回到

github.com/TarsCloud/TarsGo/tars/adapter.go

开源代码TarsGo-v1.0.0源码分析之client

这个不解释了

读recv

开源代码TarsGo-v1.0.0源码分析之client

resp是一个map,在objectProxy的Invoke中有讲解到

67:获取chan

71:将读取的packet发送到chan中

写send

开源代码TarsGo-v1.0.0源码分析之client

88:最后调用的是tarsClient的send

总结:对于client来说分层有点多

communicator

ServantProxyFactory与ServantProxy

objectProxyFactory与objectProxy

EndpointManager

AdapterProxy

tarsClient

好在每一层的功能比较单一,上下层衔接也比较好。

整体来说,client的代码逻辑还是比较简单。根据流程一步一步的跟踪,理解起来还是比较容易。

龚浩华

月牙寂道长

qq:29185807

2019年05月29日

如果你觉得本文对你有帮助,可以转到你的朋友圈,让更多人一起学习。

第一时间获取文章,可以关注本人公众号:月牙寂道长,也可以扫码关注

开源代码TarsGo-v1.0.0源码分析之client


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

爆款文案

爆款文案

关健明 / 北京联合出版公司 / 2017-12 / 42.00元

爆款10W+文案是怎么写出来的?前奥美金牌广告人、知乎25K高赞回答者关健明力作《爆款文案》解构文案打动人的4大黄金法则,公开18种文案写法,75篇实战案例,100多幅释义插图,透露把文案变成“印钞机”的私密武器,手把手教你写出爆款销售力。 市面上有很多大而全的文案书,往往比较宽泛,本书只聚焦一个点:文案如何卖掉产品,赚到钱。 前奥美金牌广告人、知乎25K高赞回答者:关键明,擅长撰写销......一起来看看 《爆款文案》 这本书的介绍吧!

HTML 压缩/解压工具
HTML 压缩/解压工具

在线压缩/解压 HTML 代码

CSS 压缩/解压工具
CSS 压缩/解压工具

在线压缩/解压 CSS 代码

UNIX 时间戳转换
UNIX 时间戳转换

UNIX 时间戳转换