Spring Cloud Sleuth初探

449 阅读4分钟

前言

微服务架构是一个分布式架构,微服务系统按业务划分服务单元,一个微服务系统往往有很多个服务单元。由于服务单元数量众多,业务的复杂性较高,如果出现了错误和异常,很难去定位。所以在微服务架构中,必须实现分布式链路追踪,去跟进一个请求到底有哪些服务参与,参与的顺序又是怎样的,从而达到每个请求的步骤清晰可见,出了问题能够快速定位的目的,这正是调用链监控要做的事情。Spring Cloud提供Sleuth来实现调用链监控。

简介

Spring Cloud Sleuth为Spring Cloud提供了分布式跟踪的解决方案,它大量借用了Google Dapper、Twitter Zipkin和Apache HTrace的设计。

TIPS

术语

Spring Cloud Sleuth借用了Dapper的术语。

Span:基本工作单元,例如,发送RPC是一个新的span,就像向RPC发送响应一样,Span由span的唯一64位ID标识,另一个64位ID标识其所属的Trace。Span还有其他数据,例如描述、带时间戳的事件、键值annotations(标签),导致它们的span的ID以及进程ID(通常是IP地址)。

span可以启动和停止,它们可以追踪自己的时间信息,创建span后,必须在将来的某个时刻停止它。

启动Trace的初始span称为root span,该span的ID值等于trace ID。

Trace:一组span形成的树状结构,例如,如果运行分布式大数据存储,则可能由PUT请求形成trace。

Annotation:用于及时记录事件的存在,使用Brave工具,不再需要为Zipkin设置特殊的事件来了解客户端和服务器是谁、请求在哪里开始以及在哪里结束,然而,出于学习目的,标记这些事件以突出发生了什么类型的操作。

  • cs:Client Sent,客户端发起了一个请求,这个annotation表示span的开始。

  • sr:Server Received,服务器端获得了请求并开始处理它,从此时间戳中减去cs时间戳会显示网络延迟。

  • ss:Server Sent,在请求处理完成时注释(当响应被发送回客户端时),从此时间戳中减去sr时间戳会显示服务器端处理请求所需的时间。

  • cr:Client Received,表示span的结束,客户端已成功从服务器端收到响应,从此时间戳中减去cs时间戳会显示客户端从服务器接收响应所需的全部时间

项目结构

  • microservice-user:会员服务

快速开始

  • pom依赖

    <dependency>
      <groupId>org.springframework.cloud</groupId>
      <artifactId>spring-cloud-starter-sleuth</artifactId>
    </dependency>
    
  • 增加配置

    logging:
      level:
        root: INFO
        org.springframework.cloud.sleuth: DEBUG
    

    以上配置主要是打印Sleuth相关的日志

  • 测试

    启动microservice-user

    访问http://localhost:8000/users/1查看日志

    2019-10-22 11:38:44.256 TRACE [microservice-provider-user,628a86eebdf5ae00,628a86eebdf5ae00,false] 2396 --- [nio-8000-exec-2] o.h.type.descriptor.sql.BasicBinder      : binding parameter [1] as [BIGINT] - [1]
    2019-10-22 11:38:44.256 TRACE [microservice-provider-user,628a86eebdf5ae00,628a86eebdf5ae00,false] 2396 --- [nio-8000-exec-2] o.h.type.descriptor.sql.BasicExtractor   : extracted value ([age2_0_0_] : [INTEGER]) - [20]
    2019-10-22 11:38:44.257 TRACE [microservice-provider-user,628a86eebdf5ae00,628a86eebdf5ae00,false] 2396 --- [nio-8000-exec-2] o.h.type.descriptor.sql.BasicExtractor   : extracted value ([balance3_0_0_] : [NUMERIC]) - [100.00]
    2019-10-22 11:38:44.257 TRACE [microservice-provider-user,628a86eebdf5ae00,628a86eebdf5ae00,false] 2396 --- [nio-8000-exec-2] o.h.type.descriptor.sql.BasicExtractor   : extracted value ([name4_0_0_] : [VARCHAR]) - [张三]
    2019-10-22 11:38:44.257 TRACE [microservice-provider-user,628a86eebdf5ae00,628a86eebdf5ae00,false] 2396 --- [nio-8000-exec-2] o.h.type.descriptor.sql.BasicExtractor   : extracted value ([username5_0_0_] : [VARCHAR]) - [account1]
    
    

    可以看到有很多[microservice-provider-user,628a86eebdf5ae00,628a86eebdf5ae00,false]信息,分别代表服务名称、TraceId、SpanId、是否采样。

总结

本文主要是让大家了解下Sleuth的基本概念以及如何整合,后面会介绍它的具体使用。