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

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

内容简介:在前面文章,已经介绍了底层的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


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

查看所有标签

猜你喜欢:

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

Eric Meyer on CSS

Eric Meyer on CSS

Eric Meyer / New Riders Press / 2002-7-8 / USD 55.00

There are several other books on the market that serve as in-depth technical guides or reference books for CSS. None, however, take a more hands-on approach and use practical examples to teach readers......一起来看看 《Eric Meyer on CSS》 这本书的介绍吧!

SHA 加密
SHA 加密

SHA 加密工具

XML 在线格式化
XML 在线格式化

在线 XML 格式化压缩工具

HEX HSV 转换工具
HEX HSV 转换工具

HEX HSV 互换工具