【Tars-go】腾讯微服务框架学习使用03-- TarsUp协议

3 TarsUP协议

统一通信协议 TarsTup | TarsDocs (tarscloud.github.io)

TarsDocs/base at master · TarsCloud/TarsDocs (github.com) : 有关于tars的所有介绍

每一个rpc调用双方都约定一套数据序列化协议,gprc用的是protobuff,tarsgo是统一通信协议 TarsTup。

tup语法:TarsDocs/base/tars-protocol.md at master · TarsCloud/TarsDocs (github.com)

基本用法

既然是协议,就有一套成熟的标准,不断迭代、向前向后兼容–这就是大厂的硬实力,淦(但文档确实一般般):

  1. 基本数据

    支持的数据类型:

    • bool
    • byte: 8位
    • short: 最高支持到16位
    • int: 32位
    • long: 64位
    • float: 32位,float 在大多数现代编程语言和协议中通常都是指 IEEE 754 标准的单精度浮点数,占用 4 个字节。
    • double:64位,double 类型遵循 IEEE 754 标准的双精度浮点数格式,通常占用 8 个字节。
    • string:不定长,string 类型用于表示字符串数据。在 Tars 中,字符串是动态大小的,可以根据实际存储的内容变化其长度。存储时通常会先存储一个长度字段(可能是 32 位整数),然后是字符串本身的字节。
    • unsigned byte:8位,unsigned byte 表示无符号字节,范围从 0 到 255。这相当于在 C++ 或 Java 中的 unsigned char 和go 的byte
    • unsigned short:32位,unsigned short 是一个无符号的短整型数据,范围从 0 到 65535,占用 2 个字节。
    • unsigned int:64位,unsigned int 表示一个无符号的整型数据,范围从 0 到约 4.29 亿(2^32 - 1),占用 4 个字节。

    以上数据类型,在各种语言大部分都有相对应的实现,这也可以使用tars作为多语言间通信的数据协议。

  2. 复杂数据类型: 自己可以定义的数据类型

    有 枚举、常量、结构体、 序列 、 字典 具体可看TarsDocs/base/tars-protocol.md at master · TarsCloud/TarsDocs (github.com)

    一个例子:

    // 命名空间
    module AiGo{ // 枚举enum TE{E1 = 1,E2,E3};// 常量const int a = 1;const string s = "abc";// 结构体  + vector + mapstruct Test{0  require  string s;1  optional int  i = 23;2  require vector<int> vi;3  require map<int, string> m;};// 具体的接口--》可以调用的服务interface MathService{// 具体可以调用的方法。void add(int a, int b, out int c);   int Test1(int a, Test test, out int c); //};//嵌套struct demo1{0 require Test test; // 嵌套结构体1 require map<int , map<int, string>>  doubleMap;  // 双重Map2 require vector<vector<vector<int>>> triVector; // 三重Vector};};
    

    转化成go语言版本: tars2go -outdir=tars-protocol -module="github.com/ajwlforever/AiGo" .\demo.tars

    请添加图片描述

    生成这俩文件demo.goMathService.tars.go 就可以直接用了,当然这俩文件全是抽象的实现,底层数据的实现。–》具体方法内逻辑实现要初始化并绑定具体的实现

    // 具体的实现 初始化
    imp := new(InterfaceImp)
    err := imp.Init()
    ....
    // New servant
    app := new(AiGo.Demo1)
    // servant 绑定具体的实现
    app.AddServantWithContext(imp, cfg.App+"."+cfg.Server+".InterfaceObj")
    

协议对比

既然是数据序列化协议,那就要做一个对比,为什么腾讯自己造了一个自己的。

常见的数据序列协议有 xml、json、protobuf

首先最大的区别是 xml、json都是文本格式的,空间占比大,但由于其良好的可读性,也是广泛应用于restful风格的接口返回中。

protobuf和tarsup都是基于二进制直接定义的,数据的编码与解码都是更高效的,但是这种编码解码都需要额外的支持,而restful适用于几乎一切平台。

​ 尽管Protobuf和Tars在技术性能上有优势,JSON在易用性、灵活性和广泛支持等方面的优势使其成为大多数HTTP接口首选的数据格式。对于需要高性能和高效数据编码的内部系统或微服务间通信,Protobuf和Tars仍然是非常合适的选择

总的来说,为什么http接口首选json:

  1. 可读、性能好像也没那么不好,只是相对于二进制的会慢一点,who care,现代的Web服务架构和硬件已经能够很好地处理大量的JSON数据,性能损失可以通过其他手段(如缓存、数据压缩)来缓解。
  2. 复杂性:使用JSON作为数据格式,开发者可以利用标准的HTTP工具和库来处理数据,而无需依赖于特定的序列化和反序列化工具。
  3. 易用性:JSON作为一种文本格式,很容易处理各种编码和字符集的问题,这使得它在不同平台和编程环境之间具有很好的兼容性。而二进制格式可能需要处理字节顺序、对齐方式等底层细节,这在跨平台交互时可能导致问题。
  4. 开放性:JSON作为一种开放标准,在Web开发中有广泛的文档和最佳实践指导。而Protobuf、Tars虽然也有文档,但相对较少,且通常与特定实现或框架相关,这在一定程度上限制了它们的通用性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/307735.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C语言 函数——函数封装与程序的健壮性

目录 函数封装&#xff08;Encapsulation&#xff09; 如何增强程序的健壮性&#xff1f; 如何保证不会传入负数实参&#xff1f; 函数设计的基本原则 函数封装&#xff08;Encapsulation&#xff09; 外界对函数的影响——仅限于入口参数 函数对外界的影响——仅限于一个…

[CSS]使用方式+样式属性

层叠样式表&#xff08;Cascading Style Sheets&#xff09;&#xff0c;与HTML一样&#xff0c;也是一种标记语言&#xff0c;其作用就是给HTML页面标签添加各种样式&#xff0c;定义网页的显示效果&#xff0c;将网页内容和显示样式进行分离&#xff0c;提高了显示功能。简单…

【漏洞复现】WordPress Welcart 任意文件读取漏洞(CVE-2022-4140)

0x01 产品简介 Welcart 是一款免费的 WordPress 电子商务插件。Welcart 具有许多用于制作在线商店的功能和自定义设置。您可以轻松创建自己的原始在线商店。 0x02 漏洞概述 Welcart存在任意文件读取漏洞&#xff0c;未授权的攻击者可以通过该漏洞读取任意文件&#xff0c;获…

2024年MathorCup数学建模A题移动通信网络中PCI规划问题解题文档与程序

2024年第十四届MathorCup高校数学建模挑战赛 A题 移动通信网络中PCI规划问题 原题再现&#xff1a; 物理小区识别码(PCI)规划是移动通信网络中下行链路层上&#xff0c;对各覆盖小区编号进行合理配置&#xff0c;以避免 PCI 冲突、PCI 混淆以及 PCI 模3 千扰等现象。PCI 规划…

时序预测 | Matlab实现SSA-ESN基于麻雀搜索算法(SSA)优化回声状态网络(ESN)的时间序列预测

时序预测 | Matlab实现SSA-ESN基于麻雀搜索算法(SSA)优化回声状态网络(ESN)的时间序列预测 目录 时序预测 | Matlab实现SSA-ESN基于麻雀搜索算法(SSA)优化回声状态网络(ESN)的时间序列预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 1.Matlab实现SSA-ESN基于麻雀搜索…

Unity DOTS1.0 入门(3) System与SystemGroup 概述

System与SystemGroup 概述 System System是提供一种代码逻辑,改变组件的数据状态,从一个状态到另外一个状态System在main thread里面运行, system.Update方法每一帧执行一次(其他线程中运行的就是JobSystem的事情了&#xff09;System是通过一个System Group这个体系来决定它…

IP地址定位技术在各领域的作用

IP地址定位是通过确定IP地址的物理位置来定位一个设备的技术&#xff0c;它在现代社会的多个领域中都有着广泛的应用。以下将详细探讨IP地址定位的应用场景&#xff0c;以期对读者有所启发。 首先&#xff0c;在网络安全领域&#xff0c;IP地址定位发挥着至关重要的作用。网络…

10 Php学习:循环

在 PHP 中&#xff0c;提供了下列循环语句&#xff1a; while - 只要指定的条件成立&#xff0c;则循环执行代码块do…while - 首先执行一次代码块&#xff0c;然后在指定的条件成立时重复这个循环for - 循环执行代码块指定的次数foreach - 根据数组中每个元素来循环代码块 当…

【300套】基于Springboot+Vue的Java实战开发项目(附源码+演示视频+LW)

大家好&#xff01;我是程序员一帆&#xff0c;感谢您阅读本文&#xff0c;欢迎一键三连哦。 &#x1f9e1;今天给大家分享300的Java毕业设计&#xff0c;基于Springbootvue框架&#xff0c;这些项目都经过精心挑选&#xff0c;涵盖了不同的实战主题和用例&#xff0c;可做毕业…

Rocky(Centos)数据库等高并发或高io应用linux系统调优,及硬件问题排查(含网络、磁盘、系统监控)

一、系统参数优化 默认的最大打开文件数是1024.不满足生产环境的要求。按照如下配置&#xff1a; 1、修改 systemctl管理的 servie 资源限制 编辑/etc/systemd/system.conf # 全局的打开文件数 DefaultLimitNOFILE2097152 # 全局打开进程数 DefaultLimitNPROC655352、调整系…

【c++】优先级队列|反向迭代器(vector|list)

优先级队列的常用函数的使用 #include<iostream> #include<queue> using namespace std;int main() {priority_queue<int>st;st.push(1);st.push(7);st.push(5);st.push(2);st.push(3);st.push(9);while (!st.empty()){cout << st.top() << &qu…

2024年MathorCup数学建模B题甲骨文智能识别中原始拓片单字自动分割与识别研究解题文档与程序

2024年第十四届MathorCup高校数学建模挑战赛 B题 甲骨文智能识别中原始拓片单字自动分割与识别研究 原题再现&#xff1a; 甲骨文是我国目前已知的最早成熟的文字系统&#xff0c;它是一种刻在龟甲或兽骨上的古老文字。甲骨文具有极其重要的研究价值&#xff0c;不仅对中国文…

MLeaksFinder报错

1.报错&#xff1a;FBClassStrongLayout.mm 文件&#xff1a;layoutCache[currentClass] ivars; 解决&#xff1a;替换为layoutCache[(id)currentClass] ivars; 2.编译正常但运行时出现crash indirect_symbol_bindings[i] cur->rebinding FBRetainCycleDetector iOS15 …

深度学习的模型有几类,能干嘛用?

1、基础模型 &#xff08;1&#xff09;卷积神经网络 **卷积&#xff1a;**卷积的本质是通过矩阵运算9的方式将输入数据进行空间上的滤波&#xff0c;有效地提取数据中的局 部特征&#xff0c;从而实现特征数据更高程度的抽象表示。 **池化&#xff1a;**可以理解成“压缩”…

微服务(狂神)

什么是微服务&#xff1a; 微服务方案&#xff1a; 1. SpringCloud NetFlix 2. Dubbo 3. SpringCloud Alibaba 解决了什么问题&#xff1a; 1. 服务过多&#xff0c;客户端怎么访问 2. 服务过多&#xff0c;服务间怎么传值 3. 服务过多&#xff0c;如何治理 4. 服务过多…

路由器配置实验--R1---R5

R1的路由表中默认存在:192.168.1.0192.168.3.0 需要添加:192.168.2.0 4.0 5.0 R2的路由表中默认存在:192.168.1.0192.168.2.0需要添加:192.168.3.0 4.0 5.0 R3的路由表中默认存在:192.168.3.0192.168.4.0需要添加: 1.0 2.0 5.0 R4的路由表中默认存在:192.168.2.0 192.168.4.0…

Java基础第十一课——类与对象(2)

由于类与对象这一部分的知识点很多&#xff0c;而且操作方法也有很多&#xff0c;所以这次将继续深入讨论一下关于类与对象中方法传参、方法重载、构造方法以及this关键字使用方面的知识。 一、方法传参 1.return关键字 return关键字作用 作用场景&#xff1a;方法内 作用…

鸿蒙TypeScript学习第14天:【联合类型】

1、TypeScript 联合类型 联合类型&#xff08;Union Types&#xff09;可以通过管道(|)将变量设置多种类型&#xff0c;赋值时可以根据设置的类型来赋值。 注意&#xff1a;只能赋值指定的类型&#xff0c;如果赋值其它类型就会报错。 创建联合类型的语法格式如下&#xff1…

UTONMOS元宇宙游戏特点

在元宇宙的世界里&#xff0c;游戏不再只是一种娱乐方式&#xff0c;而是一种全新的生活体验。UTONMOS元宇宙游戏带你穿越虚拟与现实的边界&#xff0c;开启一段前所未有的冒险之旅。 在这个充满无限可能的UTONMOS元宇宙游戏中&#xff0c;你将成为自己游戏世界的主角。可以自…

蓝桥杯(填空题)

十四届 B组 日期统计&#xff08;暴力枚举&#xff09; 数据 5 6 8 6 9 1 6 1 2 4 9 1 9 8 2 3 6 4 7 7 5 9 5 0 3 8 7 5 8 1 5 8 6 1 8 3 0 3 7 9 2 7 0 5 8 8 5 7 0 9 9 1 9 4 4 6 8 6 3 3 8 5 1 6 3 4 6 7 0 7 8 2 7 6 8 9 5 6 5 6 1 4 0 1 0 0 9 4 8 0 9 1 2 8 5 0 2 5 3…