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

通过上一篇《分布式服务跟踪(入门)》的例子,我们已经通过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-1trace-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的控制台中,输出了当前正在处理的TraceIDSpanId信息。

-- trace-1
INFO [trace-1,a6e9175ffd5d2c88,8524f519b8a9e399,true] 10532 --- [nio-9101-exec-2] icationEnhancerBySpringCGLIB27aa9624 : ===<call trace-1>===

-- trace-2
INFO [trace-2,a6e9175ffd5d2c88,ce60dcf1e2ed918f,true] 1208 --- [nio-9102-exec-3] icationEnhancerBySpringCGLIBa7d84797 : ===<call trace-2, TraceId=a6e9175ffd5d2c88, SpanId=be4949ec115e554e>===

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

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

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

-- trace-1
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]
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
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
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

-- trace-2
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]
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
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
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-1trace-2两个项目:

  • Github:https://github.com/dyc87112/SpringCloud-Learning/
  • Gitee:https://gitee.com/didispace/SpringCloud-Learning/

如果您对这些感兴趣,欢迎star、follow、收藏、转发给予支持!

本文内容部分节选自我的《Spring Cloud微服务实战》,但对依赖的Spring Boot和Spring Cloud版本做了升级。


money.jpg

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/477598.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

竞赛报名 | “未来杯”第二届知识图谱锦标赛火热报名中,最高奖金32000元!...

转载公众号 | AI Timer继2021年“未来杯”系列赛事之AI学术联赛暨首届人工智能知识图谱锦标赛成功举办后&#xff0c;中软国际教育科技集团旗下SteerTech科技创新开源生态平台联手AI TIME&#xff0c;再一次迎来人工智能知识图谱应用在众多领域落地的探索旅程。一、组织机构【…

我在鹅厂,拿到满星绩效!

文 | 山竹小鹅背绩效&#xff1f;就算SP以上也背绩效&#xff1f;互联网寒冬&#xff1f;内卷太严重&#xff1f;卷不动&#xff1f;资本家吃相太难看&#xff1f;……听了太多消极言论&#xff0c;有些是陈述事实&#xff0c;也有很多是贩卖焦虑。吐槽能变得更好吗&#xff1f…

2019年学习总结

总结回顾自己学习的过程&#xff0c;看看自己的学习成果&#xff0c;激励自己在2020继续努力。 2019.3 - 2019.9 学习了王争的《数据结构和算法之美》&#xff0c;github 代码地址 统计了 2018.2 至 2019.12 的cpp代码量&#xff1a;41,721‬行 find . -name "*.cpp&qu…

Spring Cloud构建微服务架构:消息驱动的微服务(消费分区)【Dalston版】

通过上一篇《消息驱动的微服务&#xff08;消费组&#xff09;》的学习&#xff0c;我们已经能够在多实例环境下&#xff0c;保证同一消息只被一个消费者实例进行接收和处理。但是&#xff0c;对于一些特殊场景&#xff0c;除了要保证单一实例消费之外&#xff0c;还希望那些具…

图谱实战 | 知识图谱在供应链和运营绩效提升领域的应用

转载公众号 | DataFunSummit分享嘉宾&#xff1a;高欢 &#xff08;前&#xff09;博世中国编辑整理&#xff1a;卢鹏澳 桂林电子科技大学出品平台&#xff1a;DataFunTalk导读&#xff1a;公司内部尝试运用AI技术落地了几款基于知识图谱的产品&#xff0c;本文将从实践和应用角…

薪资不逊NLP算法岗,边缘AI火了!

众所周知&#xff0c;深度神经网络模型被广泛应用在图像分类、物体检测&#xff0c;目标跟踪等计算机视觉任务中&#xff0c;并取得了巨大成功。随着不同场景的需求变得更加多样&#xff0c;越来越多的IoT设备和场景需要与数据采集点以最接近的低时延来进行决策和操作&#xff…

LeetCode 735. 行星碰撞(栈)

1. 题目 给定一个整数数组 asteroids&#xff0c;表示在同一行的行星。 对于数组中的每一个元素&#xff0c;其绝对值表示行星的大小&#xff0c;正负表示行星的移动方向&#xff08;正表示向右移动&#xff0c;负表示向左移动&#xff09;。每一颗行星以相同的速度移动。 找…

Spring Cloud构建微服务架构:消息驱动的微服务(消费组)【Dalston版】

通过之前的《消息驱动的微服务&#xff08;入门&#xff09;》一文&#xff0c;相信很多朋友已经对Spring Cloud Stream有了一个初步的认识。但是&#xff0c;对于《消息驱动的微服务&#xff08;核心概念&#xff09;》一文中提到的一些核心概念可能还有些迷糊&#xff0c;下面…

论文浅尝 | C3KG:中文常识对话知识图谱

笔记整理&#xff1a;张廉臣&#xff0c;东南大学硕士&#xff0c;研究方向为自然语言处理。Citation: Li, D., Li, Y., Zhang, J., Li, K., Wei, C., Cui, J., & Wang, B. (2022). C3KG: A Chinese Commonsense Conversation Knowledge Graph. arXiv preprint arXiv:2204.…

Spring Cloud构建微服务架构:消息驱动的微服务(核心概念)【Dalston版】

通过《Spring Cloud构建微服务架构&#xff1a;消息驱动的微服务&#xff08;入门&#xff09;》一文&#xff0c;相信大家对Spring Cloud Stream的工作模式已经有了一些基础概念&#xff0c;比如&#xff1a;输入、输出通道的绑定&#xff0c;通道消息事件的监听等。下面在本文…

大模型时代,我们真的不再需要分词了吗?

文 | 付奶茶编 | 小轶分词是NLP的基础任务&#xff0c;将句子、段落分解为字词单位&#xff0c;方便后续的处理的分析。不知道NLPer有没有思考过这个问题:我们在各项研究工作中想要建模的文本单位究竟是什么?What are the units of text that we want to model?在这篇论文中,…

LeetCode 1190. 反转每对括号间的子串(栈)

1. 题目 给出一个字符串 s&#xff08;仅含有小写英文字母和括号&#xff09;。 请你按照从括号内到外的顺序&#xff0c;逐层反转每对匹配括号中的字符串&#xff0c;并返回最终的结果。 注意&#xff0c;您的结果中 不应 包含任何括号。 示例 1&#xff1a; 输入&#xf…

论文浅尝 | 探索用于归纳型知识图谱补全的关系语义

笔记整理&#xff1a;徐雅静&#xff0c;浙江大学在读硕士&#xff0c;研究方向为知识图谱的表示学习&#xff0c;零样本学习。KGC指的是在不完整的KG中推理出缺失的实体。以前的多数工作仅仅考虑到直推式场景&#xff08;实体都存在KG中&#xff09;&#xff0c;不能有效地解决…

关于深度学习,我们写了一本1400页的全栈手册

不知不觉写文章已经四年了。最开始是一个人&#xff0c;后来恰了恰饭&#xff0c;就招揽了很多比小夕厉害的小伙伴一起写。不知不觉已经积累了300多篇了。。三年以来&#xff0c;我跟小伙伴们原创的300篇深度学习与NLP领域的入门资料、子方向综述、2018~2022学术前沿解读、工业…

LeetCode 1019. 链表中的下一个更大节点(单调栈)

1. 题目 给出一个以头节点 head 作为第一个节点的链表。链表中的节点分别编号为&#xff1a;node_1, node_2, node_3, … 。 每个节点都可能有下一个更大值&#xff08;next larger value&#xff09;&#xff1a;对于 node_i&#xff0c;如果其 next_larger(node_i) 是 node…

Spring Cloud Hystrix的请求合并

通常微服务架构中的依赖通过远程调用实现&#xff0c;而远程调用中最常见的问题就是通信消耗与连接数占用。在高并发的情况之下&#xff0c;因通信次数的增加&#xff0c;总的通信时间消耗将会变的不那么理想。同时&#xff0c;因为对依赖服务的线程池资源有限&#xff0c;将出…

LeetCode 306. 累加数(暴力回溯)

1. 题目 累加数是一个字符串&#xff0c;组成它的数字可以形成累加序列。 一个有效的累加序列必须至少包含 3 个数。除了最开始的两个数以外&#xff0c;字符串中的其他数都等于它之前两个数相加的和。 给定一个只包含数字 ‘0’-‘9’ 的字符串&#xff0c;编写一个算法来判…

关于深度学习,我们4年时间写了一本1400页的全栈手册

不知不觉写文章已经四年多了。最开始是一个人&#xff0c;后来恰了恰饭&#xff08;感恩理解&#xff09;&#xff0c;就招揽了很多比小夕厉害的小伙伴一起写。不知不觉已经积累了300多篇了。。四年以来&#xff0c;我跟小伙伴们原创的300篇深度学习领域&#xff08;含NLP、CV等…

会议交流 | 第十六届全国知识图谱与语义计算大会(工业界论坛)——8月24日-27日...

点击阅读原文&#xff0c;进入 CCKS 官方网站。OpenKGOpenKG&#xff08;中文开放知识图谱&#xff09;旨在推动以中文为核心的知识图谱数据的开放、互联及众包&#xff0c;并促进知识图谱算法、工具及平台的开源开放。

消费者驱动的微服务契约测试套件Spring Cloud Contract

在微服务架构下&#xff0c;你的服务可能由不同的团队提供和维护&#xff0c;在这种情况下&#xff0c;接口的开发和维护可能会带来一些问题&#xff0c;比如服务端调整架构或接口调整而对消费者不透明&#xff0c;导致接口调用失败。 为解决这些问题&#xff0c;Ian Robinson…