tarsframework 的源码大体分3部分
1、framework 框架的实现,里面内容是框架各个基础服务具体做的事;
2、servant 实现的内容是 单个服务基础lib的封装,包括网络IO,协程,逻辑管理等封装;
3、Util里一些高性能 数据结构的实现。
framework 和 servant 是这个框架,实现高可用设计,Util则是腾讯大神撸码功底的体现。
暂时源码解读笔记只写 framework 和 servant 部分。
对于Util部分,我有空时再做点一些关键类的笔记。
还有带着疑问解读tars源码章节。这块等后续补齐。
可以厚着脸皮的说,看我系列文章绝对有价值。我不只是简单的描述调用流程,还把framework 代码中涉及的所有配置细节参数,包括默认值,配置位置。尽可能的都记录上来了。
另外,如果有时间,最好去读读tarsframework 源码,不管你是哪种语言的使用者,读这源码对理解所用的语言的调用模式是有好处的,光看某个语言实现的Servant,其实很多内容是理解不到位的。
下面是官方文档中关于这些部分的描述
framework基础服务代码功能简介:
整体架构的拓扑图主要分为2个部分:服务节点与公共框架节点。
服务节点:
服务节点可以认为是服务所实际运行的一个具体的操作系统实例,可以是物理主机或者虚拟主机、云主机。随着服务的种类扩展和规模扩大,服务节点可能成千上万甚至数以十万计。 每台服务节点上均有一个Node服务节点和N(N>=0)个业务服务节点,Node服务节点会对业务服务节点进行统一管理,提供启停、发布、监控等功能,同时接收业务服务节点上报过来的心跳。
公共框架节点:
除了服务节点以外的服务,其他服务节点均归为一类。
公共框架节点,数量不定,为了自身的容错容灾,一般也要求在在多个机房的多个服务器上进行部署,具体的节点数量,与服务节点的规模有关,比如,如果某些服务需要打较多的日志,就需要部署更多的日志服务节点。
又可细分为如下几个部分:
Web管理系统:在Web上可以看到服务运行的各种实时数据情况,以及对服务进行发布、启停、部署等操作;
Registry(路由+管理服务):提供服务节点的地址查询、发布、启停、管理等操作,以及对服务上报心跳的管理,通过它实现服务的注册与发现;
Patch(发布管理):提供服务的发布功能;
Config(配置中心):提供服务配置文件的统一管理功能;
Log(远程日志):提供服务打日志到远程的功能;
Stat(调用统计):统计业务服务上报的各种调用信息,比如总流量、平均耗时、超时率等,以便对服务出现异常时进行告警;
Property(业务属性):统计业务自定义上报的属性信息,比如内存使用大小、队列大小、cache命中率等,以便对服务出现异常时进行告警;
Notify(异常信息):统计业务上报的各种异常信息,比如服务状态变更信息、访问db失败信息等,以便对服务出现异常时进行告警;
原则上要求全部的节点之间网络互通,至少每台机器的node能够与公共框架节点之间都是可以连通的。
框架服务在整个系统中运行时,服务之间的交互分:业务服务之间的交互、业务服务与框架基础服务之间的交互。
服务发布流程:在Web系统上传server的发布包到patch,上传成功后,在web上提交发布server请求,由registry服务传达到node,然后node拉取server的发布包到本地,拉起server服务。
管理命令流程:Web系统上的可以提交管理server服务命令请求,由registry服务传达到node服务,然后由node向server发送管理命令。
心跳上报流程:server服务运行后,会定期上报心跳到node,node然后把服务心跳信息上报到registry服务,由registry进行统一管理。
信息上报流程:server服务运行后,会定期上报统计信息到stat,打印远程日志到log,定期上报属性信息到property、上报异常信息到notify、从config拉取服务配置信息。
Client访问Server流程:client可以通过server的对象名Obj间接访问server,Client会从registry上拉取server的路由信息(如ip、port信息),然后根据具体的业务特性(同步或者异步,tcp或者udp方式)访问server(当然client也可以通过ip/port直接访问server)。
下面这部分是
libservant部分源码的简介
还是直接用官方原图解说
服务端:可以理解成对外公开的接口 被调用时候响应流程 的底层封装 (响应端)
NetThread: 收发包,连接管理,多线程(可配置),采用epoll ET触发实现,支持tcp/udp;
BindAdapter: 绑定端口类,用于管理Servant对应的绑定端口的信息操作;
ServantHandle:业务线程类,根据对象名分派Servant的对象和接口调用;
AdminServant: 管理端口的对象;
ServantImp: 继承Servant的业务处理基类(Servant:服务端接口对象的基类);
客户端:可以理解成 管理其他服务的连接器的 底层封装 (调用发起端)
NetThread: 收发包,连接管理,多线程(可配置),采用epoll ET触发实现,支持tcp/udp;
AdapterProxy: 具体服务器某个节点的本地代理,管理到服务器的连接,以及请求超时处理;
ObjectProxy: 远程对象代理,负责路由分发、负载均衡、容错,支持轮询/hash/权重;
ServantProxy: 远程对象调用的本地代理,支持同步/异步/单向,Tars协议和非Tars协议;
AsyncThread: 异步请求的回应包处理线程;
Callback: 具体业务Callback的处理基类对象;
大体就是上面那样子。。