内容简介:在上一篇文章,已经介绍了底层的transport本篇文章讲解server。
在上一篇文章,已经介绍了底层的transport
开源代码TarsGo-v1.0.0源码分析之transport
本篇文章讲解server。
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,这将是源码开始的第一步。
看源码
github.com/TarsCloud/TarsGo/tars/tools/Demo/Server.go
imp,app这两个东西很重要。是用来构建TarsProtocol的部件。
13:AddServant,添加服务(参数是imp,还有一个需要生成的代码)
14:Run
github.com/TarsCloud/TarsGo/tars/tools/Demo/ServantImp.go
github.com/TarsCloud/TarsGo/tars/tools/Demo/Servant.tars
github.com/TarsCloud/TarsGo/tars/tools/Demo/Server.conf
这只是个例子,知道就可以了。
那么从AddServant入手
github.com/TarsCloud/TarsGo/tars/servanthandle.go
19:构建了TarsProtocol,传入的参数是v和f,都是AddServant传入的。
在github.com/TarsCloud/TarsGo/tars/tools/Demo/Server.go main函数中已经有讲到imp和一个需要生成的obj
20:到了transport的代码,这个在文章 开源代码TarsGo-v1.0.0源码分析之transport 有讲解到
21:很重要,所有的服务都添加到了goSvrs中
TarsProtocol
github.com/TarsCloud/TarsGo/tars/tarsprotocol.go
构建tarsProtocol的接口
TarsProtocol,需要两个参数,dispatcher接口,serverImp。
21:初始化的时候,传入的参数。对应AddServant代码
对于transport中的接口
github.com/TarsCloud/TarsGo/tars/transport/tarsserver.go
那么构建的话
github.com/TarsCloud/TarsGo/tars/tarsprotocol.go
Invoke,数据处理部分
30:多了一层编码处理
42:则是dispatcher的Dispatch处理,传入的参数有serverImp。这种用法更多的是c++中的,指针传递。在golang中我个人认为是不推荐的。
ParsePackage:包解析,这个不解释了,TarSRequest代码很简单。
InvokeTimeout:超时处理,也不解释了,代码比较简单。
小结:最底层是transport,再之上是构建tarsProtocol。那么这里讲解的是tarsProtocol的封装。又将协议部分封装成了
server提供两个功能:
心跳上报流程:server服务运行后,会定期上报心跳到node,node然后把服务心跳信息上报到registry服务,由registry进行统一管理。
https://github.com/TarsCloud/Tars/blob/master/Introduction.md
提供与node的心跳
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
提供client访问的服务
继续
github.com/TarsCloud/TarsGo/tars/application.go
159:是cfg读取和初始化
161-163:添加了默认的admin servant
178-190:遍历所有的servant,开启servant服务。在AddServant中的21行中服务添加到了goSvrs中。
186:开启了transport中的tarsServer的Server(此代码可以回过头去看文章 开源代码TarsGo-v1.0.0源码分析之transport )
初始化
中间代码略
111:构建了adapter的配置。这里很重要
153:构建了AdminAdapter
在mainloop中
215:遍历所有的adapters
216-224:对adapters进行keepalive。
server的两个功能,从此打通了。
1、对node提供keepalive
2、对client提供服务。
总体架构的分层为(从底层开始):
1、transport之TarsServer
这里的接口并非真正对外的接口
2、tarsProtocol层
这里提供两个接口,用于真正协议的接口。
这里的名字会很误导,transport中的名字也叫TarsProtocol。这里要注意就是了。
3、AddServant层
将所有的TarsServer存放在goSvrs中进行管理
那么以amin为例子,讲解写Protocol
github.com/TarsCloud/TarsGo/tars/application.go
adf,ad为TarsProtocol的两个模块
在tars中提供了很多的Protocol
刚好以admin为例讲解
github.com/TarsCloud/TarsGo/tars/protocol/res/adminf/AdminF_IF.go
Dispatch为TarsProtocol的接口
97:则为传入的imp参数,对于admin有新的接口要求
99:Dispatch中的要处理的msg,shutdown
100:调用了imp的shutdown
104:Dispatch中的要处理的msg,notify
110:调用了imp的Notify
github.com/TarsCloud/TarsGo/tars/admin.go
这里为admin中的imp
这里的代码很简单。
总结:
server提供的功能是很简单的。代码分层也是比较清晰的。但代码有些负责,只要分清楚,这里的功能以及分层。整个流程还是很好把握的。
龚浩华
月牙寂道长
qq:29185807
2019年05月28日
如果你觉得本文对你有帮助,可以转到你的朋友圈,让更多人一起学习。
第一时间获取文章,可以关注本人公众号:月牙寂道长,也可以扫码关注
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:- 优秀开源库SDWebImage源码浅析
- 优秀开源库SDWebImage源码浅析
- Californium开源框架之源码分析(三)
- Californium开源框架之源码分析(四)
- Android开源框架源码分析:Okhttp
- Android开源框架源码分析:Okhttp
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。