通过上一篇《分布式服务跟踪(整合logstash)》,虽然我们已经能够使用ELK平台提供的强大的采集、存储、搜索等功能,但是跟踪信息的管理和跟踪使用起来变得非常方便。但是ELK平台中的数据分析维度对请求环节中各个阶段的时间延迟缺乏关注。很多时候,我们追溯请求链路的原因之一,就是为了找出整个调用链路延迟过高的瓶颈源。或者为了实现分布式系统的延迟监控等与时间消耗相关的需求,像ELK这样的日志分析系统在这个时候就显得有些无力了。对于此类问题,我们可以引入Zipkin来轻松解决。Zipkin简介Zipkin是Twitter的一个开源项目,基于GoogleDapper实现。我们可以用它来收集各个服务器上请求链接的跟踪数据,并利用它提供的RESTAPI接口来协助我们查询跟踪数据,实现分布式系统的监控程序,从而及时发现延迟增加系统。高问题,找到系统性能瓶颈的根源。除了面向开发的API接口,它还提供了方便的UI组件,帮助我们直观的搜索追踪信息,分析请求链接详情,例如:可以查询某段时间内每个用户请求的处理时间,等上图展示了Zipkin的基础架构,主要由四个核心组件组成:Collector:收集器组件,主要用于处理外部系统发来的跟踪信息,并将信息转换成内部处理的Span格式通过齐普金。支持后续的存储、分析、显示等功能。Storage:存储组件,主要处理采集器收到的跟踪信息。默认情况下,此信息存储在内存中。我们还可以修改这种存储策略,通过使用其他存储组件将跟踪信息存储在数据库中。RESTfulAPI:API组件,主要用于对外提供访问接口。例如向客户端显示跟踪信息,或者连接外部系统访问进行监控等。WebUI:UI组件,基于API组件的上层应用。通过UI组件,用户可以方便、直观地查询和分析跟踪信息。HTTPcollection在SpringCloudSleuth中自动配置了Zipkin集成,我们可以很方便的引入和使用。下面详细介绍一下Sleuth和Zipkin的基本集成过程。主要分为两步:第一步:搭建ZipkinServer创建一个基础的SpringBoot应用,命名为zipkin-server,在pom.xml中引入ZipkinServer的相关依赖,如下:org.springframework.bootspring-boot-starter-parent<版本>1.5.10.RELEASEgroupId>io.zipkin.javazipkin-serverio.zipkin.javazipkin-autoconfigure-uiorg.springframework.cloudspring-cloud-dependenciesDalston.SR5pomimport创建主应用类ZipkinApplication,并使用@EnableZipkinServer注解启动ZipkinServer,如下:@EnableZipkinServer@SpringBootApplicationpublicclassZipkinApplication{publicstaticvoidmain(String[]args){SpringApplication.run(ZipkinApplication.class,args);}}在应用程序中。在properties中做一些简单的配置,比如:设置服务端口号为9411(集成客户端时,自动配置会连接到9411端口,所以如果服务端设置端口为9411,客户端可以省略这个配置)spring.application.name=zipkin-serverserver.port=9411创建完上面的工程,我们启动它,访问http://localhost:9411/,我们可以看到Zipkin的管理页面,如下图所示:第二步:为应用引入并配置Zipkin服务在完成了ZipkinServer的搭建之后,我们需要对应用进行一些配置,将跟踪信息输出到ZipkinServer。我们以之前实现的trace-1和trace-2为例,对其进行如下修改:在trace-1和trace-2的pom.xml中引入spring-cloud-sleuth-zipkin依赖,如下图.org.springframework.cloudspring-cloud-sleuth-zipkin在trace-1和trace-2的application.properties中添加ZipkinServer的配置信息如下(如果在zip-server应用中,我们设置它的端口为9411,在本地调试,这个参数也可以不配置,因为默认值为http://localhost:9411)。spring.zipkin.base-url=http://localhost:9411测试分析至此我们已经完成了访问ZipkinServer的所有基础工作,我们可以继续启动eureka-server、trace-1和trace-2,以及然后我们做一些测试实验,对其运行机制有一些初步的了解。我们先向trace-1接口发送一些请求:http://localhost:9101/trace-1。当trace信息的最后一个值出现在log中为true时,说明trace信息将输出到ZipkinServer,所以这时候我们可以到ZipkinServer管理页面选择合适的查询条件,点击FindTraces,可以查询刚刚在日志中出现的trace信息(或者根据日志中的TraceID,在页面右上角的输入框中搜索),如下页面所示:点击trace信息下面的trace-1端点,我们还可以得到Sleuth收集到的trace信息,包括我们关注的请求耗时等。点击导航栏的Dependencies菜单,我们还可以查看系统请求链接依赖ZipkinServer基于trace信息分析生成的图:消息中间件采集SpringCloudSleuth在集成Zipkin时,不仅实现了HTTP中trace信息的采集,还实现了s通过消息中间件对跟踪信息的异步??采集进行封装。通过结合SpringCloudStream,我们可以方便的让应用客户端输出跟踪信息给消息中间件,同时Zipkin服务端从消息中间件异步消费跟踪信息。接下来,我们在之前实现的trace-1和trace-2应用以及zipkin-server服务器的基础上进行一些修改,通过消息中间件来收集trace信息。改造的内容很简单。我们只需要对项目依赖和配置文件做一些调整就可以立即实现。下面我们将详细描述客户端和服务端的改造内容:第一步:修改客户端trace-1和trace-2使trace-1和trace-2在生成trace后能够向消息中间件输出采样记录信息,除了前面介绍的spring-cloud-starter-sleuth依赖之外,还需要引入zipkin,SpringCloudStream的扩展依赖spring-cloud-sleuth-stream和基于SpringCloudStream的消息中间件binder。以RabbitMQ为例,我们可以添加如下依赖:groupId>org.springframework.cloudspring-cloud-starter-stream-rabbitapplication.properties配置中,去掉spring.zipkin.base-url参数时使用的实现HTTP方式,并根据实际部署情况添加消息中间件的相关配置,比如RabbitMQ配置信息如下:spring.rabbitmq.host=localhostspring.rabbitmq.port=5672spring.rabbitmq.username=springcloudspring。rabbitmq.password=123456第二步:修改zipkin-server服务端,使zipkin-server服务端可以从消息中间读取到软件中获取跟踪信息,我们只需要引入服务端依赖spring-clou用于收集和包装pom.xml中消息中间件的ngd-sleuth-zipkin-stream,并且为了支持具体使用的消息中间件,我们还需要引入消息中间件的binder实现。例如,以RabbitMQ为例,我们可以在依赖中添加如下内容:org.springframework.cloudspring-cloud-starter-stream-rabbitio.zipkin.javazipkin-autoconfigure-ui其中,spring-cloud-sleuth-zipkin-stream依赖是实现从消息中间件收集跟踪信息的核心包,它包括了集成消息中间件的核心依赖,zipkinserver的核心依赖,还有一些其他经常用到的依赖(例如:扩展数据存储的依赖,支持测试的依赖等),但是需要注意的是该包没有引入zipkin的前端依赖zipkin-autoconfig你的用户界面。为了方便使用,我们在这里也引用了。测试分析完成以上修改内容后,我们继续启动eureka-server、trace-1和trace-2、zipkin-server,并确保RabbitMQ也在运行中。此时我们可以在RabbitMQ的控制页面看到一个名为sleuth的exchange,这是zipkin的消息中间件collector实现默认使用的topic。***,我们使用前面的验证方式,通过多次向trace-1的接口发送请求:http://localhost:9101/trace-1,当有采样收集到的trace信息时(调试时,我们可以设置AlwaysSampler采样机制让每条trace信息都被收集起来),我们可以在RabbitMQ控制页面中发现已经向sleuthexchange发送了一条消息,我们也可以在zipkinserver的网页中搜索对应的trace信息,那么我们使用消息中间件收集跟踪信息的任务就在这里完成了。完整示例:读者可以根据自己的喜好选择以下两个仓库查看trace-1和trace-2项目:Github:https://github.com/dyc87112/SpringCloud-Learning/Gitee:https://gitee。com/didispace/SpringCloud-Learning/【本文为专栏作者“翟永超”原创稿件,转载请联系作者获得授权】点此查看该作者更多好文