随着微服务数量不断增长,需要跟踪一个请求从一个微服务到下一个微服务的传播过程,Spring Cloud Sleuth 正是解决这个问题,它在日志中引入唯一ID,以保证微服务调用之间的一致性,这样你就能跟踪某个请求是如何从一个微服务传递到下一个。

Spring Cloud Sleuth在日志中增加两种ID 类型, 一个是trace ID,另外一个是span ID,span ID代表工作基本单元,比如发送一个HTTP请求;treace ID包含一系列span ID,形成一个树状结构。

首先,从 start.spring.io创建一个新的Spring Boot应用,依赖于Sleuth(spring-cloud-starter-slueth),产生项目并下载代码,给你的应用取名也有助于Sleuth的跟踪。

在src/main/resources创建一个文件称为bootstrap.yml,在这个文件里加入属性spring.application.name为你取的名称,名称将作为SLeuth跟踪部分的一部分。

现在加入一些日志到应用中,打开你的应用文件,main方法所在的那个类,创建一个方法为home,返回String:

public String home() {

return "Hello World";

}

让我们使用该方法作为你的web应用的直接调用,增加@RestController在类级别,增加@RequestMapping("/")到home方法:

@SpringBootApplication

@RestController

public class SleuthSampleApplication {

public static void main(String[] args) {

SpringApplication.run(SleuthSampleApplication.class, args);

}

@RequestMapping("/")

public String home() {

LOG.log(Level.INFO, "you called home");

return "Hello World";

}

}

如果你启动这个应用,浏览器访问http://localhost:8080,你会看到hello world,现在有了这个案例,让我们使用Sleuth加入日志到这个应用:

在应用类增加下面日志变量:

private static final Logger LOG = Logger.getLogger(SleuthSampleApplication.class.getName());

注意这里的类名需要是所在类的名称,在home方法,增加下面日志语句:

@RequestMapping("/")

public String home() {

LOG.log(Level.INFO, "you called home");

return "Hello World";

}

当你再访问这个应用时,在console后台会看到日志输出:

2016-06-15 16:55:56.334 INFO [slueth-sample,44462edc42f2ae73,44462edc42f2ae73,false] 13978 --- [nio-8080-exec-1] com.example.SleuthSampleApplication : calling home

Sleuth加入的是[slueth-sample,44462edc42f2ae73,44462edc42f2ae73,false],这是什么意思?第一个部分是应用名称,也就是前面你在bootstrap.yml中设置spring.application.name的值,第二个值是trace ID,第三个是span ID,最后值显示span是否应该导出到Zipkin。

除了向日志语句添加额外的跟踪信息外,Spring Cloud Sleuth在调用其他微服务时还提供了一些重要的好处。 记住,这里的真正的问题不是在单个微服务中识别日志,而是在多个微服务之间跟踪一个请求链。 微服务通常使用REST API与异步地通过消息中心互相交互。 Sleuth可以在任一情况下提供跟踪信息,但在本示例中,下面我们将了解REST API调用的工作原理。

让我们使用RestTemplate了解应用调用是如何工作的。修改我们的应用类:

private static final Logger LOG = Logger.getLogger(SleuthSampleApplication.class.getName());

@Autowired private RestTemplate restTemplate;

public static void main(String[] args) {

SpringApplication.run(SleuthSampleApplication.class, args);

}

@Bean public RestTemplate getRestTemplate() {

return new RestTemplate();

}

@RequestMapping("/") public String home() {

LOG.log(Level.INFO, "you called home");

return "Hello World";

}

@RequestMapping("/callhome") public String callHome() {

LOG.log(Level.INFO, "calling home");

return restTemplate.getForObject("http://localhost:8080", String.class);

}

我们增加了新的RestTemplate这个bean,这对于Sleuth在请求头部加入trace ID和span ID有作用,这个头部能够被Sleuth用来跟踪微服务之间请求链,通过这个bean,Sleuth能够使用依赖注入获得这个对象并加入头部信息。

我们也加入新的方法和端点,称为callhome,如果你访问http://localhost:8080/callhome,你会看到日志输出如下:

2016-06-17 16:12:36.902 INFO [slueth-sample,432943172b958030,432943172b958030,false] 12157 --- [nio-8080-exec-2] com.example.SleuthSampleApplication : calling home 2016-06-17 16:12:36.940 INFO [slueth-sample,432943172b958030,b4d88156bc6a49ec,false] 12157 --- [nio-8080-exec-3] com.example.SleuthSampleApplication : you called home

上面日志trace ID是相同,但是span ID不同,trace ID是让你跟踪一个跨服务调用传递的请求,而span ID是不同,因为有两个工作单元发生,每个请求各一个。

如果你打开浏览器调试工具,会看到/callhome的请求头部,在响应中看到两个头部有:

X-B3-SpanId: fbf39ca6e571f294 X-B3-TraceId: fbf39ca6e571f294

可见,头部能够让Sleuth跟踪微服务之间的请求。

写在最后:欢迎留言讨论,加关注,持续更新!!!

阿里高级架构师教你使用Spring Cloud Sleuth跟踪微服务的更多相关文章

  1. 十年阿里顶级架构师教你怎么使用Java来搭建微服务

    微服务背后的大理念是将大型.复杂且历时长久的应用在架构上设计为内聚的服务,这些服务能够随着时间的流逝而演化.本文主要介绍了利用 Java 生态系统构建微服务的多种方法,并分析了每种方法的利弊. 快速预 ...

  2. 阿里高级架构师教你使用Spring JMS处理消息事务源码案例

    消费者在接收JMS异步消息的过程中会发生执行错误,这可能会导致信息的丢失.该源码展示如何使用本地事务解决这个问题.这种解决方案可能会导致在某些情况下消息的重复(例如,当它会将信息储存到数据库,然后监听 ...

  3. 阿里高级架构师教你如何使用Spring Cloud Ribbon重试请求

    在微服务调用中,一些微服务圈可能调用失败,通过再次调用以达到系统稳定性效果,本文展示如何使用Ribbon和Spring Retry进行请求再次重试调用. 在Spring Cloud中,使用load b ...

  4. 《Spring Cloud与Docker微服务架构实战》配套代码

    不才写了本使用Spring Cloud玩转微服务架构的书,书名是<Spring Cloud与Docker微服务架构实战> - 周立,已于2017-01-12交稿.不少朋友想先看看源码,现将 ...

  5. Spring Cloud与Docker微服务架构实战 PDF

    电子版百度云下载 链接: https://pan.baidu.com/s/115u011CJ8MZzJx_NqutyTQ 提取码: 关注公众号[GitHubCN]回复2019获取 本书的代码 共计70 ...

  6. Spring Cloud与Docker微服务架构实战 PDF版 内含目录

    Spring Cloud与Docker微服务架构实战  目录 1 微服务架构概述 1 1.1 单体应用架构存在的问题1 1.2 如何解决单体应用架构存在的问题3 1.3 什么是微服务3 1.4 微服务 ...

  7. Spring Cloud与Docker——微服务架构概述

    Spring Cloud与Docker--微服务架构概述 单体应用架构概述 微服务概述 微服务的特性 微服务架构的优点 微服务面临的挑战 微服务的设计原则 单体应用架构概述 传统的服务发布都是采用单体 ...

  8. SpringCloud(9)使用Spring Cloud OAuth2保护微服务系统

    一.简介 OAth2是一个标准的授权协议. 在认证与授权的过程中,主要包含以下3种角色. 服务提供方 Authorization Server. 资源持有者 Resource Server. 客户端 ...

  9. 【分布式架构】“spring cloud”与“dubbo”微服务的对比

      秉承站在巨人的肩膀上,同时我也不想重复制造轮子,我发现了一系列关于“分布式架构”方面,我需要,同时能够解决我的一些疑惑.问题的博客,转载过来,原文链接: http://blog.csdn.net/ ...

随机推荐

  1. 怎样加入社区项目Karbor的Review?

    Review是社区衡量一个贡献者的重要标准. Review步骤: 1.登录Karbor Review地址: https://review.openstack.org/#/q/Karbor 这里可以看到 ...

  2. python基础之模块(一)

    概述 模块,用一砣代码实现了某个功能的代码集合.一个功能可能由 N 个函数来组成,这些函数写到一个py文件中,那么这个Py文件就是传说中的模块. 模块可将代码归类,让你的代码看着条理清晰,当然还需要你 ...

  3. shutter 安装和设置快捷键

    1. 打开系统设置 2. 打开 Keyboard 键盘设置 3. 添加成功的状态 4. 单击右侧 Disabled,然后快速按下 Ctrl+Alt+A 如下图 5. Ctrl+Alt+A 测试OK. ...

  4. asp.net core swagger使用及注意事项

    Swagger 是一个规范和完整的框架,用于生成.描述.调用和可视化 RESTful 风格的 Web 服务.是一款RESTFUL接口的文档在线自动生成+功能测试软件.主要目的是构建标准的.稳定的.可重 ...

  5. ubuntu 18.04下greenplum安装笔记(一)Linux下基础环境的搭建

    背景 需要构建一个用于数据仓库的分布式数据库集群. 每一个节点暂时不需要进行备份,同时也不考虑坏掉的情况. 每一个数据节点最好都不用进行过多的配置,安装起来方便. Greenplum的Shared-N ...

  6. 【miscellaneous】MPEG2、MPEG4、H264的差异

    MPEG2.MPEG4.H264的差异 MPEG-2简介 MPEG-2制定于1994年,设计目标是高级工业标准的图象质量以及更高的传输率.MPEG-2所能提供的传输率在3-10Mbits/sec间,其 ...

  7. 关于opencv的几个小总结

    关于opencv的几个小总结 声明:引用请注明出处http://blog.csdn.net/lg1259156776/ 说明:opencv是一个非常好用的开源图像处理与计算机视觉支持库,但是在实际使用 ...

  8. NAT-地址转换技术的配置

    (一)NAT的概念及工作原理 简单来讲,nat就是将私有网址转化为共有网址的技术.NAT通常部署在一个组织的网络出口位置,成为NAT网关.举个栗子,一段报文想离开私网,必须经过NAT网关将数据传输给公 ...

  9. idea查看接口或类的所有方法

    第一种: 显示结果: 第二种: 点击左显示栏的Structure: 第三种:ctrl+f12,有的电脑可能需要加fn键

  10. 《Tsinghua oc mooc》第8~10讲 虚拟内存管理

    资源 OS2018Spring课程资料首页 uCore OS在线实验指导书 ucore实验基准源代码 MOOC OS习题集 OS课堂练习 Piazza问答平台 暂时无法注册 第八讲 虚拟内存概念 为什 ...