Tars协议到底是指啥?
从Tars的这两篇文档的命名很具有迷惑性,看了半天不知道Tars和Tup啥关系?
其实就是tars赋予的内容太多了导致的。
- 以.tars结尾的接口文件,里面的内容用tars语言或语法来定义接口;
- 基于这个接口语言可以进行tars编码;
- 网络通信可以采用基于Tars协议的RPC通信。
做个类比就比较清楚了
- tars语言,定义了一些语法,类似于json,当然和json不太一样的是,tars语言既可以定义对象又可以定义方法。
- tars编码,其实是对象序列化的方法,类似于fastjson对json文件进行序列化。
- tars协议,类似于http协议,也是Request/Response(请求响应)模型,定义了Request和Response消息的格式。
Tars协议和Tup协议又有什么区别?
tars通信协议有几个版本,v1叫作tars,v3叫作tup,v2应该废弃不用了。
v1(tars协议),主要是用于服务间的接口调用,也就是rpc的主要协议。
v3(Tup协议),是用于其他客户端访问Tars服务
Response网络包结构
class TarsServantResponse1 {
0 int dataLength; // 整个数据包的长度,包含该字段 [4 Bytes]
1 short version; // 协议版本号 tag = 1 [2 Bytes]
2 byte packetType; // 包类型 tag = 2 [1 Bytes]
///////////////////////////////////////////////////
// version == 1,普通的Tars RPC调用
3 int requestId; // 请求id,未使用
4 int messageType; // 消息类型
5 int ret; // 返回值
6 byte[] result; // 结果值, Tars序列化后的byte数组,按照返回参数顺序,组成对象。
7 Map<String, String> status;
8 String remark; // 若ret=0 成功才会填写该字段
// version == 2 or version == 3, WupProxy调用
3 int messageType; // 消息类型
4 int ticketNum;
5 String servantName; // 服务名称
6 String functionName; // 函数名称
7 byte[] wupResult; // 结果值,Tars序列化后的byte数组
8 int timeout; // 超时时间
9 Map<String, String> context;
10 Map<String, String> status;
}
// 定义协议的版本号
const short TARSVERSION = 0x01; // tars协议
const short TARSVERSION = 0x01; // 老的tup协议,应该已经不用了
const short TUPVERSION = 0x03; // tup协议
Version 1的输出参数结构
/**
* 若functionName="tars_ping",该结果字段为空
* 老的tup协议,应该已经不用了
* 直接对参数进行tars编码,不包含参数的名称和类型
*/
class TarsServantResponseResult {
0 Object paramter1;
1 Object paramter1;
}
Version 2的输出参数结构
/**
* TUPVERSION = 0x03; // tup协议
* 既包含类型名称,也包含参数命名
* <ClassName, <ParameterName, ParameterValue>>
* 返回值作为一个参数加入进来,key 为 ""
*/
class TarsServantResponseWupResult {
0 HashMap<String, HashMap<String, byte[]>> _data;
}
Version 3的输出参数结构
/**
* TUPVERSION = 0x03; // tup协议
* 只包含参数名
* <ParameterName, ParameterValue>
* 返回值作为一个参数加入进来,key 为 ""
*/
class TarsServantResponseWupResult {
0 HashMap<String, byte[]> _newData
}
Request网络包结构
class TarsServantRequest1 {
int dataLength; // 整个数据包的长度,包含该字段 [4 Bytes]
1 short version; // 协议版本号 tag = 1 [2 Bytes]
2 byte packetType; // 包类型 tag = 2 [1 Bytes]
3 int messageType; // 消息类型
4 int ticketNum;
5 String servantName; // 服务名称
6 String functionName; // 函数名称
7 byte[] requestParams; // 请求参数的二进制编码,Tars序列化后的byte数组
8 int timeout; // 超时时间
9 Map<String, String> context;
10 Map<String, String> status;
}
同样当version不同,参数序列化结构不同,和Response类似
总结
从上面Tars和Tup的组包来看,最主要的区别是请求和返回参数的组包方式。Tars完全采用顺序来区分参数,而Tup是通过参数名称来区分参数的。