通过之前的N篇博文介绍,实际上我们已经能够通过使用它们搭建起一个基础的微服务架构系统来实现我们的业务需求了。但是,随着业务的发展,我们的系统规模也会变得越来越大,各微服务间的调用关系也变得越来越错综复杂。通常一个由客户端发起的请求在后端系统中会经过多个不同的微服务调用来协同产生最后的请求结果,在复杂的微服务架构系统中,几乎每一个前端请求都会形成一条复杂的分布式服务调用链路,在每条链路中任何一个依赖服务出现延迟过高或错误的时候都有可能引起请求最后的失败。这时候对于每个请求全链路调用的跟踪就变得越来越重要,通过实现对请求调用的跟踪可以帮助我们快速的发现错误根源以及监控分析每条请求链路上的性能瓶颈等好处。

针对上面所述的分布式服务跟踪问题,Spring Cloud Sleuth提供了一套完整的解决方案。在本章中,我们将详细介绍如何使用Spring Cloud Sleuth来为我们的微服务架构增加分布式服务跟踪的能力。

快速入门

在介绍各种概念与原理之前,我们先通过实现一个简单的示例,对存在服务调用的应用增加一些sleuth的配置实现基本的服务跟踪功能,以此来对Spring Cloud Sleuth有一个初步的了解,随后再逐步展开介绍实现过程中的各个细节部分。

准备工作

在引入Sleuth之前,我们先按照之前章节学习的内容来做一些准备工作,构建一些基础的设施和应用:

  • 服务注册中心:eureka-server,这里不做赘述,直接使用之前构建的工程。或者直接使用我的公益eureka注册中心,下面的例子使用该注册中心。

  • 微服务应用:trace-1,实现一个REST接口/trace-1,调用该接口后将触发对trace-2应用的调用。具体实现如下:

    • 创建一个基础的Spring Boot应用,在pom.xml中增加下面依赖:
<parent>    <groupId>org.springframework.boot</groupId>    <artifactId>spring-boot-starter-parent</artifactId>       <version>1.5.10.RELEASE</version>    <relativePath/> </parent><dependency>    <groupId>org.springframework.boot</groupId>       <artifactId>spring-boot-starter-web</artifactId></dependency><dependency>     <groupId>org.springframework.cloud</groupId>      <artifactId>spring-cloud-starter-eureka</artifactId></dependency><dependency>     <groupId>org.springframework.cloud</groupId>      <artifactId>spring-cloud-starter-ribbon</artifactId></dependency><dependencyManagement>       <dependencies>          <dependency>            <groupId>org.springframework.cloud</groupId>              <artifactId>spring-cloud-dependencies</artifactId>            <version>Dalston.SR5</version>            <type>pom</type>              <scope>import</scope>         </dependency>       </dependencies></dependencyManagement>
  • 创建应用主类,并实现/trace-1接口,并使用RestTemplate调用trace-2应用的接口。具体如下:
@RestController@EnableDiscoveryClient@SpringBootApplicationpublic class TraceApplication {

    private final Logger logger = Logger.getLogger(getClass());

    @Bean    @LoadBalanced    RestTemplate restTemplate() {       return new RestTemplate();    }

    @RequestMapping(value = "/trace-1", method = RequestMethod.GET)    public String trace() {        logger.info("===call trace-1===");        return restTemplate().getForEntity("http://trace-2/trace-2", String.class).getBody();    }

    public static void main(String[] args) {        SpringApplication.run(TraceApplication.class, args);    }

}
  • application.properties中将eureka.client.serviceUrl.defaultZone参数指向eureka-server的地址,具体如下:
spring.application.name=trace-1server.port=9101

eureka.client.serviceUrl.defaultZone=http://eureka.didispace.com/eureka/
  • 微服务应用:trace-2,实现一个REST接口/trace-2,供trace-1调用。具体实现如下:

    • 创建一个基础的Spring Boot应用,pom.xml中的依赖与trace-1相同

    • 创建应用主类,并实现/trace-2接口,具体实现如下:

@RestController@EnableDiscoveryClient@SpringBootApplicationpublic class TraceApplication {

    private final Logger logger = Logger.getLogger(getClass());

    @RequestMapping(value = "/trace-2", method = RequestMethod.GET)    public String trace() {       logger.info("===<call trace-2>===");        return "Trace";    }

    public static void main(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-servertrace-1trace-2三个应用都启动起来,并通过postman或curl等工具来对trace-1的接口发送请求http://localhost:9101/trace-1,我们可以得到返回值Trace,同时还能在它们的控制台中分别获得下面的输出:

-- trace-1INFO 25272 --- [nio-9101-exec-2] ication$$EnhancerBySpringCGLIB$$36e12c68 : ===<call trace-1>===

-- trace-2INFO 7136 --- [nio-9102-exec-1] ication$$EnhancerBySpringCGLIB$$52a02f0b : ===<call trace-2>===

实现跟踪

在完成了准备工作之后,接下来我们开始进行本章的主题内容,为上面的trace-1trace-2来添加服务跟踪功能。通过Spring Cloud Sleuth的封装,我们为应用增加服务跟踪能力的操作非常简单,只需要在trace-1trace-2pom.xml依赖管理中增加spring-cloud-starter-sleuth依赖即可,具体如下:

<dependency> <groupId>org.springframework.cloud</groupId>  <artifactId>spring-cloud-starter-sleuth</artifactId></dependency>

到这里,实际上我们已经为trace-1trace-2实现服务跟踪做好了基础的准备,重启trace-1trace-2后,再对trace-1的接口发送请求http://localhost:9101/trace-1。此时,我们可以从它们的控制台输出中,窥探到sleuth的一些端倪。

-- trace-1INFO [trace-1,f410ab57afd5c145,a9f2118fa2019684,false] 25028 --- [nio-9101-exec-1] ication$$EnhancerBySpringCGLIB$$d8228493 : ===<call trace-1>===

-- trace-2INFO [trace-2,f410ab57afd5c145,e9a377dc2268bc29,false] 23112 --- [nio-9102-exec-1] ication$$EnhancerBySpringCGLIB$$e6cb4078 : ===<call trace-2>===

从上面的控制台输出内容中,我们可以看到多了一些形如[trace-1,f410ab57afd5c145,a9f2118fa2019684,false]的日志信息,而这些元素正是实现分布式服务跟踪的重要组成部分,它们每个值的含义如下:

  • 第一个值:trace-1,它记录了应用的名称,也就是application.propertiesspring.application.name参数配置的属性。
  • 第二个值:f410ab57afd5c145,Spring Cloud Sleuth生成的一个ID,称为Trace ID,它用来标识一条请求链路。一条请求链路中包含一个Trace ID,多个Span ID。
  • 第三个值:a9f2118fa2019684,Spring Cloud Sleuth生成的另外一个ID,称为Span ID,它表示一个基本的工作单元,比如:发送一个HTTP请求。
  • 第四个值:false,表示是否要将该信息输出到Zipkin等服务中来收集和展示。

上面四个值中的Trace IDSpan ID是Spring Cloud Sleuth实现分布式服务跟踪的核心。在一次服务请求链路的调用过程中,会保持并传递同一个Trace ID,从而将整个分布于不同微服务进程中的请求跟踪信息串联起来,以上面输出内容为例,trace-1trace-2同属于一个前端服务请求来源,所以他们的Trace ID是相同的,处于同一条请求链路中。

本文完整示例:

读者可以根据喜好选择下面的两个仓库中查看trace-1trace-2两个项目:

  • Github
  • Gitee

如果您对这些感兴趣,欢迎star、follow、收藏、转发给予支持!

本文内容部分节选自我的《Spring Cloud微服务实战》,但对依赖的Spring Boot和Spring Cloud版本做了升级。


Spring Cloud构建微服务架构:分布式服务跟踪(入门)【Dalston版】相关推荐

  1. Spring Cloud构建微服务架构:分布式服务跟踪(整合zipkin)【Dalston版】

    通过上一篇<分布式服务跟踪(整合logstash)>,我们虽然已经能够利用ELK平台提供的收集.存储.搜索等强大功能,对跟踪信息的管理和使用已经变得非常便利.但是,在ELK平台中的数据分析 ...

  2. Spring Cloud构建微服务架构:分布式服务跟踪(整合logstash)【Dalston版】

    通过之前的<入门示例>,我们已经为两个由SpringCloud构建的微服务项目 trace-1和 trace-2引入了Spring Cloud Sleuth的基础模块 spring-clo ...

  3. Spring Cloud构建微服务架构:分布式服务跟踪(跟踪原理)

    通过上一篇<分布式服务跟踪(入门)>的例子,我们已经通过Spring Cloud Sleuth往微服务应用中添加了实现分布式跟踪具备的基本要素.下面通过本文来详细说说实现分布式服务跟踪的一 ...

  4. Spring Cloud构建微服务架构:分布式配置中心【Dalston版】

    Spring Cloud Config是Spring Cloud团队创建的一个全新项目,用来为分布式系统中的基础设施和微服务应用提供集中化的外部配置支持,它分为服务端与客户端两个部分.其中服务端也称为 ...

  5. Spring Cloud构建微服务架构:服务容错保护(Hystrix断路器)

    断路器 断路器模式源于Martin Fowler的Circuit Breaker一文."断路器"本身是一种开关装置,用于在电路上保护线路过载,当线路中有电器发生短路时," ...

  6. Spring Cloud构建微服务架构(七)消息总线(续:Kafka)

    Spring Cloud Bus除了支持RabbitMQ的自动化配置之外,还支持现在被广泛应用的Kafka.在本文中,我们将搭建一个Kafka的本地环境,并通过它来尝试使用Spring Cloud B ...

  7. Spring Cloud构建微服务架构:服务容错保护(Hystrix服务降级)【Dalston版】

    前言 在微服务架构中,我们将系统拆分成了一个个的服务单元,各单元应用间通过服务注册与订阅的方式互相依赖.由于每个单元都在不同的进程中运行,依赖通过远程调用的方式执行,这样就有可能因为网络原因或是依赖服 ...

  8. Spring Cloud构建微服务架构:服务容错保护(Hystrix依赖隔离)【Dalston版】

    前言 在上一篇<Spring Cloud构建微服务架构:服务容错保护(Hystrix服务降级)>中,我们已经体验了如何使用@HystrixCommand来为一个依赖资源定义服务降级逻辑.实 ...

  9. Spring Cloud构建微服务架构:服务容错保护(Hystrix断路器)【Dalston版】

    前言 在前两篇<Spring Cloud构建微服务架构:服务容错保护(Hystrix服务降级)>和<Spring Cloud构建微服务架构:服务容错保护(Hystrix依赖隔离)&g ...

  10. Spring Cloud构建微服务架构:Hystrix监控面板【Dalston版】

    在上一篇<服务容错保护(hystrix断路器)>的介绍中,我们提到断路器是根据一段时间窗内的请求情况来判断并操作断路器的打开和关闭状态的.而这些请求情况的指标信息都是HystrixComm ...

最新文章

  1. 镁光ssd管理工具 linux,在 SSD 上使用 Btrfs 文件系统的相关优化
  2. 译者招募 | 《Java编程思想》作者Bruce Eckel新作On Java 8
  3. python问题:IndentationError:expected an indented block错误解决
  4. short s1 = 1; s1 = s1 + 1; 有错吗?short s1 = 1; s1 += 1 有错吗
  5. C/Cpp / extern 关键字
  6. wxHtml 示例:演示虚拟文件系统功能
  7. Android--百度地图之基础地图(三)
  8. 2015年辽宁省赛Interesting Tree
  9. 9招让你皮肤迅速白嫩 - 健康程序员,至尚生活!
  10. 51nod1079中国剩余定理
  11. tp3.2 开发规范(命名规范)
  12. 【病毒分析】——熊猫烧香 专杀工具C源码
  13. 在Kubuntu14.04中安装小企鹅输入法
  14. python 开机自动切换必应壁纸
  15. mysql写了代码如何看表_mysql之单表查询__我自己敲的代码
  16. 学的计算机专业但是键盘打字非常慢怎么办,win10系统下键盘打字反应慢迟钝的解决方法...
  17. 2021年终总结--躺平的一年
  18. 1124——Vue+SpringBoot+Mybatis的简单员工管理项目
  19. 查看系统隐藏进程busyboxunhide
  20. 怎么用html制作满天星,html+js+css 实现满天星

热门文章

  1. mysql分组之后统计数量
  2. ASP.NET2.0导出Word文档(C#导出DOC)
  3. 面向对象的思想是什么?
  4. Linux 30岁了~我们也老了
  5. oracle不同session共享变量,SpringMVC使用oracle配置session共享
  6. volatile用法
  7. 计算机科学与技术 天涯,计算机科学与技术专业
  8. python基于opencv的手势识别_怎么在Python3.5 中利用OpenCV实现一个手势识别功能
  9. TQ210——S5PV210 uboot顶层mkconfig分析
  10. java常用算法分析和实现 amp,Java常用算法实现