真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

TarsGo新版本發(fā)布,支持protobuf,zipkin和自定義插件-創(chuàng)新互聯(lián)

本文作者:陳明杰(sandyskies)
Tars是騰訊從2008年到今天一直在使用的后臺邏輯層的統(tǒng)一應用框架,目前支持C++,Java,PHP,Nodejs,Golang語言。該框架為用戶提供了涉及到開發(fā)、運維、以及測試的一整套解決方案,幫助一個產(chǎn)品或者服務快速開發(fā)、部署、測試、上線。 它集可擴展協(xié)議編解碼、高性能RPC通信框架、名字路由與發(fā)現(xiàn)、發(fā)布監(jiān)控、日志統(tǒng)計、配置管理等于一體,通過它可以快速用微服務的方式構建自己的穩(wěn)定可靠的分布式應用,并實現(xiàn)完整有效的服務治理。目前該框架在騰訊內(nèi)部,各大核心業(yè)務都在使用,頗受歡迎,基于該框架部署運行的服務節(jié)點規(guī)模達到上萬個。
Tars 于2017年4月開源,并于2018年6月加入Linux 基金會。
TarsGo 是Tars 的Go語言實現(xiàn)版本, 于2018年9月開源, 項目地址 https://github.com/TarsCloud/TarsGo ,歡迎star 。

創(chuàng)新互聯(lián)公司堅持“要么做到,要么別承諾”的工作理念,服務領域包括:成都網(wǎng)站制作、成都網(wǎng)站設計、外貿(mào)營銷網(wǎng)站建設、企業(yè)官網(wǎng)、英文網(wǎng)站、手機端網(wǎng)站、網(wǎng)站推廣等服務,滿足客戶于互聯(lián)網(wǎng)時代的當雄網(wǎng)站設計、移動媒體設計的需求,幫助企業(yè)找到有效的互聯(lián)網(wǎng)解決方案。努力成為您成熟可靠的網(wǎng)絡建設合作伙伴!

TarsGo 新版本發(fā)布

在上次開源之后,有些用戶反饋了一些需求,基于用戶反饋的需求,我們進行了實現(xiàn),并發(fā)布了1.1.0版本。 本次發(fā)布新增了:支持pb、支持zipkin分布式追蹤、支持filter(自定義插件編寫)、支持context 等,除此之外還做了一系列優(yōu)化和bugfix。

新功能:PB支持

Protocol Buffers (簡稱 PB )是 Google 的一種數(shù)據(jù)交換的格式,它獨立于語言,獨立于平臺,最早公布于 2008年7月。隨著微服務架構的發(fā)展及自身的優(yōu)異表現(xiàn),ProtoBuf 可用于諸如網(wǎng)絡傳輸、配置文件、數(shù)據(jù)存儲等諸多領域,目前在互聯(lián)網(wǎng)上有著大量應用。
如果對于現(xiàn)有已使用grpc,使用proto文件,想轉(zhuǎn)換成tars協(xié)議的用戶而言,需要將上面的proto文件翻譯成Tars文件。這種翻譯會比較繁瑣,而且容易出錯。 為此我們決定編寫插件支持proto文件直接生成tars的rpc邏輯。protoc-gen-go的代碼邏輯里面是預留了插件編寫的規(guī)范的,參照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 客戶端和服務端代碼,參數(shù)使用pb生成的結構體,其余代碼邏輯和正常的tars服務一致。

  • 詳細原理和使用文檔,閱讀 騰訊云社區(qū)文章

新功能: filter機制, 支持zipkin分布式追蹤

為了支持用戶編寫插件,我們支持了filter機制,分為服務端的過濾器和客戶端過濾器,用戶可以基于這個機制,實現(xiàn)自己的TarsGo插件。

//服務端過濾器, 傳入dispatch,和f, 用于調(diào)用用戶代碼, 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包體), 還有用戶設定的調(diào)用超時
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來實現(xiàn)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
        //先從客戶端調(diào)用的context 里面看下有沒有傳遞來調(diào)用鏈的信息,
        //如果有,則以這個做為父span,如果沒有,則起一個新的span,span名字是RPC請求的函數(shù)名
        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的信息,比如我們調(diào)用的客戶端的ip地址,請求的接口,方法,協(xié)議,客戶端版本等信息
        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[string]string)
            err = opentracing.GlobalTracer().Inject(cSpan.Context(), opentracing.TextMap, opentracing.TextMapCarrier(s))
            if err != nil {
                logger.Error("inject span to status error:", err)
            } else {
                req.Status = s
            }
        }
        //沒什么其他需要修改的,就進行客戶端調(diào)用
        err = invoke(ctx, msg, timeout)
        if err != nil {
            //調(diào)用錯誤,則記錄span的錯誤信息
            ext.Error.Set(cSpan, true)
            cSpan.LogFields(oplog.String("event", "error"), oplog.String("message", err.Error()))
        }

        return err
    }

服務端也會注冊一個filter,主要功能就是從request包體的status 提取調(diào)用鏈的上下文,以這個作為父span,進行調(diào)用信息的記錄。
整體的一個效果:
TarsGo新版本發(fā)布,支持protobuf,zipkin和自定義插件

詳細代碼參見 TarsGo/tars/plugin/zipkintracing
完整的zipkin tracing的客戶端和服務端例子,詳見 TarsGo/examples下面的ZipkinTraceClient和ZipkinTraceServer

新功能: 支持context

TarsGo 之前在生成的客戶端代碼,或者用戶傳入的實現(xiàn)代碼里面,都沒有使用context。 這使得我們想傳遞一些框架的信息,比如客戶端ip,端口等,或者用戶傳遞一些調(diào)用鏈的信息給框架,都很難于實現(xiàn)。 通過接口的一次重構,支持了context,這些上下文的信息,將都通過context來實現(xiàn)。 這次重構為了兼容老的用戶行為,采用了完全兼容的設計。

服務端使用context

type ContextTestImp struct {
}
//只需在接口上添加 ctx context.Context參數(shù)
func (imp *ContextTestImp) Add(ctx context.Context, a int32, b int32, c *int32) (int32, error) {
    //我們可以通過context 獲取框架傳遞的信息,比如下面的獲取ip, 甚至返回一些信息給框架,詳見tars/util/current下面的接口
    ip, ok := current.GetClientIPFromContext(ctx)
    if !ok {
        logger.Error("Error getting ip from context")
    }  
    return 0, nil
}
//以前使用AddServant ,現(xiàn)在只需改成AddServantWithContext
app.AddServantWithContext(imp, cfg.App+"."+cfg.Server+".ContextTestObj")

客戶端使用context


    ctx := context.Background()
    c := make(map[string]string)
    c["a"] = "b" 
//以前使用app.Add 進行客戶端調(diào)用,這里只要變成app.AddWithContext ,就可以傳遞context給框架,如果要設置給tars請求的context
//可以多傳入?yún)?shù),比如c,參數(shù)c是可選的,格式是 ...[string]string
    ret, err := app.AddWithContext(ctx, i, i*2, &out, c)

服務端和客戶端的完整例子,詳見 TarGo/examples

其他優(yōu)化和修復

  • 將request package 的Sbuffer字段由vector 改成vector,解決和其他語言通信問題
  • 修復stat監(jiān)控上報問題
  • 日志級別從遠端更新
  • 修復路由刷新協(xié)程極端情況下死鎖問題
  • 優(yōu)化協(xié)程池方案,并添加協(xié)程池方案
  • 修復go協(xié)程啟動順序?qū)е聀anic問題
  • golint大部分代碼

另外有需要云服務器可以了解下創(chuàng)新互聯(lián)cdcxhl.cn,海內(nèi)外云服務器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務器、裸金屬服務器、高防服務器、香港服務器、美國服務器、虛擬主機、免備案服務器”等云主機租用服務以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務可用性高、性價比高”等特點與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應用場景需求。


當前名稱:TarsGo新版本發(fā)布,支持protobuf,zipkin和自定義插件-創(chuàng)新互聯(lián)
瀏覽地址:http://weahome.cn/article/ddgpij.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部