SpringCloud学习笔记(11)——消息驱动的微服务:Spring Cloud Sleuth

Spirng Cloud Sleuth 为微服务架构增加分布式服务跟踪能力。

快速入门

1.准备工作

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

  • 服务注册中心:eureka-server

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

    • 创建一个基本的Spring Boot应用,在pom.xml中增加如下依赖。
     
        
            org.springframework.boot
            spring-boot-starter-web
        
        
            org.springframework.cloud
            spring-cloud-starter-netflix-eureka-server
        
        
            org.springframework.cloud
            spring-cloud-starter-netflix-ribbon
        
        
            org.springframework.cloud
            spring-cloud-starter-sleuth
        
    
        
            org.springframework.boot
            spring-boot-starter-test
            test
        
    
    
    
        
            
                org.springframework.cloud
                spring-cloud-dependencies
                ${spring-cloud.version}
                pom
                import
            
        
    
    
    • 创建应用主类,实现/trace-1 接口,并使用 RestTemplate 调用 trace-2 应用的接口。如下:
    @RestController
    @EnableDiscoveryClient
    @SpringBootApplication
    public class Trace1Application {
    
        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(Trace1Application.class, args);
        }
    }
    
    • 微服务应用:trace-2 ,实现接口 /trace-2 ,供 trace-1 使用。 如下:
    @RestController
    @EnableDiscoveryClient
    @SpringBootApplication
    public class Trace2Application {
    
        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(Trace2Application.class, args);
        }
    
    }
    
实现跟踪

在完成了以上的准备工作以后,我们现在为上面的trace-1 和 trace-2 添加服务跟踪功能。 在trace-1 和 trace-2 的pom中增加 spring-cloud-starter-sleuth

  
            org.springframework.cloud
            spring-cloud-starter-sleuth
        

启动 trace-1、 trace-2 及 注册中心,发送请求:http://localhost:9101/trace-1 ,可在控制台上看到

 [trace-2,19b2514d0d448a55,008d2ee22da9b5c8,false] 22524 --- [nio-9102-exec-3] com.gildata.trace2                       : ===call trace-2===

从上面的控制台输出内容中,我们看到多了一些日志信息。 每个值的含义如下所述 :

  • 第一个值:trace-2 应用名称
  • 第二个值:19b2514d0d448a55, spring cloud sleuth 生成的一个ID,称为 Trace ID,用来标识一条请求链路。一条请求链路包含一个 Trace ID,多个 SpanID.
  • 第三个值:008d2ee22da9b5c8 ,Spring Cloud Sleuth 生成的另外一个ID,称为 Span ID ,它表示一个基本的工作单元,比如发送一个 HTTP 请求
  • 第四个值:false,它表示是否要将该信息输出到Zipkin 等服务中来收集和展示。

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

与 Logstash整合

Logstash 是ELK 平台的一个开源工具,可以对日志进行收集、过滤、并将其存储供以后使用。

Spring Cloud Sleuth 在于 ELK 平台整合使用时,实际上只要实现与负责日志收集的Logstash 完成数据对接即可。所以我们需要为Logstash准备JSON格式的日志输出。由于 Spring Boot 应用默认使用logback 来记录日志,而Logstash 自身也有对logback日志工具的支持工具,所以我们可以直接通过在logback的配置中增加对 Logstash 的 Appender,就能方便地将日志转换成以 JSON 的格式存储和输出了。

下面我们来详细介绍一下 在快速入门的基础上,如何实现面向Logstash的日志输出配置。

  • 在pox.xml 依赖中引入 logstash-logback-encoder依赖。

            net.logstash.logback
            logstash-logback-encoder
            4.6
        
  • 在工程/resource 目录下创建bootstrap.properties 配置文件,将 spring.application.name=trace-1 配置移动到该文件中去。由于 logback-spring.xml 加载在 application.properties 之前,所以之前的配置 logback-spring.xml 无法获取spring.application.name 属性,因此这里将该属性移动到最先加载的bootstrap.properties 配置文件中。
  • 在工程/resource 目录下创建logback 配置文件 logback-spring.xml

与 Zipkin 整合

很多时候我们追溯请求链路的一个原因是为了找出整个调用链路中出现延迟过高的瓶颈源,或为了实现对分布式系统做延迟监控等与时间消耗相关的需求,这时候 ELK 这样的日志分析系统就显得有些乏力了。

Zipkin 是 Twitter 的一个开源项目。我们可以使用它来收集各个服务器上请求链路的跟踪数据,并通过它提供的 REST API 接口来辅助查询跟踪数据以实现对分布式系统的监控程序。 除了 面向开发的API接口之外,它还提供了方便的 UI组件来帮助我们直观搜索跟踪信息和分析请求链路明细。

下图展示了 Zipkin 的基础架构,它主要由 4 个核心组件构成。

SpringCloud学习笔记(11)——消息驱动的微服务:Spring Cloud Sleuth_第1张图片

  • Collector: 收集器组件,处理从外部系统发送过来的跟踪信息,将这些信息转换为 Zipkin 内部处理的 Span 格式。
  • Storage: 存储组件,主要处理收集器接收到的跟踪信息,默认会将这些信息存储到内存中。
  • RESTful API:API组件,主要用来提供外部访问接口。
  • Web UI:UI 组件,基于 API 组件实现的上层应用。
HTTP 收集

我们来详细介绍下 Sleuth 与 Zipkin 的基础整合过程,主要分为以下两步:

第一步,搭建 Zipkin Server

  • 创建一个基础的 Spring Boot 应用,命名为 zipkin-server,并在pom.xml引入 Zipkin Server 的相关依赖,如下:

        
            org.springframework.boot
            spring-boot-starter-web
        
        
            io.zipkin.java
            zipkin-server
            2.12.1
        
        
            io.zipkin.java
            zipkin-autoconfigure-ui
            2.12.1
        
        
            org.springframework.boot
            spring-boot-starter-test
            test
        
    
  • 创建主类,使用@EnableZipkinServer 注解来启动 Zipkin Server , 具体如下:
@EnableZipkinServer
@SpringBootApplication
public class ZipkinServerApplication {

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

}
  • 修改配置文件
spring.application.name=zipkin-server
server.port=9411

第二步:为应用引入和配置 Zipkin 服务。

  • 在trace-1 和 trace-2 的pom.xml 中引入 spring-cloud-sleuth-zipkin 依赖,具体如下:
   
            org.springframework.cloud
            spring-cloud-sleuth-zipkin
            2.1.0.RELEASE
        
测试与分析

我们将 eureka-server、trace-1、trace-2 启动起来。

我们向 trace-1 的接口发送几个请求 http://localhost:9101/trace-1.

查看 Zipkin Server 的管理页面

SpringCloud学习笔记(11)——消息驱动的微服务:Spring Cloud Sleuth_第2张图片

SpringCloud学习笔记(11)——消息驱动的微服务:Spring Cloud Sleuth_第3张图片

测试成功。

你可能感兴趣的:(Spring,Cloud)