通过前面N篇博文的介绍,我们其实已经能够利用它们搭建一个基本的微服务架构体系来实现我们的业务需求。但是随着业务的发展,我们系统的规模会越来越大,微服务之间的调用关系也会越来越复杂。通常一个客户端发起的请求,会通过后台系统中多个不同的微服务调用,共同产生最好的请求结果。在一个复杂的微服务架构系统中,几乎每个前端请求都会形成一个复杂的分布式服务调用链路,每个链路中任何一个依赖服务的任何延迟或错误都可能导致请求***失败。这时候跟踪每个请求的全链路调用就变得越来越重要了。通过跟踪请求调用,可以帮助我们快速找到错误根源,监控分析各个请求环节上的性能瓶颈。SpringCloudSleuth为上述分布式服务跟踪问题提供了完整的解决方案。在本章中,我们将详细介绍如何使用SpringCloudSleuth为我们的微服务架构添加分布式服务跟踪功能。快速入门在介绍各种概念和原理之前,先来实现一个简单的例子,在应用中添加一些sleuth配置,调用服务,实现基本的服务跟踪功能,从而对SpringCloudSleuth有一个初步的了解,然后逐步展开到介绍实施过程中的各种细节。准备工作在介绍Sleuth之前,我们首先根据前面章节学习的内容做一些准备工作,搭建一些基础设施和应用:服务注册中心:eureka-server,这里不做赘述,直接使用之前搭建的工程。或者直接使用我的公益eureka注册中心,在下面的例子中使用。微服务应用:trace-1实现了一个REST接口/trace-1,调用该接口后会触发对trace-2应用的调用。具体实现如下:创建一个基础的SpringBoot应用,在pom.xml中添加下面依赖:org.springframework.bootspring-boot-starter-parent1.5.10.RELEASEorg.springframework.bootspring-boot-starter-weborg.springframework.cloudspring-cloud-starter-eurekaorg.springframework.cloudspring-cloud-starter-ribbonorg.springframework.cloudspring-cloud-dependencies依赖关系artifactId>Dalston.SR5pomimport创建应用主类,实现/trace-1接口,使用RestTemplate调用trace-2应用界面具体如下:@RestController@EnableDiscoveryClient@SpringBootApplicationpublicclassTraceApplication{privatefinalLoggerlogger=Logger.getLogger(getClass());@Bean@LoadBalancedRestTemplaterestTemplate(){returnnewRestTemplate();}@RequestMapping(value="/trace-1",method=RequestMethod.GET)publicStringtrace(){logger.info("===calltrace-1===");returnrestTemplate().getForEntity("http://trace-2/trace-2",String.class)。getBody();}publicstaticvoidmain(String[]args){SpringApplication.run(TraceApplication.class,args);}}在application.properties中,将eureka.client.serviceUrl.defaultZone参数指向eureka-server地址,如下:弹簧.应用程序。name=trace-1server.port=9101eureka.client.serviceUrl.defaultZone=http://eureka.didispace.com/eureka/微服务应用:trace-2,实现一个REST接口/trace-2,供trace-1调用。具体实现如下:创建一个基本的SpringBoot应用。pom.xml中的依赖和trace-1一样创建主应用类,实现/trace-2接口。具体实现如下:@RestController@EnableDiscoveryClient@SpringBootApplicationpublicclassTraceApplication{privatefinalLoggerlogger=Logger.getLogger(getClass());@RequestMapping(value="/trace-2",method=RequestMethod.GET)publicStringtrace(){logger.info("======");return"Trace";}publicstaticvoidmain(String[]args){SpringApplication.run(TraceApplication.class,args);}}在application.properties中,指向eureka.client.serviceUrl.defaultZone参数为eureka-server地址,还需要设置不同的应用名和端口号,如下:spring.application.name=trace-2server.port=9102eureka.client.serviceUrl.defaultZone=http://eureka.didispace.com/eureka/实现以上内容后,我们就可以启动eureka-server、trace-1、trace-2这三个应用,使用postman或curl等工具发送请求trace-1接口http://localhost:9101/trace-1,我们可以得到返回值Trace,也可以得到在他们的控制台中输出以下内容:--trace-1INFO25272---[nio-9101-exec-2]ication$$EnhancerBySpringCGLIB$$36e12c68:======准备工作完成后,接下来,我们将开始本章的主题,在上面的trace-1和trace-2中添加服务跟踪功能。通过SpringCloudSleuth的封装,为应用添加服务跟踪能力的操作非常简单,只需要在trace-1的pom.xml依赖管理中添加spring-cloud-starter-sleuth依赖即可,如下:org.springframework.cloudspring-cloud-starter-sleuth到这里,其实我们已经做好了trace-1和trace-2实现服务跟踪。重启trace-1和trace-2后,trace-1接口向http://localhost:9101/trace-1发送请求。此时,我们可以从他们的控制台输出中窥探到一些侦探的线索。--trace-1INFO[trace-1,f410ab57afd5c145,a9f2118fa2019684,false]25028---[nio-9101-exec-1]ication$$EnhancerBySpringCGLIB$$d8228493:======--trace-2INFO[trace-2,f410ab57afd5c145,e9a377dc2268bc29,false]23112---[nio-9102-exec-1]ication$$EnhancerBySpringCGLIB$$e6cb4078:======ControlfromaboveIn中在平台的输出内容中,我们可以看到更多的日志信息,形式为[trace-1,f410ab57afd5c145,a9f2118fa2019684,false],这些元素是实现分布式服务跟踪的重要组成部分,每个值的含义为如下:第一个值:trace-1,记录了应用的名称,即application.properties中spring.application.name参数配置的属性。第二个值:f410ab57afd5c145,是SpringCloudSleuth生成的ID,称为TraceID,用于标识一个请求链接。一个请求链接包含一个TraceID和多个SpanID。第三个值:a9f2118fa2019684,是SpringCloudSleuth生成的另一个ID,叫做SpanID,代表一个基本的工作单元,比如发送一个HTTP请求。第四个值:false,表示是否将信息输出给Zipkin等服务收集展示。以上四个值中的TraceID和SpanID是SpringCloudSleuth实现分布式服务跟踪的核心。在调用一个服务请求链接的过程中,会保留并传递相同的TraceID,从而串联起分布在不同微服务进程中的整个请求跟踪信息。以上面的输出为例,trace-1和trace-2属于同一个前端服务请求源,所以它们的TraceID相同,处于同一个请求链接中。本文完整示例:读者可以根据自己的喜好选择以下两个仓库查看trace-1和trace-2:GithubGitee这里,阅读更多本作者的好文章