分布式链路追踪的基础概念
在前文所提及的几种组件中,Zipkin组件是严格按照GoogleDapper论文实现的,下面基于Zipkin介绍其中涉及的基本概念。
(1)Span(基本工作单元)
一次链路调用(可以是RPC、DB调用等,没有特定的限制)创建一个Span。通过一个64位ID标识Span,通常使用UUID,Span中还有其他的数据,例如描述信息、时间戳、键值对的(Annotation)tag信息、parentID等,其中parentID用来表示Span调用链路的来源。
实践案例:应用Zipkin追踪Go微服务
很多Go微服务框架已经封装了链路追踪模块,如Go-kit中本身就拥有Trace模块,将会在Go-kit微服务的案例中演示集成Zipkin。
微服务中集成zipkin-go
Zipkin社区提供了诸如:zipkin-go、zipkin-go-opentracing、go-zipkin等Go客户端库。本小节将会介绍如何将其中的zipkin-go-opentracing集成到微服务中。
1.应用的架构图
在集成zipkin-go的应用示例中,包括两个微服务:Service-1和Service-2,另外我们实现了一个简单的调用客户端,用以发送指定的请求。微服务和客户端调用服务都会注册到Zipkin中。应用的架构如图12-10所示。
图12-10 集成zipkin-go应用架构图
注:我们在本地启动了端口为9411的ZipkinServer(读者可以自行下载Zipkin的启动包或者使用Docker容器启动)。
2.微服务Service-1
Service-1对外提供两个接口:
- concat:字符串拼接,根据传入的两个查询字符串,将拼接后的结果返回;
- sum:数字求和,Service-1做了一层代理,将请求转发到实际进行处理的Service-2。
Service-1的入口函数如下所示:
1 |