如何实现go-micro服务集成链路跟踪及其中间件工作原理?
- 内容介绍
- 文章标签
- 相关推荐
本文共计593个文字,预计阅读时间需要3分钟。
最近几天有个同学想了解如何在go-micro中实现链路跟踪。这几天正好看到了wrapper这个模块,这个模块在一些框架中也被称为中间件。其中有一个opentracing的插件,非常适合用来做链路跟踪。
前几天有个同学想了解下如何在go-micro中做链路跟踪,这几天正好看到wrapper这块,wrapper这个东西在某些框架中也称为中间件,里边有个opentracing的插件,正好用来做链路追踪。opentracing是个规范,还需要搭配一个具体的实现,比如zipkin、jeager等,这里选择zipkin。
链路跟踪实战 安装zipkin通过docker快速启动一个zipkin服务端:
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中实现链路跟踪。这几天正好看到了wrapper这个模块,这个模块在一些框架中也被称为中间件。其中有一个opentracing的插件,非常适合用来做链路跟踪。
前几天有个同学想了解下如何在go-micro中做链路跟踪,这几天正好看到wrapper这块,wrapper这个东西在某些框架中也称为中间件,里边有个opentracing的插件,正好用来做链路追踪。opentracing是个规范,还需要搭配一个具体的实现,比如zipkin、jeager等,这里选择zipkin。
链路跟踪实战 安装zipkin通过docker快速启动一个zipkin服务端:
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
收获更多架构知识,请关注微信公众号 萤火架构。原创内容,转载请注明出处。

