开源代码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


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

查看所有标签

猜你喜欢:

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

机械设计实践

机械设计实践

村洋太郎(日) / 王启义/等 / 机械工业出版社 / 1998-08 / 36.00

本书记述了各种设计过程的思考方法和具体作法以及必要的知识和具 体数据。介绍了设计中要决定的内容和相应的制约条件。如功能、机构、 构造、形状、力和强度、尺寸加工工艺、工具、材料、机械要素等。最后 介绍了具体设计实例。本书的目的在于即使不看其他的书和参考书就能设 计出所需要的具体机械。 本书供从事机械设计的有关技术人员及大专院校相关专业的师生使 用。一起来看看 《机械设计实践》 这本书的介绍吧!

JS 压缩/解压工具
JS 压缩/解压工具

在线压缩/解压 JS 代码

URL 编码/解码
URL 编码/解码

URL 编码/解码

SHA 加密
SHA 加密

SHA 加密工具