Tars源码解析(一)
背景
接手的服务治理底层是依赖tars的,不过只是对tars做了二次开发,所以需要对tars的源码做一定的了解
tars的版本现在已经到v1.5版本
此分析是用的v1.03版本
具体版本是
https://github.com/Tencent/Tars/tree/508de1d5b664106e9b435eda0c478a9427128edb
Server端
阅读这类源码首先得理解他的配置功能,我们首先来看下Server端的配置
配置
- 暴露服务的配置(以XML为例 servants.xml)
<?xml version="1.0" encoding="UTF-8"?>
<servants>
<servant name="HelloObj" >
<home-api>com.qq.tars.quickstart.server.testapp.HelloServant</home-api>
<home-class>com.qq.tars.quickstart.server.testapp.impl.HelloServantImpl</home-class>
</servant>
</servants>
其实例子里给的属性不全,还有,属性
这个配置主要配置暴露出去的服务
- 整个服务的配置(ServerConfig)
<tars>
<application>
enableset=n
setdivision=NULL
<server>
#本地node的ip:port
node=tars.tarsnode.ServerObj@tcp -h x.x.x.x -p 19386 -t 60000
#应用名称
app=TestApp
#服务名称
server=HelloServer
#本机ip
localip=x.x.x.x
#管理端口
local=tcp -h 127.0.0.1 -p 20001 -t 3000
#服务可执行文件,配置文件等
basepath=/usr/local/app/tars/tarsnode/data/TestApp.HelloServer/bin/
#服务数据目录
datapath=/usr/local/app/tars/tarsnode/data/TestApp.HelloServer/data/
#日志路径
logpath=/usr/local/app/tars/app_log/
#配置中心的地址
config=tars.tarsconfig.ConfigObj
#通知上报的地址[可选]
notify=tars.tarsnotify.NotifyObj
#远程日志的地址[可选]
log=tars.tarslog.LogObj
#服务停止的超时时间
deactivating-timeout=2000
#日志等级
logLevel=DEBUG
#配置绑定端口
<TestApp.HelloServer.HelloObjAdapter>
#允许的IP地址
allow
#监听IP地址
endpoint=tcp -h x.x.x.x -p 20001 -t 60000
#处理组
handlegroup=TestApp.HelloServer.HelloObjAdapter
#最大连接数
maxconns=200000
#协议
protocol=tars
#队列大小
queuecap=10000
#队列超时时间毫秒
queuetimeout=60000
#处理对象
servant=TestApp.HelloServer.HelloObj
#当前线程个数
threads=5
</TestApp.HelloServer.HelloObjAdapter>
</server>
<client>
#主控的地址
locator=tars.tarsregistry.QueryObj@tcp -h x.x.x.x -p 17890
#同步超时时间
sync-invoke-timeout=3000
#异步超时时间
async-invoke-timeout=5000
#刷新ip列表的时间间隔
refresh-endpoint-interval=60000
#上报数据的时间间隔
report-interval=60000
#采样率
sample-rate=100000
#最大采样数
max-sample-count=50
#模版名称
modulename=TestApp.HelloServer
</client>
</application>
</tars>
其中大的配置项:
- Application:应用名称,如果配置文件没有配置,默认为UNKNOWN;
- ServerName:服务名称;
- BasePath:基本路径,通常表示可执行文件的路径;
- DataPath:数据文件路径,通常表示存在服务自己的数据;
- LocalIp:本地ip,默认是本机非127.0.0.1的第一块网卡IP;
- LogPath:日志文件路径,日志的写法请参考后续;
- LogLevel:滚动log日志级别;
- Local:服务可以有管理端口,可以通过管理端口发送命令给服务,该参数表示绑定的管理端口的地址,例如tcp -h 127.0.0.1 -p 8899,如果没有设置则没有管理端口;
- Node:本地NODE地址,如果设置,则定时给NODE发送心跳,否则不发送心跳,通常只有发布到框架上面的服务才有该参数;
- Log:日志中心地址,例如:tars.tarslog.LogObj@tcp –h .. –p …,如果没有配置,则不记录远程日志;
- Config:配置中心地址,例如:tars.tarsconfig.ConfigObj@tcp –h … -p …,如果没有配置,则addConfig函数无效,无法从远程配置中心拉取配置;
- Notify:信息上报中心地址,例如:tars.tarsnotify.NotifyObj@tcp –h … -p …,如果没有配置,则上报的信息直接丢弃;
- SessionTimeOut:防空闲连接超时设置;
- SessionCheckInterval:防空闲连接超时检查周期;
- Adapter表示了绑定端口。服务新增一个绑定端口,则新建立一个Adapter,并设置相关的参数和处理对象则可以非常方便的完成对这个端口上的处理,通常用这个功能来完成在其他协议的支撑。
对于TARS服务而言,在服务配置文件中增加adapter项,即可以完成增加一个Servant处理对象。
代码分析
组件构成
目录名称 | 功能 |
---|---|
net | 框架rpc网络库 |
core | 框架rpc的实现 |
tools | 框架工具的实现,maven插件等 |
examples | 框架的示例代码 |
distributedContext | 框架的分布式上下文 |
protobuf | 框架的pb协议支持 |
spring | 框架的spring支持 |
代码入口
package com.qq.tars.server.startup;
import com.qq.tars.server.core.Server;
public class Main {
public static void main(String[] args) {
new Server().st