解析Tars协议(Node版本)

Tars(1)微服务之间的通信采用Tars协议完成,Tars协议是标准的 TLV 协议,该协议为每个字段定义了Tag值、Length值域长度和Value值域。

在Tars协议进行序列化的时候,内部会维护一个 Position 作为位置标记符。我们可以看到每次写入的时候该Position 都会增大,在写入前也会对已有内存空间大小进行分配。如果超出某个界限就会重新分配内存

具体实现如下:

由于Int8、Int16、Int32的长度都已知,所以不需要额外维护 TLV 中的 L ,但面对Map、List、String时则需要额外维护一个 Length 代表该 Tag.Value.Length

具体实现如下:

整个代码实现非常的工整清晰,用我的话说就是美。大家有兴趣可以Clone下来阅读。

当然,我也使用TS写了一个基本的实现,方便大家更好理解Tars协议内部是如何进行序列化的。

这是 写入二进制的父类

现在我们创建一个WriteStream的子类代表符合Tars协议规范的结构体,然后模拟序列化写入二进制数据。

这样子就相当于写入了4个不同大小的 Int 和一个 String ,然后再写进去了一个 MAP

我们重点讲一下 WriteMap函数

function objToStream 函数的作用是将 Map的包裹类 T_Map的实例对象 写成二进制数据。

写完后,会计算所占用的内存空间,然后将占用的存储空间写入先写入Buffer中。

最后将二进制数据写入已有的Buffer中。

至此,完成写入。

如何读呢?同样的可以先定义一个父类。

ReadMap的实现与WriteMap基本相同,先拿到ByteLength,再根据ByteLength和Position从缓冲区中取出一块二进制数据的进行处理。

然后我们对上述序列化后的数据进行反序列化。

最后执行下

至此,解析完毕!

参考资料:

(1)Tars : 早期名为TAF(Tencent Application Framework) ,是腾讯内部使用多年的微服务治理框架,在18年时开源后改名为Tars并捐赠给Linux基金会。

(2)TarsNode协议源码 github.com/tars-node/s...

(3)TS学习版本 github.com/chelizichen...__

相关推荐
BYSJMG31 分钟前
计算机毕业设计选题推荐:基于Hadoop的城市交通数据可视化系统
大数据·vue.js·hadoop·分布式·后端·信息可视化·课程设计
BYSJMG41 分钟前
Python毕业设计选题推荐:基于大数据的美食数据分析与可视化系统实战
大数据·vue.js·后端·python·数据分析·课程设计·美食
东东5161 小时前
OA自动化居家办公管理系统 ssm+vue
java·前端·vue.js·后端·毕业设计·毕设
程序员鱼皮1 小时前
前特斯拉 AI 总监:AI 编程最大的谎言,是 “提效”
前端·后端·ai·程序员·开发
好好研究2 小时前
SpringBoot使用外置Tomcat
spring boot·后端·tomcat
索荣荣2 小时前
Spring Boot 实现DOCX转PDF(基于docx4j的轻量级开源方案)
spring boot·后端·pdf
mit6.8242 小时前
[todo]10个常见的后端框架
后端
没有bug.的程序员2 小时前
Spring Boot 与 Sleuth:分布式链路追踪的集成、原理与线上故障排查实战
java·spring boot·分布式·后端·分布式链路追踪·sleuth·线上故障排查
爱敲代码的憨仔2 小时前
Spring-AOP
java·后端·spring
短剑重铸之日2 小时前
《设计模式》第四篇:观察者模式
java·后端·观察者模式·设计模式