当前位置: 首页 > 科技观察

SpringCloud搭建微服务架构:分布式服务追踪(追踪原理)

时间:2023-03-13 07:16:07 科技观察

通过上篇文章《分布式服务跟踪(入门)》的例子,我们已经为微服务应用添加了通过SpringCloudSleuth实现分布式追踪的基本要素。下面通过本文详细谈谈实现分布式服务跟踪的一些要点。分布式系统中的服务跟踪在理论上并不复杂,主要包括以下两个关键点:为了实现请求跟踪,当请求发送到分布式系统的入口点时,服务跟踪框架只需要同时,当它在分布式系统中循环时,框架会一直传递***ID,直到返回给请求者。这个***ID就是上面说的TraceID。通过TraceID记录,我们可以关联所有请求过程日志。为了统计每个处理单元的延时,当请求到达每个服务组件,或者处理逻辑达到某个状态时,也会用***标记来标记它的开始、具体流程和结束,这是我们的上一篇文章中提到的SpanID,对于每个Span来说,它必须有两个节点,start和end。通过记录起始Span和结束Span的时间戳,可以统计Span的时间延迟,除了时间戳记录。除此之外,还可以包含一些其他的元数据,比如:事件名称、请求信息等。在快速入门的例子中,我们很轻松的实现了日志级别的trace信息访问,这都是得益于spring-cloud的实现-starter-sleuth组件。在SpringBoot应用中,在项目中引入spring-cloud-starter-sleuth依赖后,会自动为当前应用的每一个通信通道建立一个跟踪机制,例如:通过如RabbitMQ、Kafka(或其他任何一种)SpringCloudStreambinder实现的消息中间件)通过Zuul代理传递的请求通过RestTemplate发起的请求在快速入门的例子中,由于trace-1到trace-2发起的请求是通过RestTemplate实现的,spring-cloud-starter-sleuth组件将处理请求。在发送到trace-2之前,sleuth会在请求的header中添加实现跟踪所需要的重要信息,主要包括以下内容(更多关于header信息的定义可以查看org.springframework.cloud的源码获取。sleuth.Span):X-B3-TraceId:一个请求链接(Trace)的***标识,必须是一个值X-B3-SpanId:一个工作单元(Span),必须是值X-B3-ParentSpanId::标识当前工作单元所属的前一个工作单元,RootSpan(请求链接的第一个工作单元)的值为空X-B3-Sampled:是否采样输出的标志,1表示需要输出,0表示不需要输出X-Span-Name:工作单元的名称我们可以通过对trace-2的实现做一些修改来输出这些头信息,具体为如下:@RequestMapping(value="/trace-2",method=RequestMethod.GET)publicStringtrace(HttpServletRequestrequest){logger.info("======",request.getHeader("X-B3-TraceId"),request.getHeader("X-B3-SpanId"));return"Trace";}通过上面的变换,我们然后运行快速启动的示例内容,并发起对trace-1的接口访问,我们可以得到如下输出内容。trace-2的控制台输出当前正在处理的TraceID和SpanId信息。--trace-1INFO[trace-1,a6e9175ffd5d2c88,8524f519b8a9e399,true]10532---[nio-9101-exec-2]icationEnhancerBySpringCGLIB27aa9624:======--trace-2INFO[trace-2,a6e9175ffd5d2c88,ce60dcf1e2ed918f,true]1208---[nio-9102-exec-3]icationEnhancerBySpringCGLIBa7d84797:=====e信息我们可以更直观的观察554同样在application.properties中添加如下配置:logging.level.org.springframework.web.servlet.DispatcherServlet=DEBUG通过调整SpringMVC的请求分发日志级别为DEBUG级别,我们可以看到更多的trace信息:--trace-12016-11-2709:26:52.663DEBUG[trace-1,a6e9175ffd5d2c88,a6e9175ffd5d2c88,true]10532---[nio-9101-exec-2]o.s.web.servlet.DispatcherServlet:DispatcherServletwithnamervdisp'processingGETrequestfor[/trace-1]201611-2709:26:52.666DEBUG[trace-1,a6e9175ffd5d2c88,a6e9175ffd5d2c88,true]10532---[nio-9101-exec-2]o.s.web.servlet.DispatcherServlet:Last-Modifiedvaluefor[/trace-1]是:-12016-11-2709:26:52.685DEBUG[trace-1,a6e9175ffd5d2c88,8524f519b8a9e399,true]10532---[nio-9101-exec-2]o.s.web.servlet.DispatcherServlet:NullModelAndViewreturnedtoDispatcherServletwithname'dispatcherServlet':assumingHandlerAdaptercompletedrequesthandling2016-11-2709:26:52.685DEBUG[trace-1,a6e9175ffd5d2c88,a6e9175ffd5d2c88,true]10532---[nio-9101-exec-2]o.s.web.servlet.DispatcherServlet:Successfullycompletedrequest--trace-22016-11-2709:26:52.673DEBUG[trace-2,a6e9175ffd5d2c88,be4949ec115e554e,true]1208---[nio-9102-exec-3]o.s.web.servlet.DispatcherServlet:DispatcherServletwithname'dispatcherServlet'processingGETrequestfor[/trace-2]2016-11-2709:26:52.679DEBUG[trace-2,a6e9175ffd5d2c88,be4949ec115e554e,true]1208---[nio-9102-exec-3]o.s.web.servlet.DispatcherServlet:Last-Modifiedvaluefor[/trace-2]is:-12016-11-2709:26:52.682DEBUG[trace-2,a6e9175ffd5d2c88,ce60dcf1e2ed918f,true]1208---[nio-9102-exec-3]o.s.web.servlet.DispatcherServlet:NullModelAndViewreturnedtoDispatcherServletwithname'dispatcherServlet':assumingHandlerAdaptercompletedrequesthandling2016-11-2709:26:52.683DEBUG[trace-2,a6e9175ffd5d2c88,be4949ec115e554e,true]1208---[nio-9102-exec-3]o.s.web.servlet.DispatcherServlet:根据读者的喜好,可以完成本文示例:Successfullycompletedrequest选择以下两个仓库查看trace-1和trace-2项目:Github:https://github.com/dyc87112/SpringCloud-Learning/Gitee:https://gitee.com/didispace/SpringCloud-Learning/【本文为专栏作者“翟永超”原创稿件,转载请联系作者获得授权】点此查看该作者更多好文