Tars网络通信协议

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是通过参数名称来区分参数的。

参考文档

基础通信协议 Tars
统一通信协议 TarsTup

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。