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

相关文章

Spring Boot集成/输出/日志级别控制/持久化开发实践

《SpringBoot集成/输出/日志级别控制/持久化开发实践》SpringBoot默认集成Logback,支持灵活日志级别配置(INFO/DEBUG等),输出包含时间戳、级别、类名等信息,并可通过... 目录一、日志概述1.1、Spring Boot日志简介1.2、日志框架与默认配置1.3、日志的核心作用

Apache Ignite 与 Spring Boot 集成详细指南

《ApacheIgnite与SpringBoot集成详细指南》ApacheIgnite官方指南详解如何通过SpringBootStarter扩展实现自动配置,支持厚/轻客户端模式,简化Ign... 目录 一、背景:为什么需要这个集成? 二、两种集成方式(对应两种客户端模型) 三、方式一:自动配置 Thick

OpenCV在Java中的完整集成指南分享

《OpenCV在Java中的完整集成指南分享》本文详解了在Java中集成OpenCV的方法,涵盖jar包导入、dll配置、JNI路径设置及跨平台兼容性处理,提供了图像处理、特征检测、实时视频分析等应用... 目录1. OpenCV简介与应用领域1.1 OpenCV的诞生与发展1.2 OpenCV的应用领域2

go动态限制并发数量的实现示例

《go动态限制并发数量的实现示例》本文主要介绍了Go并发控制方法,通过带缓冲通道和第三方库实现并发数量限制,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面... 目录带有缓冲大小的通道使用第三方库其他控制并发的方法因为go从语言层面支持并发,所以面试百分百会问到

Go语言并发之通知退出机制的实现

《Go语言并发之通知退出机制的实现》本文主要介绍了Go语言并发之通知退出机制的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录1、通知退出机制1.1 进程/main函数退出1.2 通过channel退出1.3 通过cont

Go语言编译环境设置教程

《Go语言编译环境设置教程》Go语言支持高并发(goroutine)、自动垃圾回收,编译为跨平台二进制文件,云原生兼容且社区活跃,开发便捷,内置测试与vet工具辅助检测错误,依赖模块化管理,提升开发效... 目录Go语言优势下载 Go  配置编译环境配置 GOPROXYIDE 设置(VS Code)一些基本

Spring Boot 与微服务入门实战详细总结

《SpringBoot与微服务入门实战详细总结》本文讲解SpringBoot框架的核心特性如快速构建、自动配置、零XML与微服务架构的定义、演进及优缺点,涵盖开发环境准备和HelloWorld实战... 目录一、Spring Boot 核心概述二、微服务架构详解1. 微服务的定义与演进2. 微服务的优缺点三

SpringBoot集成MyBatis实现SQL拦截器的实战指南

《SpringBoot集成MyBatis实现SQL拦截器的实战指南》这篇文章主要为大家详细介绍了SpringBoot集成MyBatis实现SQL拦截器的相关知识,文中的示例代码讲解详细,有需要的小伙伴... 目录一、为什么需要SQL拦截器?二、MyBATis拦截器基础2.1 核心接口:Interceptor

SpringBoot集成EasyPoi实现Excel模板导出成PDF文件

《SpringBoot集成EasyPoi实现Excel模板导出成PDF文件》在日常工作中,我们经常需要将数据导出成Excel表格或PDF文件,本文将介绍如何在SpringBoot项目中集成EasyPo... 目录前言摘要简介源代码解析应用场景案例优缺点分析类代码方法介绍测试用例小结前言在日常工作中,我们经

使用Go实现文件复制的完整流程

《使用Go实现文件复制的完整流程》本案例将实现一个实用的文件操作工具:将一个文件的内容完整复制到另一个文件中,这是文件处理中的常见任务,比如配置文件备份、日志迁移、用户上传文件转存等,文中通过代码示例... 目录案例说明涉及China编程知识点示例代码代码解析示例运行练习扩展小结案例说明我们将通过标准库 os