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

相关文章

【区块链 + 人才服务】可信教育区块链治理系统 | FISCO BCOS应用案例

伴随着区块链技术的不断完善,其在教育信息化中的应用也在持续发展。利用区块链数据共识、不可篡改的特性, 将与教育相关的数据要素在区块链上进行存证确权,在确保数据可信的前提下,促进教育的公平、透明、开放,为教育教学质量提升赋能,实现教育数据的安全共享、高等教育体系的智慧治理。 可信教育区块链治理系统的顶层治理架构由教育部、高校、企业、学生等多方角色共同参与建设、维护,支撑教育资源共享、教学质量评估、

【区块链 + 人才服务】区块链集成开发平台 | FISCO BCOS应用案例

随着区块链技术的快速发展,越来越多的企业开始将其应用于实际业务中。然而,区块链技术的专业性使得其集成开发成为一项挑战。针对此,广东中创智慧科技有限公司基于国产开源联盟链 FISCO BCOS 推出了区块链集成开发平台。该平台基于区块链技术,提供一套全面的区块链开发工具和开发环境,支持开发者快速开发和部署区块链应用。此外,该平台还可以提供一套全面的区块链开发教程和文档,帮助开发者快速上手区块链开发。

Go Playground 在线编程环境

For all examples in this and the next chapter, we will use Go Playground. Go Playground represents a web service that can run programs written in Go. It can be opened in a web browser using the follow

go基础知识归纳总结

无缓冲的 channel 和有缓冲的 channel 的区别? 在 Go 语言中,channel 是用来在 goroutines 之间传递数据的主要机制。它们有两种类型:无缓冲的 channel 和有缓冲的 channel。 无缓冲的 channel 行为:无缓冲的 channel 是一种同步的通信方式,发送和接收必须同时发生。如果一个 goroutine 试图通过无缓冲 channel

如何确定 Go 语言中 HTTP 连接池的最佳参数?

确定 Go 语言中 HTTP 连接池的最佳参数可以通过以下几种方式: 一、分析应用场景和需求 并发请求量: 确定应用程序在特定时间段内可能同时发起的 HTTP 请求数量。如果并发请求量很高,需要设置较大的连接池参数以满足需求。例如,对于一个高并发的 Web 服务,可能同时有数百个请求在处理,此时需要较大的连接池大小。可以通过压力测试工具模拟高并发场景,观察系统在不同并发请求下的性能表现,从而

【Shiro】Shiro 的学习教程(三)之 SpringBoot 集成 Shiro

目录 1、环境准备2、引入 Shiro3、实现认证、退出3.1、使用死数据实现3.2、引入数据库,添加注册功能后端代码前端代码 3.3、MD5、Salt 的认证流程 4.、实现授权4.1、基于角色授权4.2、基于资源授权 5、引入缓存5.1、EhCache 实现缓存5.2、集成 Redis 实现 Shiro 缓存 1、环境准备 新建一个 SpringBoot 工程,引入依赖:

【Go】go连接clickhouse使用TCP协议

离开你是傻是对是错 是看破是软弱 这结果是爱是恨或者是什么 如果是种解脱 怎么会还有眷恋在我心窝 那么爱你为什么                      🎵 黄品源/莫文蔚《那么爱你为什么》 package mainimport ("context""fmt""log""time""github.com/ClickHouse/clickhouse-go/v2")func main(

系统架构师-ERP+集成

ERP   集成平台end:就懒得画新的页

基于SpringBoot的宠物服务系统+uniapp小程序+LW参考示例

系列文章目录 1.基于SSM的洗衣房管理系统+原生微信小程序+LW参考示例 2.基于SpringBoot的宠物摄影网站管理系统+LW参考示例 3.基于SpringBoot+Vue的企业人事管理系统+LW参考示例 4.基于SSM的高校实验室管理系统+LW参考示例 5.基于SpringBoot的二手数码回收系统+原生微信小程序+LW参考示例 6.基于SSM的民宿预订管理系统+LW参考示例 7.基于

Spring Boot集成Tess4J实现OCR

1.什么是Tess4j? Tesseract是一个开源的光学字符识别(OCR)引擎,它可以将图像中的文字转换为计算机可读的文本。支持多种语言和书面语言,并且可以在命令行中执行。它是一个流行的开源OCR工具,可以在许多不同的操作系统上运行。Tess4J是一个基于Tesseract OCR引擎的Java接口,可以用来识别图像中的文本,说白了,就是封装了它的API,让Java可以直接调用。 Tess