Spring Cloud构建微服务架构:分布式服务跟踪(跟踪原理)

开发 开发工具 分布式
我们已经通过Spring Cloud Sleuth往微服务应用中添加了实现分布式跟踪具备的基本要素。下面通过本文来详细说说实现分布式服务跟踪的一些要点。

通过上一篇《分布式服务跟踪(入门)》的例子,我们已经通过Spring Cloud Sleuth往微服务应用中添加了实现分布式跟踪具备的基本要素。下面通过本文来详细说说实现分布式服务跟踪的一些要点。

分布式系统中的服务跟踪在理论上并不复杂,它主要包括下面两个关键点:

  • 为了实现请求跟踪,当请求发送到分布式系统的入口端点时,只需要服务跟踪框架为该请求创建一个***的跟踪标识,同时在分布式系统内部流转的时候,框架始终保持传递该***标识,直到返回给请求方为止,这个***标识就是前文中提到的Trace ID。通过Trace ID的记录,我们就能将所有请求过程日志关联起来。
  • 为了统计各处理单元的时间延迟,当请求达到各个服务组件时,或是处理逻辑到达某个状态时,也通过一个***标识来标记它的开始、具体过程以及结束,该标识就是我们前文中提到的Span ID,对于每个Span来说,它必须有开始和结束两个节点,通过记录开始Span和结束Span的时间戳,就能统计出该Span的时间延迟,除了时间戳记录之外,它还可以包含一些其他元数据,比如:事件名称、请求信息等。

[[222355]]

在快速入门示例中,我们轻松实现了日志级别的跟踪信息接入,这完全归功于spring-cloud-starter-sleuth组件的实现。在Spring Boot应用中,通过在工程中引入spring-cloud-starter-sleuth依赖之后, 它会自动的为当前应用构建起各通信通道的跟踪机制,比如:

  • 通过诸如RabbitMQ、Kafka(或者其他任何Spring Cloud Stream绑定器实现的消息中间件)传递的请求
  • 通过Zuul代理传递的请求
  • 通过RestTemplate发起的请求

在快速入门示例中,由于trace-1对trace-2发起的请求是通过RestTemplate实现的,所以spring-cloud-starter-sleuth组件会对该请求进行处理,在发送到trace-2之前sleuth会为在该请求的Header中增加实现跟踪需要的重要信息,主要有下面这几个(更多关于头信息的定义我们可以通过查看org.springframework.cloud.sleuth.Span的源码获取):

  • X-B3-TraceId:一条请求链路(Trace)的***标识,必须值
  • X-B3-SpanId:一个工作单元(Span)的***标识,必须值
  • X-B3-ParentSpanId::标识当前工作单元所属的上一个工作单元,Root Span(请求链路的***个工作单元)的该值为空
  • X-B3-Sampled:是否被抽样输出的标志,1表示需要被输出,0表示不需要被输出
  • X-Span-Name:工作单元的名称

我们可以通过对trace-2的实现做一些修改来输出这些头部信息,具体如下:

  1. @RequestMapping(value = "/trace-2", method = RequestMethod.GET) 
  2. public String trace(HttpServletRequest request) { 
  3.     logger.info("===<call trace-2, TraceId={}, SpanId={}>==="
  4.             request.getHeader("X-B3-TraceId"), request.getHeader("X-B3-SpanId")); 
  5.     return "Trace"

通过上面的改造,我们再运行快速入门的示例内容,并发起对trace-1的接口访问,我们可以得到如下输出内容。其中在trace-2的控制台中,输出了当前正在处理的TraceID和SpanId信息。

  1. -- trace-1 
  2. INFO [trace-1,a6e9175ffd5d2c88,8524f519b8a9e399,true] 10532 --- [nio-9101-exec-2] icationEnhancerBySpringCGLIB27aa9624 : ===<call trace-1>=== 
  3.  
  4. -- trace-2 
  5. INFO [trace-2,a6e9175ffd5d2c88,ce60dcf1e2ed918f,true] 1208 --- [nio-9102-exec-3] icationEnhancerBySpringCGLIBa7d84797 : ===<call trace-2, TraceId=a6e9175ffd5d2c88, SpanId=be4949ec115e554e>=== 

为了更直观的观察跟踪信息,我们还可以在application.properties中增加下面的配置:

  1. logging.level.org.springframework.web.servlet.DispatcherServlet=DEBUG 

通过将Spring MVC的请求分发日志级别调整为DEBUG级别,我们可以看到更多跟踪信息:

  1. -- trace-1 
  2. 2016-11-27 09:26:52.663 DEBUG [trace-1,a6e9175ffd5d2c88,a6e9175ffd5d2c88,true] 10532 --- [nio-9101-exec-2] o.s.web.servlet.DispatcherServlet        : DispatcherServlet with name 'dispatcherServlet' processing GET request for [/trace-1] 
  3. 2016-11-27 09:26:52.666 DEBUG [trace-1,a6e9175ffd5d2c88,a6e9175ffd5d2c88,true] 10532 --- [nio-9101-exec-2] o.s.web.servlet.DispatcherServlet        : Last-Modified value for [/trace-1] is: -1 
  4. 2016-11-27 09:26:52.685 DEBUG [trace-1,a6e9175ffd5d2c88,8524f519b8a9e399,true] 10532 --- [nio-9101-exec-2] o.s.web.servlet.DispatcherServlet        : Null ModelAndView returned to DispatcherServlet with name 'dispatcherServlet': assuming HandlerAdapter completed request handling 
  5. 2016-11-27 09:26:52.685 DEBUG [trace-1,a6e9175ffd5d2c88,a6e9175ffd5d2c88,true] 10532 --- [nio-9101-exec-2] o.s.web.servlet.DispatcherServlet        : Successfully completed request 
  6.  
  7. -- trace-2 
  8. 2016-11-27 09:26:52.673 DEBUG [trace-2,a6e9175ffd5d2c88,be4949ec115e554e,true] 1208 --- [nio-9102-exec-3] o.s.web.servlet.DispatcherServlet        : DispatcherServlet with name 'dispatcherServlet' processing GET request for [/trace-2] 
  9. 2016-11-27 09:26:52.679 DEBUG [trace-2,a6e9175ffd5d2c88,be4949ec115e554e,true] 1208 --- [nio-9102-exec-3] o.s.web.servlet.DispatcherServlet        : Last-Modified value for [/trace-2] is: -1 
  10. 2016-11-27 09:26:52.682 DEBUG [trace-2,a6e9175ffd5d2c88,ce60dcf1e2ed918f,true] 1208 --- [nio-9102-exec-3] o.s.web.servlet.DispatcherServlet        : Null ModelAndView returned to DispatcherServlet with name 'dispatcherServlet': assuming HandlerAdapter completed request handling 
  11. 2016-11-27 09:26:52.683 DEBUG [trace-2,a6e9175ffd5d2c88,be4949ec115e554e,true] 1208 --- [nio-9102-exec-3] o.s.web.servlet.DispatcherServlet        : Successfully completed request 

本文完整示例:

读者可以根据喜好选择下面的两个仓库中查看trace-1和trace-2两个项目:

Github:https://github.com/dyc87112/SpringCloud-Learning/

Gitee:https://gitee.com/didispace/SpringCloud-Learning/

【本文为51CTO专栏作者“翟永超”的原创稿件,转载请通过51CTO联系作者获取授权】

戳这里,看该作者更多好文

 

责任编辑:武晓燕 来源: 51CTO专栏
相关推荐

2018-04-16 14:56:56

微服务架构分布式服务

2018-03-02 16:11:29

Spring Clou分布式服务跟踪

2018-04-18 16:07:49

Spring Clou微服务分布式

2018-04-09 13:56:13

微服务架构分布式

2018-04-02 15:01:31

微服务架构分布式服务

2021-06-09 09:00:00

微服务架构技术

2017-07-28 16:41:53

Spring Clou微服务架构

2018-07-19 14:58:14

Spring Clou微服务架构

2018-05-23 15:58:27

Spring Clou微服务架构

2020-05-26 11:59:30

日志链路微服务架构

2017-01-16 14:51:26

京东分布式服务CallGraph

2017-06-26 09:06:10

Spring Clou微服务架构

2022-02-18 09:30:48

分布式Spring应用程序

2017-09-04 16:15:44

服务网关架构

2017-07-03 09:50:07

Spring Clou微服务架构

2017-08-09 15:50:47

Spring Clou微服务架构

2017-08-10 11:15:05

Spring Clou微服务架构

2023-08-25 16:26:49

微服务架构

2023-09-12 22:58:51

分布式架构微服务

2017-12-20 15:37:39

Spring Clou微服务架构
点赞
收藏

51CTO技术栈公众号