99精品伊人亚洲|最近国产中文炮友|九草在线视频支援|AV网站大全最新|美女黄片免费观看|国产精品资源视频|精彩无码视频一区|91大神在线后入|伊人终合在线播放|久草综合久久中文

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

關(guān)于go-zero如何追蹤的原理追溯

OSC開(kāi)源社區(qū) ? 來(lái)源:OSC開(kāi)源社區(qū) ? 2022-12-22 10:35 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

前言

鏈路追蹤是每個(gè)微服務(wù)架構(gòu)下必備的利器,go-zero 當(dāng)然早已經(jīng)為我們考慮好了,只需要在配置中添加配置即可使用。

關(guān)于 go-zero 如何追蹤的原理追溯,之前已經(jīng)有同學(xué)分享,這里我就不再多說(shuō),如果有想了解的同學(xué)去 https://mp.weixin.qq.com/s/hJEWcWc3PnGfWfbPCHfM9g 這個(gè)鏈接看就好了。默認(rèn)會(huì)在 api 的中間件與 rpc 的 interceptor 添加追蹤,如果有不了解 go-zero 默認(rèn)如何使用默認(rèn)的鏈路追蹤的,請(qǐng)移步我的開(kāi)源項(xiàng)目 go-zero-looklook 文檔 https://github.com/Mikaelemmmm/go-zero-looklook/blob/main/doc/chinese/12-%E9%93%BE%E8%B7%AF%E8%BF%BD%E8%B8%AA.md。

今天我想講的是,除了 go-zero 默認(rèn)在 api 的 middleware 與 rpc 的 interceptor 中幫我們集成好的鏈路追蹤,我們想自己在某些本地方法添加鏈路追蹤代碼或者我們想在 api 發(fā)送一個(gè)消息給 mq 服務(wù)時(shí)候想把整個(gè)鏈路包含 mq 的 producer、consumer 穿起來(lái),在 go-zero 中該如何做。

場(chǎng)景

我們先簡(jiǎn)單講一下我們的小 demo 的場(chǎng)景,一個(gè)請(qǐng)求進(jìn)來(lái)調(diào)用 api 的 Login 方法,在 Login 方法中先調(diào)用 rpc 的 GetUserByMobile 方法,之后在調(diào)用 api 本地的 local 方法,緊接著調(diào)用 rabbitmq 傳遞消息到 mq 服務(wù)。

go-zero 默認(rèn)集成了 jaeger、zinpink,這里我們就以 jaeger 為例

我們希望看到的鏈路是

4ae48258-813f-11ed-8abf-dac502259ad0.pngapi.Login -> rpc.GetUserByMobile

也就是 api 衍生出來(lái)三條子鏈路,api.producerMq 有一條調(diào)用 mq.Consumer 的子鏈路。

我們想要將一個(gè)方法添加到鏈路中需要兩個(gè)因素,一個(gè) traceId,一個(gè)span,當(dāng)我們?cè)谕粋€(gè) traceId 下開(kāi)啟 span 把相關(guān)的 span 都串聯(lián)起來(lái),如果想形成父子關(guān)系,就要把 span 之間相互串聯(lián)起來(lái),因?yàn)椤?strong>微服務(wù)實(shí)踐」公眾號(hào)中講解原理太多,我這里就簡(jiǎn)單提一下不涉及過(guò)多,如果不是特別熟悉原理可以看文章開(kāi)頭推薦的文章,這里我們只需要知道 traceIdspanId 關(guān)系就好。

核心業(yè)務(wù)代碼

1、首先 API 中 LoginLogic 代碼

typeLoginLogicstruct{
logx.Logger
ctxcontext.Context
svcCtx*svc.ServiceContext
}

funcNewLoginLogic(ctxcontext.Context,svcCtx*svc.ServiceContext)*LoginLogic{
return&LoginLogic{
Logger:logx.WithContext(ctx),
ctx:ctx,
svcCtx:svcCtx,
}
}

typeMsgBodystruct{
Carrier*propagation.HeaderCarrier
Msgstring
}

func(l*LoginLogic)Login(req*types.RegisterReq)(*types.AccessTokenResp,error){
resp,err:=l.svcCtx.UserRpc.GetUserByMobile(l.ctx,&usercenter.GetUserByMobileReq{
Mobile:req.Mobile,
})
iferr!=nil{
return&types.AccessTokenResp{},nil
}

l.local()

tracer:=otel.GetTracerProvider().Tracer(trace.TraceName)
spanCtx,span :=tracer.Start(l.ctx,"send_msg_mq",oteltrace.WithSpanKind(oteltrace.SpanKindProducer))
carrier:=&propagation.HeaderCarrier{}
otel.GetTextMapPropagator().Inject(spanCtx,carrier)

producer:=rabbit.NewRabbitmqPublisher(RabbitmqDNS)
msg:=&MsgBody{
Carrier:carrier,
Msg:req.Mobile,
}
b,err:=json.Marshal(msg)
iferr!=nil{
panic(err)
}

iferr:=producer.Publish(spanCtx,ExchangeName,RoutineKeys,b);err!=nil{
logx.Errorf("PublishFail,msg:%s,err:%v",msg,err)
}
span.End()

return&types.AccessTokenResp{
AccessExpire:resp.User.Id,
},err
}

func(l*LoginLogic)local(){
tracer:=otel.GetTracerProvider().Tracer(trace.TraceName)
_,span :=tracer.Start(l.ctx,"local",oteltrace.WithSpanKind(oteltrace.SpanKindInternal))
deferspan.End()

//執(zhí)行你的代碼.....
}

2、rpc 中 GetUserByMobile 的代碼

func(s*Logic)GetUserByMobile(context.Context,*usercenterPb.GetUserByMobileReq)(*usercenterPb.GetUserByMobileResp,error){
vo:=&usercenterPb.UserVo{
Id:1,
}
return&usercenterPb.GetUserByMobileResp{
User:vo,
},nil
}

3、mq 中 Consumer 的代碼

typeMsgBodystruct{
Carrier*propagation.HeaderCarrier
Msgstring
}

func(c*consumer)Consumer(ctxcontext.Context,data[]byte)error{
varmsgMsgBody
iferr:=json.Unmarshal(data,&msg);err!=nil{
logx.Errorf("consumererr:%v",err)
}else{
logx.Infof("consumerOneConsumer,msg:%+v",msg)

wireContext:=otel.GetTextMapPropagator().Extract(ctx,msg.Carrier)
tracer:=otel.GetTracerProvider().Tracer(trace.TraceName)
_,span :=tracer.Start(wireContext,"mq_consumer_msg",oteltrace.WithSpanKind(oteltrace.SpanKindConsumer))

deferspan.End()
}

returnnil
}

代碼詳解

1、go-zero 默認(rèn)集成

當(dāng)一個(gè)請(qǐng)求進(jìn)入 api 后,我們可以在 go-zero 源碼中查看到 https://github.com/zeromicro/go-zero/blob/master/rest/engine.go#L92。go-zero 已經(jīng)在 api 的 middleware 中幫我們添加了第一層 trace,當(dāng)進(jìn)入 Login 方法內(nèi),我們調(diào)用了 rpc 的 GetUserByMobile 方法,通過(guò) go-zero 的源碼 https://github.com/zeromicro/go-zero/blob/master/zrpc/internal/rpcserver.go#L55 可以看到在 rpc 的 interceptor 也默認(rèn)幫我們添加好了,這兩層都是 go-zero 默認(rèn)幫我們做好的。

2、本地方法

當(dāng)調(diào)用完 rpc 的 GetUserByMobile 之后,api 調(diào)用了本地的 local,如果我們想在整個(gè)鏈路上體現(xiàn)出來(lái)調(diào)用了本地 local 方法,那默認(rèn)的 go-zero 是沒(méi)有幫我們做的,需要我們手動(dòng)來(lái)添加。

tracer:=otel.GetTracerProvider().Tracer(trace.TraceName)
_,span :=tracer.Start(l.ctx,"local",oteltrace.WithSpanKind(oteltrace.SpanKindInternal))
deferspan.End()

//執(zhí)行你的代碼.....

我們通過(guò)上面代碼拿到 tracer,ctx 之后開(kāi)啟一個(gè) local 的 span,因?yàn)?start 時(shí)候會(huì)從 ctx 獲取父 span 所以會(huì)將 local 方法與 Login 串聯(lián)起父子調(diào)用關(guān)系,這樣就將本次操作加入了這個(gè)鏈路

3、mq 的 producer 到 mq 的 consumer

我們?cè)趍q傳遞中如何串聯(lián)起來(lái)這個(gè)鏈路呢?也就是形成 api.Login->api.producer->mq.Consumer。

想一下原理,雖然跨越了網(wǎng)絡(luò),api 可以通過(guò) header 傳遞,rpc 可以通過(guò) metadata 傳遞,那么 mq 是不是也可以通過(guò) header、body 傳遞就可以了,按照這個(gè)想法來(lái)看下我門(mén)的代碼。

tracer:=otel.GetTracerProvider().Tracer(trace.TraceName)
spanCtx,span :=tracer.Start(l.ctx,"send_msg_mq",oteltrace.WithSpanKind(oteltrace.SpanKindProducer))
carrier:=&propagation.HeaderCarrier{}
otel.GetTextMapPropagator().Inject(spanCtx,carrier)

producer:=rabbit.NewRabbitmqPublisher(RabbitmqDNS)
msg:=&MsgBody{
Carrier:carrier,
Msg:req.Mobile,
}
b,err:=json.Marshal(msg)
iferr!=nil{
panic(err)
}

iferr:=producer.Publish(spanCtx,ExchangeName,RoutineKeys,b);err!=nil{
logx.Errorf("PublishFail,msg:%s,err:%v",msg,err)
}
span.End()

首先獲取到了這個(gè)全局的 tracer,然后開(kāi)啟一個(gè) producerspan,跟 local 方法一樣,我們開(kāi)啟 producerspan 時(shí)候也是通過(guò) ctx 獲取到上一級(jí)父級(jí) span,這樣就可以將 producerspanLogin 形成父子 span 調(diào)用關(guān)系,那我們想將 producerspan 與 mq 的 consumer 中的 span 形成調(diào)用父子關(guān)系怎么做?我們將 api.producerspanCtx 注入到 carrier 中,這里我們通過(guò) mq 的 bodycarrier 發(fā)送給 consumer,發(fā)送完成我們 stop 我們的 producer,那么 producer 的這層鏈路完成了。

隨后我們來(lái)看 mq-consumer 在接收到 body 消息之后怎么做的。

typeMsgBodystruct{
Carrier*propagation.HeaderCarrier
Msgstring
}

func(c*consumer)Consumer(ctxcontext.Context,data[]byte)error{
varmsgMsgBody
iferr:=json.Unmarshal(data,&msg);err!=nil{
logx.Errorf("consumererr:%v",err)
}else{
logx.Infof("consumerOneConsumer,msg:%+v",msg)

wireContext:=otel.GetTextMapPropagator().Extract(ctx,msg.Carrier)
tracer:=otel.GetTracerProvider().Tracer(trace.TraceName)
_,span :=tracer.Start(wireContext,"mq_consumer_msg",oteltrace.WithSpanKind(oteltrace.SpanKindConsumer))

deferspan.End()
}

returnnil
}

consumer 接收到消息后反序列化出來(lái) Carrier *propagation.HeaderCarrier,然后通過(guò) otel.GetTextMapPropagator().Extract 取出來(lái) api.producer 注入的 wireContext,在通過(guò) tracer.Start、wireContext 創(chuàng)建 consumerspan,這樣 consumer 就是 api.producer 的子 span,就形成了調(diào)用鏈路關(guān)系,最終我們得到的關(guān)系就是

4ae48258-813f-11ed-8abf-dac502259ad0.pngapi.Login -> rpc.GetUserByMobile

讓我們來(lái)調(diào)用一下 Logic 方法,看下 jaeger 中的鏈路如果與我們預(yù)想的鏈路一致,so happy~

4b64a802-813f-11ed-8abf-dac502259ad0.jpg

項(xiàng)目地址

go-zero 微服務(wù)框架:https://github.com/zeromicro/go-zero

go-zero 微服務(wù)最佳實(shí)踐項(xiàng)目:https://github.com/Mikaelemmmm/go-zero-looklook

歡迎使用 go-zerostar 支持我們!

審核編輯 :李倩


聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • Go
    Go
    +關(guān)注

    關(guān)注

    0

    文章

    45

    瀏覽量

    12393
  • 微服務(wù)
    +關(guān)注

    關(guān)注

    0

    文章

    145

    瀏覽量

    7742

原文標(biāo)題:玩轉(zhuǎn) Go 鏈路追蹤

文章出處:【微信號(hào):OSC開(kāi)源社區(qū),微信公眾號(hào):OSC開(kāi)源社區(qū)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    資產(chǎn)追蹤與室內(nèi)導(dǎo)航

    在數(shù)字化轉(zhuǎn)型的浪潮中,資產(chǎn)追蹤與室內(nèi)導(dǎo)航作為兩項(xiàng)關(guān)鍵技術(shù),正在改變企業(yè)管理空間和資源的方式。從醫(yī)院高效管理醫(yī)療設(shè)備,到商場(chǎng)為顧客提供無(wú)縫導(dǎo)航體驗(yàn),這兩項(xiàng)技術(shù)在提升效率、降低成本和優(yōu)化用戶體驗(yàn)方
    的頭像 發(fā)表于 07-04 18:22 ?146次閱讀

    【開(kāi)源分享】:開(kāi)源小巧的FPGA開(kāi)發(fā)板——Icepi Zero

    核心芯片設(shè)計(jì)一款滿足工業(yè)和音視頻等領(lǐng)域的FPGA開(kāi)發(fā)板,配套數(shù)十套原始開(kāi)發(fā)案例、開(kāi)源所有原理圖及PCB文件。 Icepi Zero - 便攜式 FPGA 開(kāi)發(fā)板。 什么是 Icepi Zero
    發(fā)表于 06-09 14:01

    兩個(gè)關(guān)于PMG1 PoR的問(wèn)題求解

    我有兩個(gè)關(guān)于 PMG1 PoR 的問(wèn)題。 1.復(fù)位時(shí)POWER_DRILL2GO什么時(shí)候進(jìn)入? 也許您想在電壓低于預(yù)設(shè)值時(shí)強(qiáng)制 EZ-PD? PMG1-S1 MCU 設(shè)備復(fù)位
    發(fā)表于 05-23 07:07

    用 樹(shù)莓派 Zero 打造的智能漫游車!

    使用PXFMini和樹(shù)莓派Zero打造您自己的自主漫游車。本項(xiàng)目所用組件硬件組件ErleRoboticsPXFmini×1樹(shù)莓派Zero×1樹(shù)莓派2ModelB×1樹(shù)莓派3ModelB×1軟件應(yīng)用與在線服務(wù)APM飛行
    的頭像 發(fā)表于 05-13 16:39 ?436次閱讀
    用 樹(shù)莓派 <b class='flag-5'>Zero</b> 打造的智能漫游車!

    適合于藥品追溯智能一體機(jī)的工控主板

    在醫(yī)藥行業(yè)中,藥品的管理與追溯尤為重要。隨著技術(shù)的不斷進(jìn)步,藥品追溯智能一體機(jī)應(yīng)運(yùn)而生,成為藥品高效管理的得力助手。藥品追溯智能一體機(jī)?是一種集成化的設(shè)備,主要用于生成、管理和查詢藥品的追溯
    的頭像 發(fā)表于 01-23 10:10 ?425次閱讀
    適合于藥品<b class='flag-5'>追溯</b>智能一體機(jī)的工控主板

    RFID電子標(biāo)簽在石油鉆桿追溯管理中的應(yīng)用

    上海岳冉RFID技術(shù)在石油鉆桿追溯管理中的應(yīng)用,研發(fā)針對(duì)金屬工具高溫工作環(huán)境的RFID耐高溫標(biāo)簽。該標(biāo)簽?zāi)軌蚵袢脬@桿接頭孔中,實(shí)現(xiàn)對(duì)每根鉆桿的精確追蹤和管理。
    的頭像 發(fā)表于 01-13 16:18 ?645次閱讀

    智譜推出深度推理模型GLM-Zero預(yù)覽版

    近日,智譜公司正式發(fā)布了其深度推理模型GLM-Zero的預(yù)覽版——GLM-Zero-Preview。這款模型標(biāo)志著智譜在擴(kuò)展強(qiáng)化學(xué)習(xí)技術(shù)訓(xùn)練推理模型方面的重大突破,成為其首個(gè)專注于增強(qiáng)AI推理能力
    的頭像 發(fā)表于 01-03 10:42 ?506次閱讀

    智譜GLM-Zero深度推理模型預(yù)覽版正式上線

    近日,智譜公司宣布其深度推理模型GLM-Zero的初代版本——GLM-Zero-Preview已正式上線。這款模型是智譜首個(gè)基于擴(kuò)展強(qiáng)化學(xué)習(xí)技術(shù)訓(xùn)練的推理模型,標(biāo)志著智譜在AI推理領(lǐng)域邁出了重要一步
    的頭像 發(fā)表于 01-02 10:55 ?521次閱讀

    ?Banana Pi BPi-M4 Zero 開(kāi)源硬件開(kāi)發(fā)板評(píng)測(cè)試: 全志科技H618 方案設(shè)計(jì)

    Banana Pi 推出了全志 H618 開(kāi)發(fā)系統(tǒng)的第二個(gè)版本,標(biāo)記為 V2.0,名稱為 BPi-M4 Zero,采用 Raspberry Pi Zero 格式。不久前,我們寫(xiě)過(guò)BPi-M4
    的頭像 發(fā)表于 12-03 17:58 ?1799次閱讀
    ?Banana Pi BPi-M4 <b class='flag-5'>Zero</b> 開(kāi)源硬件開(kāi)發(fā)板評(píng)測(cè)試: 全志科技H618 方案設(shè)計(jì)

    在學(xué)習(xí)go語(yǔ)言的過(guò)程踩過(guò)的坑

    作為一個(gè)5年的phper,這兩年公司和個(gè)人都在順應(yīng)技術(shù)趨勢(shì),新項(xiàng)目慢慢從php轉(zhuǎn)向了go語(yǔ)言,從2021年到現(xiàn)在,筆者手上也先后開(kāi)發(fā)了兩個(gè)go項(xiàng)目。在學(xué)習(xí)go語(yǔ)言的過(guò)程中也學(xué)習(xí)并總結(jié)了一些相關(guān)的東西,這篇文章就分享下自己踩過(guò)的一
    的頭像 發(fā)表于 11-11 09:22 ?469次閱讀

    go語(yǔ)言如何解決并發(fā)問(wèn)題

    作為一個(gè)后端開(kāi)發(fā),日常工作中接觸最多的兩門(mén)語(yǔ)言就是PHP和GO了。無(wú)可否認(rèn),PHP確實(shí)是最好的語(yǔ)言(手動(dòng)狗頭哈哈),寫(xiě)起來(lái)真的很舒爽,沒(méi)有任何心智負(fù)擔(dān),字符串和整型壓根就不用區(qū)分,開(kāi)發(fā)速度真的是比
    的頭像 發(fā)表于 10-23 13:38 ?508次閱讀
    <b class='flag-5'>go</b>語(yǔ)言如何解決并發(fā)問(wèn)題

    羅克韋爾與Circulor強(qiáng)化汽車輪胎電池行業(yè)供應(yīng)鏈追溯能力

    全球工業(yè)自動(dòng)化、信息化及數(shù)字化轉(zhuǎn)型的佼佼者羅克韋爾自動(dòng)化(NYSE: ROK)宣布與供應(yīng)鏈可追溯性解決方案的領(lǐng)軍者Circulor攜手合作。此番聯(lián)手旨在助力客戶達(dá)成原材料從源頭至最終產(chǎn)品的全程追蹤,強(qiáng)化供應(yīng)鏈透明度,并推動(dòng)更可持續(xù)的商業(yè)操作。
    的頭像 發(fā)表于 10-16 17:42 ?928次閱讀

    關(guān)于 PCM5122 zero data detect寄存器配置疑問(wèn),求助解答

    請(qǐng)問(wèn)PCM5122的zero Data Detect這里寄存器Bit:0,Bit:1,Bit:2三個(gè)都配置成0 如下圖所示,對(duì)使用有沒(méi)有什么其他的注意事項(xiàng),會(huì)不會(huì)帶來(lái)其他風(fēng)險(xiǎn)。 期待您的回復(fù),感謝
    發(fā)表于 10-09 09:00

    如何遠(yuǎn)離網(wǎng)絡(luò)追蹤

    ?隨著科技不斷發(fā)展,生活、工作等都離不開(kāi)網(wǎng)絡(luò)。但網(wǎng)絡(luò)追蹤技術(shù)也隨著科技的進(jìn)步不斷發(fā)展,人們?cè)诰W(wǎng)絡(luò)上的在線活動(dòng)越來(lái)越容易被追蹤和監(jiān)控。這會(huì)威脅到個(gè)人隱私、信息泄露、身份盜竊等嚴(yán)重后果。所以,今天我想
    的頭像 發(fā)表于 09-03 16:57 ?1118次閱讀
    如何遠(yuǎn)離網(wǎng)絡(luò)<b class='flag-5'>追蹤</b>

    三十分鐘入門(mén)基礎(chǔ)Go Java小子版

    前言 Go語(yǔ)言定義 Go(又稱 Golang)是 Google 的 Robert Griesemer,Rob Pike 及 Ken Thompson 開(kāi)發(fā)的一種靜態(tài)、強(qiáng)類型、編譯型語(yǔ)言。Go 語(yǔ)言
    的頭像 發(fā)表于 08-12 14:32 ?983次閱讀
    三十分鐘入門(mén)基礎(chǔ)<b class='flag-5'>Go</b> Java小子版