2018-11-13 14:43

  我们今天看一下Tars,Tars是2017年4月开源,并于2018年6月加入Linux基金会。Tars是腾讯从2008年到今天一直在使用的后台逻辑层的统一应用框架TAF(Total Application Framework),目前支持C++,Java,PHP,Nodejs,Golang语言。该框架为用户提供了涉及到开发、运维、以及测试的一整套解决方案,帮助一个产品或者服务快速开发、部署、测试、上线。 它集可扩展协议编解码、高性能RPC通信框架、名字路由与发现、发布监控、日志统计、配置管理等于一体,通过它可以快速用微服务的方式构建自己的稳定可靠的分布式应用,并实现完整有效的服务治理。目前该框架在腾讯内部,各大核心业务都在使用,颇受欢迎,基于该框架部署运行的服务节点规模达到上万个。

  TarsGo 是Tars 的Go语言实现版本, 于2018年9月开源。

  Tars协议是一种类c++标识符的语言,用于生成具体的服务接口文件,Tars文件是Tars框架中客户端和服务端的通信接口,通过Tars的映射实现远程对象调用。 Tars 协议是和语言无关,基于IDL接口描述语言的二进制编码协议。

  详见 TarsProtocol

  Protocol Buffers (简称 PB )是 Google 的一种数据交换的格式,它独立于语言,独立于平台,最早公布于 2008年7月。随着微服务架构的发展及自身的优异表现,ProtoBuf 可用于诸如网络传输、配置文件、数据存储等诸多领域,目前在互联网上有着大量应用。

  PB协议是单独的协议,如果要支持RPC,可以定义service字段,并且基于protoc-gen-go 的grpc 插件生成相应的grpc编码。

  以下面的 proto 文件为例

  1542089851683729.png

  使用protoc生成相应的接口代码,以Go语言为例:

  1542089925828221.png

  如果对于现有已使用grpc,使用proto,想转换成防火墙tars协议的用户而言,需要将上面的proto文件翻译成Tars文件。对于Tars而言,Tars是编写tars文件,然后用相应的工具tars2xxx, 比如tars2go生成相应的接口代码。上面的proto文件翻译成tars文件是:

  1542089979448621.png

  然后调用tars2go生成 相应的tarsgo接口:

  tars2go --outdir ./ helloworld.tars

  这种翻译会比较繁琐,而且容易出错。 为此我们决定编写插件支持proto直接生成tars的rpc逻辑。

  有两种方案,一种是写protoc插件,直接读取protoc解析proto文件的二进制流,对service相应的字段进行解析,以便生成相应的rpc逻辑,其他交由protoc-gen-go处理

  另外一种是直接编写protoc-gen-go的插件,类似gRPC插件,

  这里决定采用方案2 。

  protoc-gen-go 并没有插件编写的相关说明,但protoc-gen-go的代码逻辑里面是预留了插件编写的规范的,参照grpc,主要有 grpc/grpc.go 和一个导致插件包的link_grpc.go 。 这里我们编写 tarsrpc/tarsrpc.go 和 link_tarsrpc.go

  代码逻辑基本上就是继承 generator.Generator,注册插件, 获取相应的service,method,和method的input和output,再调用P方法将要生成的代码输出即可

  1542090093378998.png

  这里主要是生成 service 转成相应的interface,然后interface里面有定义的rpc method, 用户可以实现自己真正业务逻辑的method,其余的都是tars相应的发包收包逻辑。Tars的请求包体:

  1542090154995336.png

  我们只需要将rpc method的名字,放入RequestPacket 的SFuncName ,然后将请求参数调用proto的Marshal序列化后放到 SBuffer。

  而对于回包,Tars的回包结构体:

  1542090295989614.png

  同样,我们只需要将返回的结果,调用Marshal 将请求放入 SBuffer ,其他逻辑和tars保持一致。

  编写完插件,就可以通过和grpc生成代码相同的方式,将proto 文件转化成tars的接口文件:

  1542090348363305.png

  下面是简单的服务端例子

  1542090409394299.png

  简单的客户端调用例子

      1542090478147462.png

  有不足之处 希望大家指出相互学习!

  原文出处:TARS小助手


评论

kvc636757024

#1

kvc636757024

http://v.qq.com/x/search/?q=%E5%8D%8E%E7%BA%B3%E7%BB%8F%E7%90%86%E7%94%B5%E8%AF%9D_18183615678 http://v.qq.com/x/search/?q=%E5%8D%8E%E7%BA%B3%E7%BD%91_18183615678 http://v.qq.com/x/search/?q=%E5%8D%8E%E7%BA%B3%E5%AE%A2%E6%9C%8D_18183615678 http://v.qq.com/x/search/?q=%E5%8D%8E%E7%BA%B3%E5%85%AC%E5%8F%B8_18183615678 http://v.qq.com/x/search/?q=%E7%BC%85%E7%94%B8%E5%8D%8E%E7%BA%B3%E5%BC%80%E6%88%B7_18183615678 http://v.qq.com/x/search/?q=%E5%8D%8E%E7%BA%B3%E5%B9%B3%E5%8F%B0%E6%B3%A8%E5%86%8C_18183615678 http://v.qq.com/x/search/?q=%E5%8D%8E%E7%BA%B3%E5%A8%B1%E4%B9%90%E5%B9%B3%E5%8F%B0_18183615678 http://v.qq.com/x/search/?q=%E7%BC%85%E7%94%B8%E5%8D%8E%E7%BA%B3_18183615678 http://v.qq.com/x/search/?q=%E5%8D%8E%E7%BA%B3%E7%BD%91%E6%8A%95%E5%BC%80%E6%88%B7%E7%94%B5%E8%AF%9D_18183615678
2020/06/26 13:59回复