最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

golang?鏈路追蹤的實(shí)現(xiàn)示例

 更新時間:2025年03月03日 10:39:09   作者:愛編程的 小李  
本文主要介紹了golang?鏈路追蹤的實(shí)現(xiàn)示例,包括調(diào)用鏈過長和接口響應(yīng)慢的問題,具有一定的參考價值,感興趣的可以了解一下

分布式鏈路追蹤(Distributed Tracing),也叫分布式鏈路跟蹤,分布式跟蹤,分布式追蹤等等。

問題

場景1:調(diào)用鏈過長,查詢很慢

在這里插入圖片描述

web-gin由A負(fù)責(zé),服務(wù)A由B負(fù)責(zé),某個接口出現(xiàn)異常了,先查詢?nèi)罩究词悄膫€地方出錯了,發(fā)現(xiàn)服務(wù)A調(diào)用失敗,依次找到D

場景2:接口相應(yīng)很慢

在這里插入圖片描述

解決方法

(1)打日志:慢(可能不看懂其他人寫的日志)
(2)ELK:可以解決,也是日志需要寫入
(3)第三方鏈路追蹤系統(tǒng)可以解決

鏈路追蹤系統(tǒng)技術(shù)選型

java使用zipkin和skywalking比較多,而go使用jaeger多

zipkinjaegerskywalking
OpenTracing
客戶端支持語言java、c#、php、python等java、c#、go、php、python等java、.Net Core、NodeJS、PHP、python
存儲ES、Mysql、Cassandra內(nèi)存ES、kafka、Cassandra內(nèi)存ES、H2、mysql、TIDB、shard sphere
傳輸協(xié)議支持http、MQudp/httpgRPC
ui豐富程度
實(shí)現(xiàn)方式-代碼侵入式攔截請求,侵入攔截請求,侵入字節(jié)碼注入,無侵入
擴(kuò)展性
trace查詢支持支持支持
性能損失
選擇jaeger:官方支持jaeger
技術(shù)選型原則:
客戶端支持、綜合考慮、什么語言開發(fā)的

安裝jaeger

docker run \
  --rm \
  --name jaeger \
  -p6831:6831/udp \
  -p16686:16686 \
  jaegertracing/all-in-one:latest

架構(gòu)

在這里插入圖片描述

Jaeger組成

1.Jaeger Client - 為不同語言實(shí)現(xiàn)了符合 OpenTracing 標(biāo)準(zhǔn)的 SDK。應(yīng)用程序通過 API 寫入數(shù)據(jù),client library 把 trace 信息按照應(yīng)用程序指定的采樣策略傳遞給 jaeger-agent。
2.Agent - 它是一個監(jiān)聽在 UDP 端口上接收 span 數(shù)據(jù)的網(wǎng)絡(luò)守護(hù)進(jìn)程,它會將數(shù)據(jù)批量發(fā)送給 collector。它被設(shè)計(jì)成一個基礎(chǔ)組件,部署到所有的宿主機(jī)上。Agent 將 client library 和 collector 解耦,為 client library 屏蔽了路由和發(fā)現(xiàn) collector 的細(xì)節(jié)。2.Collector - 接收 jaeger-agent 發(fā)送來的數(shù)據(jù),然后將數(shù)據(jù)寫入后端存儲。Collector 被設(shè)計(jì)成無狀態(tài)的組件,因此您可以同時運(yùn)行任意數(shù)量的 jaeger-collector。
3.Data Store - 后端存儲被設(shè)計(jì)成一個可插拔的組件,支持將數(shù)據(jù)寫入 cassandra、elastic search。
4.Query - 接收查詢請求,然后從后端存儲系統(tǒng)中檢索 trace 并通過 UI 進(jìn)行展示。 Query 是無狀態(tài)的,您可以啟動多個實(shí)例,把它們部署在 nginx 這樣的負(fù)載均衡器后面。
分布式追蹤系統(tǒng)發(fā)展很快,種類繁多,但核心步驟一般有三個:代碼埋點(diǎn),數(shù)據(jù)存儲、查詢展示訂單調(diào)用過程

在這里插入圖片描述

添加jaeger

sudo go get github.com/jaegertracing/jaeger-client-go

發(fā)送span

package main

import (
	"time"

	"github.com/uber/jaeger-client-go"
	jaegercfg "github.com/uber/jaeger-client-go/config"
)

func main() {
	cfg := jaegercfg.Configuration{
		Sampler: &jaegercfg.SamplerConfig{
			Type:  jaeger.SamplerTypeConst,
			Param: 1, //[0,1] 0不采樣1一直采樣
		},
		Reporter: &jaegercfg.ReporterConfig{
			LogSpans:           true, //打不打印日志
			LocalAgentHostPort: "192.168.31.19:6831",
		},
		ServiceName: "shop",
	}
	tracer, closer, err := cfg.NewTracer(jaegercfg.Logger(jaeger.StdLogger))
	if err != nil {
		panic(err)
	}
	defer closer.Close()
	span := tracer.StartSpan("go-grpc-web")
	time.Sleep(time.Second)
	defer span.Finish()
}

嵌套span

package main

import (
	"time"

	"github.com/opentracing/opentracing-go"
	"github.com/uber/jaeger-client-go"
	jaegercfg "github.com/uber/jaeger-client-go/config"
)

func main() {
	cfg := jaegercfg.Configuration{
		Sampler: &jaegercfg.SamplerConfig{
			Type:  jaeger.SamplerTypeConst,
			Param: 1, //[0,1] 0不采樣1一直采樣
		},
		Reporter: &jaegercfg.ReporterConfig{
			LogSpans:           true, //打不打印日志
			LocalAgentHostPort: "39.103.59.35:6831",
		},
		ServiceName: "shop",
	}
	tracer, closer, err := cfg.NewTracer(jaegercfg.Logger(jaeger.StdLogger))
	if err != nil {
		panic(err)
	}
	defer closer.Close()
	parentSpan := tracer.StartSpan("main")

	spanA := tracer.StartSpan("funcA", opentracing.ChildOf(parentSpan.Context()))
	time.Sleep(time.Millisecond * 500)
	spanA.Finish()

	spanB := tracer.StartSpan("funcB", opentracing.ChildOf(parentSpan.Context()))
	time.Sleep(time.Millisecond * 1000)
	spanB.Finish()

	parentSpan.Finish()
}

grpc使用jaeger

package main

import (
	"context"
	"fmt"
	"japter_test/proto"

	"japter_test/otgrpc"

	"github.com/opentracing/opentracing-go"
	"github.com/uber/jaeger-client-go"
	jaegercfg "github.com/uber/jaeger-client-go/config"
	"google.golang.org/grpc"
)

func main() {
	cfg := jaegercfg.Configuration{
		ServiceName: "mxshop",
		Sampler: &jaegercfg.SamplerConfig{
			Type:  jaeger.SamplerTypeConst,
			Param: 1, //[0,1] 0不采樣1一直采樣
		},
		Reporter: &jaegercfg.ReporterConfig{
			LogSpans:           true, //打不打印日志
			LocalAgentHostPort: "39.103.59.35:6831",
		},
	}
	tracer, closer, err := cfg.NewTracer(jaegercfg.Logger(jaeger.StdLogger))
	if err != nil {
		panic(err)
	}
	opentracing.SetGlobalTracer(tracer)
	defer closer.Close()

	conn, err := grpc.Dial("127.0.0.1:8080", grpc.WithInsecure(), grpc.WithUnaryInterceptor(otgrpc.OpenTracingClientInterceptor(opentracing.GlobalTracer())))
	if err != nil {
		panic(err)
	}
	defer conn.Close()
	c := proto.NewGreeterClient(conn)
	r, err := c.SayHello(context.Background(), &proto.HelloRquest{
		Name: "bobby",
	})
	if err != nil {
		panic(err)
	}
	fmt.Println(r.Message)
}

gin使用jaeger

攔截器

package middlewares

import (
	"GolangStudy/Practice/shop/goods-web/global"
	"fmt"

	"github.com/gin-gonic/gin"
	"github.com/opentracing/opentracing-go"
	"github.com/uber/jaeger-client-go"
	jaegerConfig "github.com/uber/jaeger-client-go/config"
)

func Trace() gin.HandlerFunc {
	return func(ctx *gin.Context) {
		cfg := jaegerConfig.Configuration{
			ServiceName: "your_service_name",
			Sampler: &jaegerConfig.SamplerConfig{
				Type:  jaeger.SamplerTypeConst,
				Param: 1, // 1 = always sample
			},
			Reporter: &jaegerConfig.ReporterConfig{
				LogSpans:           true,
				LocalAgentHostPort: fmt.Sprintf("%s:%d", global.ServerConfig.JaegerInfo.Host, global.ServerConfig.JaegerInfo.Port), // Jaeger Query 服務(wù)的地址和端口
			},
		}
		tracer, closer, err := cfg.NewTracer(jaegerConfig.Logger(jaeger.StdLogger))
		if err != nil {
			panic(err)
		}
		opentracing.SetGlobalTracer(tracer)
		defer closer.Close()
		startSpan := tracer.StartSpan(ctx.Request.URL.Path)
		defer startSpan.Finish()
		ctx.Set("tracer", tracer)
		ctx.Set("parentSpan", startSpan)
		ctx.Next()
	}
}

使用

GoodsRouter := Router.Group("goods").Use(middlewares.Trace())

到此這篇關(guān)于golang 鏈路追蹤的實(shí)現(xiàn)示例的文章就介紹到這了,更多相關(guān)golang 鏈路追蹤內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家! 

相關(guān)文章

  • 一文帶你了解Go語言中的類型斷言和類型轉(zhuǎn)換

    一文帶你了解Go語言中的類型斷言和類型轉(zhuǎn)換

    在Go中,類型斷言和類型轉(zhuǎn)換是一個令人困惑的事情,他們似乎都在做同樣的事情。最明顯的不同點(diǎn)是他們具有不同的語法(variable.(type)?vs?type(variable)?)。本文我們就來深入研究一下二者的區(qū)別
    2022-09-09
  • golang gc的內(nèi)部優(yōu)化詳細(xì)介紹

    golang gc的內(nèi)部優(yōu)化詳細(xì)介紹

    Go編譯器在垃圾回收(GC)的掃描標(biāo)記階段,對存儲無指針鍵值對的map進(jìn)行了優(yōu)化,即在GC掃描時不深入掃描map內(nèi)部數(shù)據(jù),只檢查map本身是否需要回收,這一優(yōu)化顯著提升了GC掃描的速度,從而減少了GC對程序性能的影響
    2024-10-10
  • golang使用map支持高并發(fā)的方法(1000萬次操作14ms)

    golang使用map支持高并發(fā)的方法(1000萬次操作14ms)

    這篇文章主要介紹了golang使用map支持高并發(fā)的方法(1000萬次操作14ms),本文給大家詳細(xì)講解,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-11-11
  • Go中strings包的基本使用示例代碼

    Go中strings包的基本使用示例代碼

    本文詳細(xì)介紹了Go語言中strings包的基本使用方法,包括字符串的前綴、后綴判斷,字符串包含、索引查找、字符串替換、計(jì)數(shù)、重復(fù)、大小寫轉(zhuǎn)換、修剪、分割、拼接以及數(shù)據(jù)類型轉(zhuǎn)換等功能,示例代碼豐富,適合初學(xué)者和需要使用字符串處理功能的開發(fā)者參考學(xué)習(xí)
    2024-10-10
  • golang coroutine 的等待與死鎖用法

    golang coroutine 的等待與死鎖用法

    這篇文章主要介紹了golang coroutine 的等待與死鎖用法詳解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-05-05
  • GoFrame框架garray并發(fā)安全數(shù)組使用開箱體驗(yàn)

    GoFrame框架garray并發(fā)安全數(shù)組使用開箱體驗(yàn)

    這篇文章主要介紹了GoFrame框架garray并發(fā)安全數(shù)組使用開箱體驗(yàn),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-06-06
  • 為什么GO不支持循環(huán)引用

    為什么GO不支持循環(huán)引用

    這篇文章主要介紹的是為什么GO不支持循環(huán)引用,學(xué)習(xí) Go 語言的開發(fā)者越來越多了,很多小伙伴在使用時,就會遇到種種不理解的問題,其中一點(diǎn)就是包的循環(huán)引用的報(bào)錯,下main文章我們一起來看看學(xué)習(xí)原因
    2021-10-10
  • Go處理PDF的實(shí)現(xiàn)代碼

    Go處理PDF的實(shí)現(xiàn)代碼

    這篇文章主要介紹了Go處理PDF的實(shí)現(xiàn)代碼,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-01-01
  • Go語言實(shí)現(xiàn)漢諾塔算法

    Go語言實(shí)現(xiàn)漢諾塔算法

    之前的文章,我們給大家分享了不少漢諾塔算法的實(shí)現(xiàn)語言,包括C、c++、java、python等,今天我們就來使用go語言來實(shí)現(xiàn)一下,需要的小伙伴來參考下吧。
    2015-03-03
  • Go語言的反射機(jī)制進(jìn)階實(shí)現(xiàn)

    Go語言的反射機(jī)制進(jìn)階實(shí)現(xiàn)

    反射是Go語言的一個強(qiáng)大特性,它允許程序在運(yùn)行時檢查和操作變量、接口和結(jié)構(gòu)體,本文就來詳細(xì)的介紹一下Go語言的反射機(jī)制的實(shí)現(xiàn),感興趣的可以了解一下
    2026-04-04

最新評論

施秉县| 双鸭山市| 元谋县| 平谷区| 安平县| 庆城县| 淮北市| 通渭县| 宁南县| 桂平市| 新龙县| 德庆县| 察隅县| 乐平市| 宝丰县| 喀喇| 淄博市| 万源市| 苍溪县| 丹巴县| 安陆市| 惠州市| 福海县| 山东| 获嘉县| 钟祥市| 四会市| 五河县| 辽阳县| 扎囊县| 水富县| 石狮市| 普格县| 布尔津县| 垫江县| 汕尾市| 乐清市| 新沂市| 墨江| 云梦县| 临澧县|