如何实现go-micro服务集成链路跟踪及其中间件工作原理?

2026-05-06 04:381阅读0评论SEO基础
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计593个文字,预计阅读时间需要3分钟。

如何实现go-micro服务集成链路跟踪及其中间件工作原理?

最近几天有个同学想了解如何在go-micro中实现链路跟踪。这几天正好看到了wrapper这个模块,这个模块在一些框架中也被称为中间件。其中有一个opentracing的插件,非常适合用来做链路跟踪。

前几天有个同学想了解下如何在go-micro中做链路跟踪,这几天正好看到wrapper这块,wrapper这个东西在某些框架中也称为中间件,里边有个opentracing的插件,正好用来做链路追踪。opentracing是个规范,还需要搭配一个具体的实现,比如zipkin、jeager等,这里选择zipkin。

链路跟踪实战 安装zipkin

通过docker快速启动一个zipkin服务端:

如何实现go-micro服务集成链路跟踪及其中间件工作原理?

docker run -d -p 9411:9411 openzipkin/zipkin 程序结构

为了方便演示,这里把客户端和服务端放到了一个项目中,程序的目录结构是这样的:

  • main.go 服务端程序。
  • client/main.go 客户端程序。
  • config/config.go 程序用到的一些配置,比如服务的名称和监听端口、zipkin的访问地址等。
  • zipkin/ot-zipkin.go opentracing和zipkin相关的函数。
安装依赖包

需要安装go-micro、opentracing、zipkin相关的包:

go get go-micro.dev/v4@latest go get github.com/go-micro/plugins/v4/wrapper/trace/opentracing go get -u github.com/openzipkin-contrib/zipkin-go-opentracing 编写服务端

首先定义一个服务端业务处理程序:

type Hello struct { } func (h *Hello) Say(ctx context.Context, name *string, resp *string) error { *resp = "Hello " + *name return nil }

这个程序只有一个方法Say,输入name,返回 "Hello " + name。

然后使用go-micro编写服务端框架程序:

func main() { tracer := zipkin.GetTracer(config.SERVICE_NAME, config.SERVICE_HOST) defer zipkin.Close() tracerHandler := opentracing.NewHandlerWrapper(tracer) service := micro.NewService( micro.Name(config.SERVICE_NAME), micro.Address(config.SERVICE_HOST), micro.WrapHandler(tracerHandler), ) service.Init() micro.RegisterHandler(service.Server(), &Hello{}) if err := service.Run(); err != nil { log.Println(err) } }

这里NewService的时候除了指定服务的名称和访问地址,还通过micro.WrapHandler设置了一个用于链路跟踪的HandlerWrapper。

这个HandlerWrapper是通过go-micro的opentracing插件提供的,这个插件需要传入一个tracer。这个tracer可以通过前边安装的 zipkin-go-opentracing 包来创建,我们把创建逻辑封装在了config.go中:

func GetTracer(serviceName string, host string) opentracing.Tracer { // set up a span reporter zipkinReporter = zipkingithub.com/bosima/go-demo/tree/main/go-micro-opentracing

收获更多架构知识,请关注微信公众号 萤火架构。原创内容,转载请注明出处。

本文共计593个文字,预计阅读时间需要3分钟。

如何实现go-micro服务集成链路跟踪及其中间件工作原理?

最近几天有个同学想了解如何在go-micro中实现链路跟踪。这几天正好看到了wrapper这个模块,这个模块在一些框架中也被称为中间件。其中有一个opentracing的插件,非常适合用来做链路跟踪。

前几天有个同学想了解下如何在go-micro中做链路跟踪,这几天正好看到wrapper这块,wrapper这个东西在某些框架中也称为中间件,里边有个opentracing的插件,正好用来做链路追踪。opentracing是个规范,还需要搭配一个具体的实现,比如zipkin、jeager等,这里选择zipkin。

链路跟踪实战 安装zipkin

通过docker快速启动一个zipkin服务端:

如何实现go-micro服务集成链路跟踪及其中间件工作原理?

docker run -d -p 9411:9411 openzipkin/zipkin 程序结构

为了方便演示,这里把客户端和服务端放到了一个项目中,程序的目录结构是这样的:

  • main.go 服务端程序。
  • client/main.go 客户端程序。
  • config/config.go 程序用到的一些配置,比如服务的名称和监听端口、zipkin的访问地址等。
  • zipkin/ot-zipkin.go opentracing和zipkin相关的函数。
安装依赖包

需要安装go-micro、opentracing、zipkin相关的包:

go get go-micro.dev/v4@latest go get github.com/go-micro/plugins/v4/wrapper/trace/opentracing go get -u github.com/openzipkin-contrib/zipkin-go-opentracing 编写服务端

首先定义一个服务端业务处理程序:

type Hello struct { } func (h *Hello) Say(ctx context.Context, name *string, resp *string) error { *resp = "Hello " + *name return nil }

这个程序只有一个方法Say,输入name,返回 "Hello " + name。

然后使用go-micro编写服务端框架程序:

func main() { tracer := zipkin.GetTracer(config.SERVICE_NAME, config.SERVICE_HOST) defer zipkin.Close() tracerHandler := opentracing.NewHandlerWrapper(tracer) service := micro.NewService( micro.Name(config.SERVICE_NAME), micro.Address(config.SERVICE_HOST), micro.WrapHandler(tracerHandler), ) service.Init() micro.RegisterHandler(service.Server(), &Hello{}) if err := service.Run(); err != nil { log.Println(err) } }

这里NewService的时候除了指定服务的名称和访问地址,还通过micro.WrapHandler设置了一个用于链路跟踪的HandlerWrapper。

这个HandlerWrapper是通过go-micro的opentracing插件提供的,这个插件需要传入一个tracer。这个tracer可以通过前边安装的 zipkin-go-opentracing 包来创建,我们把创建逻辑封装在了config.go中:

func GetTracer(serviceName string, host string) opentracing.Tracer { // set up a span reporter zipkinReporter = zipkingithub.com/bosima/go-demo/tree/main/go-micro-opentracing

收获更多架构知识,请关注微信公众号 萤火架构。原创内容,转载请注明出处。