设为首页 加入收藏

TOP

TarsGo新版本发布,支持protobuf,zipkin和自定义插件(一)
2019-09-17 17:34:43 】 浏览:38
Tags:TarsGo 版本 发布 支持 protobuf zipkin 定义 插件

本文作者:陈明杰(sandyskies)

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

TarsGo 新版本发布

在上次开源之后,有些用户反馈了一些需求,基于用户反馈的需求,我们进行了实现,并发布了1.1.0版本。 本次发布新增了:支持pb、支持zipkin分布式追踪、支持filter(自定义插件编写)、支持context 等,除此之外还做了一系列优化和bugfix。

新功能:PB支持

Protocol Buffers (简称 PB )是 Google 的一种数据交换的格式,它独立于语言,独立于平台,最早公布于 2008年7月。随着微服务架构的发展及自身的优异表现,ProtoBuf 可用于诸如网络传输、配置文件、数据存储等诸多领域,目前在互联网上有着大量应用。
如果对于现有已使用grpc,使用proto文件,想转换成tars协议的用户而言,需要将上面的proto文件翻译成Tars文件。这种翻译会比较繁琐,而且容易出错。 为此我们决定编写插件支持proto文件直接生成tars的rpc逻辑。protoc-gen-go的代码逻辑里面是预留了插件编写的规范的,参照grpc,主要有 grpc/grpc.go 和一个导入插件的link_grpc.go 。 这里我们编写 tarsrpc/tarsrpc.go 和 link_tarsrpc.go
使用方面:

  • 将这两个文件放到protoc-gen-go 下面,go install重新生成protoc-gen-go 二进制
  • 定义proto 文件
  • 使用重新编译安装的protoc-gen-go生成序列化和rpc相关接口代码
protoc --go_out=plugins=tarsrpc:. helloworld.proto

  

  • 编写tars 客户端和服务端代码,参数使用pb生成的结构体,其余代码逻辑和正常的tars服务一致。

新功能: filter机制, 支持zipkin分布式追踪

为了支持用户编写插件,我们支持了filter机制,分为服务端的过滤器和客户端过滤器,用户可以基于这个机制,实现自己的TarsGo插件。

//服务端过滤器, 传入dispatch,和f, 用于调用用户代码, req, 和resp为传入的用户请求和服务端相应包体
type ServerFilter func(ctx context.Context, d Dispatch, f interface{}, req *requestf.RequestPacket, resp *requestf.ResponsePacket, withContext bool) (err error)
//客户端过滤器, 传入msg(包含obj信息,adapter信息,req和resp包体), 还有用户设定的调用超时
type ClientFilter func(ctx context.Context, msg *Message, invoke Invoke, timeout time.Duration) (err error)
//注册服务端过滤器
//func RegisterServerFilter(f ServerFilter)
//注册客户端过滤器
//func RegisterClientFilter(f ClientFilter)

  有了过滤器,我们就能对服务端和客户端的请求做一些过滤,比如使用 hook用于分布式追踪的opentracing 的span。 我们来看下客户端filter的例子:

//生成客户端tars filter,通过注册这个filter来实现span的注入
func ZipkinClientFilter() tars.ClientFilter {
    return func(ctx context.Context, msg *tars.Message, invoke tars.Invoke, timeout time.Duration) (err error) {
        var pCtx opentracing.SpanContext
        req := msg.Req
        //先从客户端调用的context 里面看下有没有传递来调用链的信息,
        //如果有,则以这个做为父span,如果没有,则起一个新的span,span名字是RPC请求的函数名
        if parent := opentracing.SpanFromContext(ctx); parent != nil {
            pCtx = parent.Context()
        }
        cSpan := opentracing.GlobalTracer().StartSpan(
            req.SFuncName,
            opentracing.ChildOf(pCtx),
            ext.SpanKindRPCClient,
        )
        defer cSpan.Finish()
        cfg := tars.GetServerConfig()

        //设置span的信息,比如我们调用的客户端的ip地址,请求的接口,方法,协议,客户端版本等信息
        cSpan.SetTag("client.ipv4", cfg.LocalIP)
        cSpan.SetTag("tars.interface", req.SServantName)
        cSpan.SetTag("tars.method", req.SFuncName)
        cSpan.SetTag("tars.protocol", "tars")
        cSpan.SetTag("tars.client.version", tars.TarsVersion)

        //将span注入到 请求包体的  Status里面,status 是一个map[strint]string 的结构体
        if req.Status != nil {
            err = opentracing.GlobalTracer().Inject(cSpan.Context(), opentracing.TextMap, opentracing.TextMapCarrier(req.Status))
            if err != nil {
                logger.Error("inject span to status error:", err)
            }
        } else {
            s := make(map[
首页 上一页 1 2 下一页 尾页 1/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇系统架构设计师-软件水平考试(高.. 下一篇vue.js的项目实战

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目