国产精品久久久aaaa,日日干夜夜操天天插,亚洲乱熟女香蕉一区二区三区少妇,99精品国产高清一区二区三区,国产成人精品一区二区色戒,久久久国产精品成人免费,亚洲精品毛片久久久久,99久久婷婷国产综合精品电影,国产一区二区三区任你鲁

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

關于go-zero如何追蹤的原理追溯

OSC開源社區 ? 來源:OSC開源社區 ? 2022-12-22 10:35 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

前言

鏈路追蹤是每個微服務架構下必備的利器,go-zero 當然早已經為我們考慮好了,只需要在配置中添加配置即可使用。

關于 go-zero 如何追蹤的原理追溯,之前已經有同學分享,這里我就不再多說,如果有想了解的同學去 https://mp.weixin.qq.com/s/hJEWcWc3PnGfWfbPCHfM9g 這個鏈接看就好了。默認會在 api 的中間件與 rpc 的 interceptor 添加追蹤,如果有不了解 go-zero 默認如何使用默認的鏈路追蹤的,請移步我的開源項目 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 默認在 api 的 middleware 與 rpc 的 interceptor 中幫我們集成好的鏈路追蹤,我們想自己在某些本地方法添加鏈路追蹤代碼或者我們想在 api 發送一個消息給 mq 服務時候想把整個鏈路包含 mq 的 producer、consumer 穿起來,在 go-zero 中該如何做。

場景

我們先簡單講一下我們的小 demo 的場景,一個請求進來調用 api 的 Login 方法,在 Login 方法中先調用 rpc 的 GetUserByMobile 方法,之后在調用 api 本地的 local 方法,緊接著調用 rabbitmq 傳遞消息到 mq 服務。

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

我們希望看到的鏈路是

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

也就是 api 衍生出來三條子鏈路,api.producerMq 有一條調用 mq.Consumer 的子鏈路。

我們想要將一個方法添加到鏈路中需要兩個因素,一個 traceId,一個span,當我們在同一個 traceId 下開啟 span 把相關的 span 都串聯起來,如果想形成父子關系,就要把 span 之間相互串聯起來,因為「微服務實踐」公眾號中講解原理太多,我這里就簡單提一下不涉及過多,如果不是特別熟悉原理可以看文章開頭推薦的文章,這里我們只需要知道 traceIdspanId 關系就好。

核心業務代碼

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()

//執行你的代碼.....
}

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 默認集成

當一個請求進入 api 后,我們可以在 go-zero 源碼中查看到 https://github.com/zeromicro/go-zero/blob/master/rest/engine.go#L92。go-zero 已經在 api 的 middleware 中幫我們添加了第一層 trace,當進入 Login 方法內,我們調用了 rpc 的 GetUserByMobile 方法,通過 go-zero 的源碼 https://github.com/zeromicro/go-zero/blob/master/zrpc/internal/rpcserver.go#L55 可以看到在 rpc 的 interceptor 也默認幫我們添加好了,這兩層都是 go-zero 默認幫我們做好的。

2、本地方法

當調用完 rpc 的 GetUserByMobile 之后,api 調用了本地的 local,如果我們想在整個鏈路上體現出來調用了本地 local 方法,那默認的 go-zero 是沒有幫我們做的,需要我們手動來添加。

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

//執行你的代碼.....

我們通過上面代碼拿到 tracer,ctx 之后開啟一個 local 的 span,因為 start 時候會從 ctx 獲取父 span 所以會將 local 方法與 Login 串聯起父子調用關系,這樣就將本次操作加入了這個鏈路

3、mq 的 producer 到 mq 的 consumer

我們在mq傳遞中如何串聯起來這個鏈路呢?也就是形成 api.Login->api.producer->mq.Consumer

想一下原理,雖然跨越了網絡,api 可以通過 header 傳遞,rpc 可以通過 metadata 傳遞,那么 mq 是不是也可以通過 headerbody 傳遞就可以了,按照這個想法來看下我門的代碼。

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()

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

隨后我們來看 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 接收到消息后反序列化出來 Carrier *propagation.HeaderCarrier,然后通過 otel.GetTextMapPropagator().Extract 取出來 api.producer 注入的 wireContext,在通過 tracer.StartwireContext 創建 consumerspan,這樣 consumer 就是 api.producer 的子 span,就形成了調用鏈路關系,最終我們得到的關系就是

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

讓我們來調用一下 Logic 方法,看下 jaeger 中的鏈路如果與我們預想的鏈路一致,so happy~

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

項目地址

go-zero 微服務框架:https://github.com/zeromicro/go-zero

go-zero 微服務最佳實踐項目:https://github.com/Mikaelemmmm/go-zero-looklook

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

審核編輯 :李倩


聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • Go
    Go
    +關注

    關注

    0

    文章

    45

    瀏覽量

    12568
  • 微服務
    +關注

    關注

    0

    文章

    150

    瀏覽量

    8102

原文標題:玩轉 Go 鏈路追蹤

文章出處:【微信號:OSC開源社區,微信公眾號:OSC開源社區】歡迎添加關注!文章轉載請注明出處。

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

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    Go 語言高并發服務設計與性能調優實戰:從萬級到百萬級并發的演進之路

    http.ListenAndServe(\":8080\", metricsMiddleware(mainHandler)) } 5.2 鏈路追蹤 1 2 3 4 5 6 7 8 9 10 go 體驗AI
    發表于 02-18 19:19

    RFID技術助力醫療試劑管理提升效率與追溯能力

    RFID技術正重塑醫療試劑管理,解決傳統人工管理效率低、誤差大的痛點。通過賦予試劑“電子身份證”,實現全流程追溯、智能倉儲、冷鏈監控和臨床使用管控,庫存準確率提升至99%以上。重慶大學附屬三峽醫院
    的頭像 發表于 01-14 14:28 ?199次閱讀
    RFID技術助力醫療試劑管理提升效率與<b class='flag-5'>追溯</b>能力

    低成本TLI4971/TLE4971電流傳感器評估套件——MS2Go與S2Go

    低成本TLI4971/TLE4971電流傳感器評估套件——MS2Go與S2Go 在電子工程師的日常工作中,電流傳感器的評估和應用是一個重要的環節。今天我們要介紹的是英飛凌(Infineon
    的頭像 發表于 12-19 16:50 ?829次閱讀

    探索TLE493D-P3XX-MS2GO 3D 2Go套件:開啟3D磁傳感器評估之旅

    探索TLE493D-P3XX-MS2GO 3D 2Go套件:開啟3D磁傳感器評估之旅 在電子工程師的日常工作中,評估和開發磁傳感器是一項常見且重要的任務。英飛凌(Infineon
    的頭像 發表于 12-18 17:15 ?811次閱讀

    半導體設備怕 “誤操作”?權限管控 + 操作追溯

    在半導體產業追求 “高精度、高安全、高產能” 的今天,權限管控 + 操作追溯已不是可選配置,而是設備資產管理的 “標配”。它既解決了行業長期存在的責任追溯難、風險防控弱等痛點,更通過數據驅動實現管理升級,為產業高質量發展筑牢安全防線。
    的頭像 發表于 12-03 10:03 ?427次閱讀
    半導體設備怕 “誤操作”?權限管控 + 操作<b class='flag-5'>追溯</b>

    目標追蹤的簡易實現:模板匹配

    一、目標追蹤和圖像識別 一般來說,提到機器視覺這個概念都會想到圖像識別,比如人臉識別、文本識別等等,目標追蹤這個概念在平時接觸的相對比較少。但實際上,目標追蹤可以理解為圖像識別的動態過程:圖像識別
    發表于 10-28 07:21

    為什么可追溯性是汽車制造的關鍵

    作者:Poornima Apte 投稿人:DigiKey 北美編輯 在汽車行業,制造是一個復雜的過程。龐大的供應商網絡根據既定協議及時運送零件進行組裝。可追溯性使所有利益相關者能夠精確追溯每個零件
    的頭像 發表于 10-02 16:18 ?1701次閱讀
    為什么可<b class='flag-5'>追溯</b>性是汽車制造的關鍵

    NFC技術如何破解電子制造領域的效率瓶頸與追溯難題

    NFC技術通過嵌入產品實現高效檢測,提升數據追溯與流程管控,解決傳統檢測中的效率低、誤差大、信息孤島等問題。
    的頭像 發表于 09-29 15:07 ?469次閱讀

    【作品合集】玄鐵BPI-CanMV-K230D-Zero開發板測評

    / 追蹤、畫中畫)) 作者:jf_07365693【BPI-CanMV-K230D-Zero開發板體驗】介紹、系統安裝、工程測試 【BPI-CanMV-K230D-Zero開發板體驗】人體關鍵點檢
    發表于 09-18 10:13

    開源Made with KiCad(134):Icepi Zero - 基于Lattice ECP5的便攜FPGA開發板

    “? Icepi Zero 是一款 Raspberry Pi Zero 尺寸的便攜式 FPGA 開發板,基于 Lattice ECP5。 ” ? Made with KiCad 系列將支持新的展示
    的頭像 發表于 07-14 11:21 ?3695次閱讀
    開源Made with KiCad(134):Icepi <b class='flag-5'>Zero</b> - 基于Lattice ECP5的便攜FPGA開發板

    資產追蹤與室內導航

    在數字化轉型的浪潮中,資產追蹤與室內導航作為兩項關鍵技術,正在改變企業管理空間和資源的方式。從醫院高效管理醫療設備,到商場為顧客提供無縫導航體驗,這兩項技術在提升效率、降低成本和優化用戶體驗方
    的頭像 發表于 07-04 18:22 ?535次閱讀

    樹莓派 Zero 2 W 是開啟智能家居生活的理想之選!

    想嘗試智能家居自動化,又不想花費太多?樹莓派Zero2W或許正是你開啟智能家居之旅所需的理想設備。小板子大潛力想打造一個智能家居?這想法超棒!一旦掌握了技巧,自動化控制燈光、插座、傳感器等設備,既有
    的頭像 發表于 06-24 16:24 ?860次閱讀
    樹莓派 <b class='flag-5'>Zero</b> 2 W 是開啟智能家居生活的理想之選!

    【開源分享】:開源小巧的FPGA開發板——Icepi Zero

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

    兩個關于PMG1 PoR的問題求解

    我有兩個關于 PMG1 PoR 的問題。 1.復位時POWER_DRILL2GO什么時候進入? 也許您想在電壓低于預設值時強制 EZ-PD? PMG1-S1 MCU 設備復位
    發表于 05-23 07:07

    用 樹莓派 Zero 打造的智能漫游車!

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