重磅!腾讯与科大讯飞技术共创,Google ProtoBuf进入TARS家族!
引言:TARS框架及自有TARS协议在腾讯内部始于2007年。Google Protocol Buffers于2008年7月对外公布。随着微服务架构的发展及ProtoBuf的优异表现,目前在互联网上有着大量应用。此次腾讯与科大讯飞进行深度技术合作,将ProtoBuf与TARS自身的编解码协议进行集成,并于今天将TARS-PB正式对外开源!
(TARS-PB发布)
protocol buffer
protocol buffer(简称PB)是google 的一种数据交换的格式,它独立于语言,独立于平台。google 提供了多种语言的实现:java、c#、c++、go 和 python,每一种实现都包含了相应语言的编译器以及库文件。由于它是一种二进制的格式,比使用 xml 进行数据交换快许多。可以把它用于分布式应用之间的数据通信或者异构环境下的数据交换。作为一种效率和兼容性都很优秀的二进制数据传输格式,可以用于诸如网络传输、配置文件、数据存储等诸多领域。
正因为PB有着如此优异的表现,目前PB在移动互联网行业有着大量的应用。在Tars-PB发布之后,已经使用PB作为内部数据交换协议的用户可以更方便地对Tars进行集成。
Tars-PB解决方案
下图是Tars的服务端与客户端的实现架构图:
通过对Tars ServantImp和ServantProxy的扩展,以及增加相应的protobuf codec实现了PB对Tars的支持。
对象生成
为了减少对PB序列化和反序列化的侵入,对对象仍然采用PB原生的生成方式。
Service生成
接口代码的生成为了保持tars的整体风格按照tars的方式进行生成。
Protoc插件
protoc官方提供了插件机制,只要满足相关的插件规范,用户可以自定义开发自已的插件。protoc在生成代码的时候,可以调用用户自定义实现的插件,从而生成用户自定义的代码。
我们就是利用protoc的插件机制,来实现 tars-pb 代码的生成。
使用方法
- 编写PB文件 编写一个proto描述文件:
message HelloRequest {
required string greeting = 1;
}
message HelloReply {
required string reply = 1;
}
service Greeter {
rpc SayHello (HelloRequest) returns (HelloReply) {}
}protoc ‐‐plugin=protoc-gen-tars-java=${plugin_path}
--tars-java_out=${out_path}
--java_out=${out_path} ${proto_path}
- 生成代码 执行命令,通过PB官方插件和Tars插件生成代码:
- 编写业务实现 后续的步骤与正常的tars使用相同,不在赘述。
使用pb作为编解码协议,经过测试,没有增加额外的性能损耗。测试数据将会在Tars开源社区公布。
若您在使用Tars-PB时或者对Tars本身有任何意见和建议,欢迎访问:
https://github.com/Tencent/Tars
原文来自:腾讯开源 公众号
- PyMC3和Theano代码构建贝叶斯深度网络,61页PPT探索贝叶斯深度学习以及实现
- 男程序员是不是都不会和女生表达交流?程序员的回答歪了
- Silverlight Telerik控件学习:主题Theme切换
- Silverlight自定义类库实现应用程序缓存
- Silverlight Telerik控件学习:TreeView数据绑定并初始化选中状态、PanelBar的Accordion效果、TabPanel、Frame基本使用
- 这或许是对小白最友好的python入门了吧——4,列表
- 每个人都应该知道的十个机器学习常识
- 重新带你了解React.js
- WebService又一个不爽的地方
- 劲爆!小程序又增新功能!为落地微信智慧零售方案做铺垫!
- 5G光传送网技术
- 突破封闭 Web 系统的技巧之正面冲锋
- 建立本地的Blast数据库
- [biztalk笔记]-1.Hello World!
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Windows给力!可以扔掉Linux虚拟机了!
- 好慌,Redis这么多集群方案,要用哪种?
- 你真的了解MySQL 8.0 数据字典吗?
- 《调教命令行09》磁盘很廉价,放小电影最合适了
- 既保护隐私又快速训练,Facebook开源Opacus库,利用差分隐私训练PyTorch模型
- 为什么Java中1000==1000为false而100==100为true?
- Java自动化测试 (元素定位 23)
- Java自动化测试(webdriver常用API 24)
- Java自动化测试(特殊元素处理 25)
- 那些Vue开发遇到的坑---响应式系统
- 基于Ansible和Devops的一键测试环境部署实践
- STM32硬核DIY机械键盘|蓝牙USB双模|灯控
- R语言隐马尔可夫模型HMM识别不断变化的股票市场条件
- 看完这篇并发后,又能扯皮了?
- Twitter美国航空公司情绪数据集的监督或半监督ULMFit模型