背景
当前的互联网服务,底层都由大规模的分布式集群组成,不同的模块、语言、团队,数以千计的服务器,跨数据中心等。针对复杂集群问题的分析定位,我们要能理解系统的行为,需要借助一些跟踪工具。
分布式跟踪主要源自Google的论文Dapper,基于其理念有不同的实现。zipkin是Twitter开源的Dapper实现,广泛应用于分布式集群的消息、日志跟踪。
c
整体架构
使用Brave/Spring Sleuth或其他参考实现,在客户端实现流程跟踪,并在日志中记录跟踪信息。 根据采样要求,对某一个E2E的处理流程,上报给Zipkin进行分析处理。
依赖关系分析:
消息跟踪分析:
Spring Cloud实现
注意:
当前的Spring Cloud相关书籍、总结、教程等,对于分布式跟踪,如果涉及MQ,几乎都是介绍Edgware版本以前的方式:即使用spring-cloud-sleuth-zipkin-stream和@EnableZipkinStreamServer的方式。
这种方式用Spring开发人员的话说就是一个怪胎,它使用JDK方式编码Sleuth Span,与标准的Zipkin/Brave方式不兼容。在Edgware版本已经废弃,并会在F版本发布时删除。使用MQ方式,必须使用下面描述的方式,且Spring Cloud版本要升级的Edgware(当前为Edgware.SR1)。
在pom.xml中增加如下依赖:
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-zipkin</artifactId> </dependency> <dependency> <groupId>org.springframework.amqp</groupId> <artifactId>spring-rabbit</artifactId> </dependency>
在application.properties中配置MQ相关信息:
spring.rabbitmq.host=127.0.0.1 spring.rabbitmq.port=5672 spring.rabbitmq.username=xxx spring.rabbitmq.password=xxx spring.rabbitmq.virtualHost=/svr spring.zipkin.rabbitmq.queue=zipkin
spring会自动在收到http请求、调用http接口(RestTemplate、Feign等都支持)、打印日志时,自动进行分布式跟踪处理,对业务代码无感知。默认的采样率为0.1,即10%的流程消息会被上报的Zipkin当中。