SpringCloud--Sleuth日志跟踪(十四)
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SpringCloud--Sleuth日志跟踪(十四)相关的知识,希望对你有一定的参考价值。
参考技术A Spring Cloud Sleuth[sluːθ]是Spring Cloud提供的分布式系统服务链追踪组件,它大量借用了Google的Dapper,Twitter的Zipkin。场景:
疑问:
在微服务中,通常根据业务模块分服务,项目中前端发起一个请求,后端可能跨几个服务调用才能完成这个请求(如下图)。
如果系统越来越庞大,服务之间的调用与被调用关系就会变得很复杂,假如一个请求中需要跨几个服务调用,其中一个服务由于网络延迟等原因挂掉了,那么这时候我们需要分析具体哪一个服务出问题了就会显得很困难。Spring Cloud Sleuth服务链路跟踪功能,就可以帮助我们快速的发现错误根源以及监控分析每条请求链路上的性能等等。
Spring Cloud Sleuth是一个在应用中实现日志跟踪的强有力的工具。使用Sleuth库可以应用于计划任务 、多线程服务或复杂的Web请求,尤其是在一个由多个服务组成的系统中。当我们在这些应用中来诊断问题时,即使有日志记录也很难判断出一个请求需要将哪些操作关联在一起。
如果想要诊断复杂操作,通常的解决方案是在请求中传递唯一的ID到每个方法来识别日志。 而Sleuth可以与日志框架Logback、SLF4J轻松地集成,通过添加独特的标识符来使用日志跟踪和诊断问题。
微服务跟踪(sleuth)其实是一个工具,它在整个分布式系统中能跟踪一个用户请求的过程(包括数据采集,数据传输,数据存储,数据分析,数据可视化),捕获这些跟踪数据,就能构建微服务的整个调用链的视图,这是调试和监控微服务的关键工具。
SpringCloudSleuth有4个特点:
配置应用名称,以便日志输出。
说明:
application name — 应用的名称,也就是application.properties中的spring.application.name参数配置的属性。
traceId — 为一个请求分配的ID号,用来标识一条请求链路。
spanId — 表示一个基本的工作单元,一个请求可以包含多个步骤,每个步骤都拥有自己的spanId。一个请求包含一个TraceId,多个SpanId
export — 布尔类型。表示是否要将该信息输出到类似Zipkin这样的聚合器进行收集和展示。
3f575919b0df993a:traceId相同
3f575919b0df993a,05fddf5ed5bbbf59: spanId不同。
Sleuth将traceId传入了异步方法并创建了以新的 spanId ,代表这是同一个请求但进入了另一个处理阶段,由一个异步线程来执行。
可以看到Sleuth为每个任务实例都创建一个新的traceId和spanId。
Spring Cloud Sleuth可以应用在各种各样的单一Web应用中。我们可以使用这项技术轻松地为一个请求采集日志,即使请求跨越多个线程。帮助我们在多线程环境下进行清晰的调试,通过识别traceId和spanId来确定每一个操作和操作中的每一步,这样可以减轻我们做日志分析的复杂性。
注:当文件名为logback-spring.xml时 不需要配置logging.config
sleuth中的一些术语:
springcloud sleuth
基本术语
Spring Cloud Sleuth 采用了 Google 开源项目 Dapper 专业术语:
1) Span 基本工作单元,发送 个远程调度任务就会产生一个 Span, Span 是用 一个64ID 标识的, Trace 是用另 一个64 ID 标识的。span 还包含了其他的信息,例如摘要、时间戳事件 Span 及进程 ID
2) Trace :由 系列 Span 组成的,呈树状结构。请求一个微服务系统的 API ,这个API 接口需要调用多个微服务单元,调用 一个微服务单元都会产生 一个新的 span, 所有由这个请求产生 Span 组成了这个 Trace
3) Annotation :用于记录 个事件, 一些核 注解用于定义 一个请求的开始和结束,这些注解如下:
cs-Client Sent 客户端发送 一个请求,这个注解描述了 Span 的开始。
sr-Server Received :服务端获得请求并准备开始处理它,如果将其 减去 cs 时间戳,便可得到网络传输的时间。
ss-Server Sent :服务端发送响应, 该注解表明请求处理的完成(当请求返回客户端),用ss的时间戳减 sr 时间戳,便可以得到服务器响应的时间。
cr-Client Received 客户端接收响应, 此时 Span 结束,如果cr 的时间戳减去 cs 时间戳,便可以得到整个请求所消耗的时间。
实例
项目结构图
zipkin-server模块
引入依赖
<dependency> <groupId>io.zipkin.java</groupId> <artifactId>zipkin-server</artifactId> </dependency> <dependency> <groupId>io.zipkin.java</groupId> <artifactId>zipkin-autoconfigure-ui</artifactId> </dependency>
配置文件
eureka: client: serviceUrl: defaultZone: http://localhost:8761/eureka/ server: port: 9411 spring: application: name: zipkin-server
启动类添加注解
@EnableZipkinServer
网关服务模块 gateway-serice
引入依赖
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-zipkin</artifactId> <version>RELEASE</version> </dependency>
配置文件
eureka: client: serviceUrl: defaultZone: http://localhost:8761/eureka/ server: port: 5000 spring: application: name: gateway-service sleuth: sampler: percentage: 1.0 zipkin: base-url: http://localhost:9411 zuul: routes: api-a: path: /user-api/** serviceId: user-service api-b: path: /user-api02/** serviceId: user02-service
启动类添加注解
无需添加其它注解
服务提供者,服务消费者user-service模块
引入依赖
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-zipkin</artifactId> <version>RELEASE</version> </dependency>
配置文件
eureka: client: serviceUrl: defaultZone: http://localhost:8761/eureka/ server: port: 8762 spring: application: name: user-service zipkin: base-url: http://localhost:9411 sleuth: sampler: percentage: 1.0 #这个可以不写 #spring.zipkin.base-url=http://localhost:9411
启动类添加注解
无需添加其它注解
测试
依次启动项目,浏览器输入网关请求,访问zipkin http://localhost:9411/
服务链路数据存储
服务链路数据可以存储到 rabbitMQ ,数据库或elasticSearch服务器上。只要简单的集成到zipkin-server模块上即可
以上是关于SpringCloud--Sleuth日志跟踪(十四)的主要内容,如果未能解决你的问题,请参考以下文章