网站下拉框怎么做,智慧团建手机版入口,注册公司的条件和要求,建设有限公司官网通过上一篇《分布式服务跟踪#xff08;入门#xff09;》的例子#xff0c;我们已经通过Spring Cloud Sleuth往微服务应用中添加了实现分布式跟踪具备的基本要素。下面通过本文来详细说说实现分布式服务跟踪的一些要点。 分布式系统中的服务跟踪在理论上并不复杂#xff0… 通过上一篇《分布式服务跟踪入门》的例子我们已经通过Spring Cloud Sleuth往微服务应用中添加了实现分布式跟踪具备的基本要素。下面通过本文来详细说说实现分布式服务跟踪的一些要点。 分布式系统中的服务跟踪在理论上并不复杂它主要包括下面两个关键点
为了实现请求跟踪当请求发送到分布式系统的入口端点时只需要服务跟踪框架为该请求创建一个唯一的跟踪标识同时在分布式系统内部流转的时候框架始终保持传递该唯一标识直到返回给请求方为止这个唯一标识就是前文中提到的Trace ID。通过Trace ID的记录我们就能将所有请求过程日志关联起来。为了统计各处理单元的时间延迟当请求达到各个服务组件时或是处理逻辑到达某个状态时也通过一个唯一标识来标记它的开始、具体过程以及结束该标识就是我们前文中提到的Span ID对于每个Span来说它必须有开始和结束两个节点通过记录开始Span和结束Span的时间戳就能统计出该Span的时间延迟除了时间戳记录之外它还可以包含一些其他元数据比如事件名称、请求信息等。
在快速入门示例中我们轻松实现了日志级别的跟踪信息接入这完全归功于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的实现做一些修改来输出这些头部信息具体如下
RequestMapping(value /trace-2, method RequestMethod.GET)public String trace(HttpServletRequest request) { logger.info(call trace-2, TraceId{}, SpanId{}, 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 : call trace-1-- trace-2INFO [trace-2,a6e9175ffd5d2c88,ce60dcf1e2ed918f,true] 1208 --- [nio-9102-exec-3] icationEnhancerBySpringCGLIBa7d84797 : call trace-2, TraceIda6e9175ffd5d2c88, SpanIdbe4949ec115e554e为了更直观的观察跟踪信息我们还可以在application.properties中增加下面的配置
logging.level.org.springframework.web.servlet.DispatcherServletDEBUG通过将Spring MVC的请求分发日志级别调整为DEBUG级别我们可以看到更多跟踪信息
-- trace-12016-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]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: -12016-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 handling2016-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-- trace-22016-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]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: -12016-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 handling2016-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两个项目
Githubhttps://github.com/dyc87112/SpringCloud-Learning/Giteehttps://gitee.com/didispace/SpringCloud-Learning/
如果您对这些感兴趣欢迎star、follow、收藏、转发给予支持
本文内容部分节选自我的《Spring Cloud微服务实战》但对依赖的Spring Boot和Spring Cloud版本做了升级。