• 阿里高级架构师教你使用Spring Cloud Sleuth跟踪微服务


    随着微服务数量不断增长,需要跟踪一个请求从一个微服务到下一个微服务的传播过程,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跟踪微服务之间的请求。

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

  • 相关阅读:
    OpenCV 学习笔记(1-1)opecv3.41及其扩展库在VS2015下配置
    OpenCV 学习笔记(11)像素级别指针操作
    (19) 树莓派发送微信消息
    mybatis+spring配置
    spring Ioc 实践
    运用BufferedWriter把数据写入文件
    【转】跟我一起学Spring 3(4)–深入理解IoC(控制反转)和DI(依赖注入)
    [转]Spring MVC之@RequestMapping 详解
    python错误处理
    python函数
  • 原文地址:https://www.cnblogs.com/Ti1077/p/9598555.html
Copyright © 2020-2023  润新知