自学内容网 自学内容网

Go微服务: go-micro集成链路追踪jaeger

关于链路追踪jeager的原理

核心代码演示


1 ) 概述

2 )核心代码:common/jaeger.go

package common

import (
"io"
"time"

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

// 初始化Jaeger Tracer实例
func NewTracer(serviceName string, addr string) (opentracing.Tracer, io.Closer, error) {
cfg := jaegerConfig.Configuration{
ServiceName: serviceName,
Sampler: &jaegerConfig.SamplerConfig{
Type:  jaeger.SamplerTypeConst,
Param: 1, // 采样率设置为1,即100%采样
},
Reporter: &jaegerConfig.ReporterConfig{
BufferFlushInterval: 1 * time.Second,
LogSpans:            true,
LocalAgentHostPort:  addr,
},
}

return cfg.NewTracer()
}
  • 可见,这里封装了 Jaeger Tracer 的实例

2 )核心代码 main.go

package main

import (
"fmt"
"log"
"strconv"

"github.com/go-micro/plugins/v4/registry/consul"
opentracingFn "github.com/go-micro/plugins/v4/wrapper/trace/opentracing"
"github.com/opentracing/opentracing-go"
"go-micro.dev/v4"
"go-micro.dev/v4/registry"

"gitee.com/go-micro-services/product/common"
"gitee.com/go-micro-services/product/domain/repository"
"gitee.com/go-micro-services/product/domain/service"
"gitee.com/go-micro-services/product/handler"
pbproduct "gitee.com/go-micro-services/product/proto/product"

"github.com/jinzhu/gorm"
_ "github.com/jinzhu/gorm/dialects/mysql"
)

var (
serviceName     = "go.micro.service.product"
version         = "latest"
host            = "127.0.0.1"
port            = 8090
address         = host + ":" + strconv.Itoa(port)
mysqlConfigPath = "/micro/config/mysql"
)

func main() {
// 1. 指定注册中心
consulReg := consul.NewRegistry(
registry.Addrs(address),
)

// 2. 从配置中心获取mysql配置并创建处理
mysqlConfig, consulConfigErr := common.GetConsulMysqlConfig(address, mysqlConfigPath)
if consulConfigErr != nil {
log.Fatal(consulConfigErr)
}
mysqlUrl := fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?charset=utf8&parseTime=True&loc=Local", mysqlConfig.User, mysqlConfig.Pwd, mysqlConfig.Host, mysqlConfig.Port, mysqlConfig.Database)
db, dbErr := gorm.Open("mysql", mysqlUrl)
if dbErr != nil {
log.Fatal(dbErr)
}
defer db.Close()
db.SingularTable(false) // true 则 表就是单数

rp := repository.NewProductRepository(db)
// 数据库表初始化,只执行一次, 如果本来就设计好了,则无需下面
// rp.InitTable()

// 3. 链路追踪配置
tracer, closer, tracerErr := common.NewTracer("go.micro.service.product", "localhost:6831")
if tracerErr != nil {
log.Fatal(tracerErr)
}
defer closer.Close()
opentracing.SetGlobalTracer(tracer)

// 4. 创建服务实例
productDataService := service.NewProductDataService(rp)

// 5. 创建服务和初始化
srv := micro.NewService()
srv.Init(
micro.Name(serviceName),
micro.Version(version),
micro.Registry(consulReg),
micro.WrapHandler(opentracingFn.NewHandlerWrapper(opentracing.GlobalTracer())), // 绑定链路追踪
)

// 6. 注册 handler
if handlerErr := pbproduct.RegisterProductHandler(srv.Server(), &handler.Product{ProductDataService: productDataService}); handlerErr != nil {
log.Fatal(handlerErr)
}

// 7. 运行服务
if runErr := srv.Run(); runErr != nil {
log.Fatal(runErr)
}
}
  • 这里基于前文,做了稍许改动,接入了jaeger服务
  • 上面一些jaeger的配置,也可以在consul配置中心读取,这里仅做简单演示
  • 关于 jaeger 的核心代码如上,可后续作为参考

3 )相关经验参考

  • 链路追踪数据写入的过程可以加入 kafaka 缓冲压力
  • 我们可以通过链路追踪开发发现我们是否有循环调用
  • 在链路中非必要尽量避免带入异步场景的span
    • 异步场景,比如写入日志,操作数据库
    • 把这些操作加入span, 也没有一个明确返回的时间
    • 特别不利于排错

原文地址:https://blog.csdn.net/Tyro_java/article/details/137756479

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!