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

2024-04-16 09:52

本文主要是介绍Go微服务: go-micro集成链路追踪jaeger,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

关于链路追踪jeager的原理

  • 参考: https://blog.csdn.net/Tyro_java/article/details/137754812

核心代码演示


1 ) 概述

  • 这里接前文结构框架:https://blog.csdn.net/Tyro_java/article/details/137753232

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

package commonimport ("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 mainimport ("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            = 8090address         = 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. 注册 handlerif 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, 也没有一个明确返回的时间
    • 特别不利于排错

这篇关于Go微服务: go-micro集成链路追踪jaeger的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/908463

相关文章

Java中使用Java Mail实现邮件服务功能示例

《Java中使用JavaMail实现邮件服务功能示例》:本文主要介绍Java中使用JavaMail实现邮件服务功能的相关资料,文章还提供了一个发送邮件的示例代码,包括创建参数类、邮件类和执行结... 目录前言一、历史背景二编程、pom依赖三、API说明(一)Session (会话)(二)Message编程客

基于Go语言实现一个压测工具

《基于Go语言实现一个压测工具》这篇文章主要为大家详细介绍了基于Go语言实现一个简单的压测工具,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录整体架构通用数据处理模块Http请求响应数据处理Curl参数解析处理客户端模块Http客户端处理Grpc客户端处理Websocket客户端

Go中sync.Once源码的深度讲解

《Go中sync.Once源码的深度讲解》sync.Once是Go语言标准库中的一个同步原语,用于确保某个操作只执行一次,本文将从源码出发为大家详细介绍一下sync.Once的具体使用,x希望对大家有... 目录概念简单示例源码解读总结概念sync.Once是Go语言标准库中的一个同步原语,用于确保某个操

Java中Springboot集成Kafka实现消息发送和接收功能

《Java中Springboot集成Kafka实现消息发送和接收功能》Kafka是一个高吞吐量的分布式发布-订阅消息系统,主要用于处理大规模数据流,它由生产者、消费者、主题、分区和代理等组件构成,Ka... 目录一、Kafka 简介二、Kafka 功能三、POM依赖四、配置文件五、生产者六、消费者一、Kaf

windos server2022的配置故障转移服务的图文教程

《windosserver2022的配置故障转移服务的图文教程》本文主要介绍了windosserver2022的配置故障转移服务的图文教程,以确保服务和应用程序的连续性和可用性,文中通过图文介绍的非... 目录准备环境:步骤故障转移群集是 Windows Server 2022 中提供的一种功能,用于在多个

Go语言实现将中文转化为拼音功能

《Go语言实现将中文转化为拼音功能》这篇文章主要为大家详细介绍了Go语言中如何实现将中文转化为拼音功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 有这么一个需求:新用户入职 创建一系列账号比较麻烦,打算通过接口传入姓名进行初始化。想把姓名转化成拼音。因为有些账号即需要中文也需要英

解决systemctl reload nginx重启Nginx服务报错:Job for nginx.service invalid问题

《解决systemctlreloadnginx重启Nginx服务报错:Jobfornginx.serviceinvalid问题》文章描述了通过`systemctlstatusnginx.se... 目录systemctl reload nginx重启Nginx服务报错:Job for nginx.javas

Go语言使用Buffer实现高性能处理字节和字符

《Go语言使用Buffer实现高性能处理字节和字符》在Go中,bytes.Buffer是一个非常高效的类型,用于处理字节数据的读写操作,本文将详细介绍一下如何使用Buffer实现高性能处理字节和... 目录1. bytes.Buffer 的基本用法1.1. 创建和初始化 Buffer1.2. 使用 Writ

SpringBoot如何使用TraceId日志链路追踪

《SpringBoot如何使用TraceId日志链路追踪》文章介绍了如何使用TraceId进行日志链路追踪,通过在日志中添加TraceId关键字,可以将同一次业务调用链上的日志串起来,本文通过实例代码... 目录项目场景:实现步骤1、pom.XML 依赖2、整合logback,打印日志,logback-sp

Go Gorm 示例详解

《GoGorm示例详解》Gorm是一款高性能的GolangORM库,便于开发人员提高效率,本文介绍了Gorm的基本概念、数据库连接、基本操作(创建表、新增记录、查询记录、修改记录、删除记录)等,本... 目录1. 概念2. 数据库连接2.1 安装依赖2.2 连接数据库3. 数据库基本操作3.1 创建表(表关