热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Sleuth+zipkin链路追踪SpringCloud微服务的解决方案

在庞大的微服务群中,随着业务扩展,微服务个数增多,系统调用链路复杂化。Sleuth+zipkin是解决SpringCloud微服务定位和追踪的方案。通过TraceId将不同服务调用的日志串联起来,实现请求链路跟踪。通过Feign调用和Request传递TraceId,将整个调用链路的服务日志归组合并,提供定位和追踪的功能。


前言

在我们越来越庞大的微服务群中,随着业务的不断扩展,微服务的个数也越来越多, 微服务的架构体系,服务拆分导致系统调用链路也在不断的复杂化,一个稍微复杂的前端请求可能最终需要调用很多次后端服务才能完成,一个后端的服务,可能通过多次的Feign调用才能实现;当我们的请求出现故障或者是性能降低时,我们分析到最后的根本致错的微服务也带来了很大的困难,分布式系统的链路追踪便是用来挑战这个困难的,今天我们介绍的Sleuth+Zipkin,就是用来对SpringCloude的微服务云体系里的服务定位和追踪的解决方案。


Http跟踪

为了实现请求链路跟踪,当请求发送到分布式系统的入口时,只需要在服务跟踪框架为该请求创建唯一的跟踪标识,并保证该标识在在分布式系统内部流转,直到返回请求为止。该标识即为 traceId,通过该标识,就能将不同服务调用的日志串联起来。简而言之,在整个Http的调用中(FeignClient或者RestTemplate)中,我们可以标识一个TraceId的记录,在Http的Request过程中,将TraceID传递到提供服务的服务端,提供服务的服务端在Reuqest中获取TraceId,同样的方式,将整个TraceId传递到他的服务提供方,这样在整个至上而下的调用链路中,都具有相同的TraceId,通过TraceId把各个链路中的服务的日志归组合并,这样就得到了一条条不同TraceId的调用链路, 这也就是链路追踪的主要原理, 链路追踪还有另一个国内的产品Skywalking, 也已经成为了Apache里的顶级开源项目,虽然在具体的实现上和Sleuth有差异,但是使用的原理是一样的。


MDC(Mapped Diagnostic Contexts)

通过上面的方式,我们就有了实现链路追踪的实现方式了, MDC((Mapped Diagnostic Contexts))翻译过来就是映射的诊断上下文 。意思是:在日志中 (映射的) 请求ID(requestId),可以作为我们定位 (诊断) 问题的关键字 (上下文)。这并不是一个新鲜的产物,MDC类基本原理其实非常简单,其内部持有一个ThreadLocal实例,用于保存context数据,MDC提供了put/get/clear等几个核心接口,用于操作ThreadLocal中的数据;ThreadLocal中的K-V,可以在logback.xml中声明,即在layout中通过声明 %X{Key} 来打印MDC中保存的此key对应的value在日志中。具体有关MDC的东西可以单独去百度有关MDC的文章,Http的链路追踪traceId这个标识,也就是通过MDC的方式来进行实现的。


Sleuth

sleuth在SpringCloud分布式系统中提供追踪解决方案,通过Sleuth可以记录下链路追踪的相关信息,并且将相关的链路调用信息发送给指定的统计端和展示端,比如Zipkin

Spring Cloud Sleuth关键词(基于 Google Dapper)


  • Span:基本工作单元,发送一个远程调度任务 就会产生一个Span,Span是一个64位ID唯一标识的,Trace是用另一个64位ID唯一标识的,Span还有其他数据信息,比如摘要、时间戳事件、Span的ID、以及进度ID。
  • Trace:一系列Span组成的一个树状结构。请求一个微服务系统的API接口,这个API接口,需要调用多个微服务,调用每个微服务都会产生一个新的Span,所有由这个请求产生的Span组成了这个Trace。
  • Annotation:用来及时记录一个事件的,一些核心注解用来定义一个请求的开始和结束 。这些注解包括以下:
  • cs - Client Sent -客户端发送一个请求,这个注解描述了这个Span的开始
  • sr - Server Received -服务端获得请求并准备开始处理它,如果将其sr减去cs时间戳便可得到网络传输的时间。
  • ss - Server Sent (服务端发送响应)–该注解表明请求处理的完成(当请求返回客户端),如果ss的时间戳减去sr时间戳,就可以得到服务器请求的时间。
  • cr - Client Received (客户端接收响应)-此时Span的结束,如果cr的时间戳减去cs时间戳便可以得到整个请求所消耗的时间。


Zipkin

Zipkin是 Twitter 的一个开源项目,基于 Google Dapper实现。可以使用它来收集各个服务器上请求链路的跟踪数据,并通过它提供的 REST API 接口来辅助我们查询跟踪数据以实现对分布式系统的监控程序,从而及时地发现系统中出现的延迟升高问题并找出系统性能瓶颈的根源。除了面向开发的API接口之外,它也提供了方便的 UI 组件帮助我们直观的搜索跟踪信息和分析请求链路明细,比如:可以查询某段时间内各用户请求的处理时间等。

简而言之Zipkin采集 sleuth 在客户端的数据,并提供可视化界面做查询展示。

Docker启动Zipkin


docker run -d -p 9411:9411 openzipkin/zipkin


访问Zipkin的图形页面

点开某一个请求后,会看到详细的调用链请求信息:


SpringCloud使用Sleuth

在SpringCloud项目中使用Sleuth进行链路追踪非常的方便,只需要在项目中映入Sleuth的Starter,如果Sleuth的采集链路追踪的信息需要Push到Zipkin的话,再引入Zipkin的Starter,并且配置上Zipkin Server的服务地址即可。

引入相关的依赖包和Start


org.springframework.cloud spring-cloud-sleuth-zipkin

org.springframework.cloud spring-cloud-starter-sleuth

如上的pom.xml文件,加入了Sleuth的starter以及Zipkin的支持, 在SpringCloud的微服务的Restful的调用中FeignClient以及RestTemplate将会被Sleuth进行记录,并发送到Zipkin的服务地址。

配置Zipkin的服务地址

spring:zipkin: base-url: http://localhost:9411/sender:type: websleuth:sampler:#抽样百分比,默认10%的数据发到zipkin,1为100%probability: 1

通过以上的方式,在我们的SpringCloud的微服务云体系中,我们的每个微服务云的服务调用都将进入到调用追踪的trace范围,然后通过Zipkin提供的图形显示的工具,就可以一目了然的了解到我们的每个服务调用的链路跟踪的情况,通过链路追踪的解决方案,当整个请求变慢或不可用时,我们就可以得知该请求是由某个或某些后端服务引起的,快读定位服务故障点,并对症下药。


使用MQ来push信息

通过上面的方式,每个微服务的调用追踪都会向Zipkin Server发出Http请求,当内部网络阻塞时,可能会引起主业务调用的阻塞,从而导致更严重的后果,所以这个时候我们可以考虑通过Stream或者时MQ的方式来异步的处理Sleuth发过来的请求;

我们的SpringCloud的微服务端,只需要引入支持Stream和MQ的starter即可


org.springframework.cloudspring-cloud-sleuth-zipkin-stream

org.springframework.cloudspring-cloud-starter-stream-rabbit
org.springframework.cloudspring-cloud-starter-sleuth

Zipkin Server的配置也相应的调整;


Zipkin高级用法持久化

Zipkin默认把Sleuth的日志信息保存在内存里,这样每次重新启动Zipkin都会丢失以前的日志信息,可以通过修改Zipkin的配置,让Zipkin Server持久化所有的日志到数据库里。关于持久化和Zipkin支持MQ的方式,我们讲在以后的文章中再进行介绍。


结束语

每个服务调用的链路跟踪的情况,通过链路追踪的解决方案,当整个请求变慢或不可用时,我们就可以得知该请求是由某个或某些后端服务引起的,快读定位服务故障点,并对症下药。本文主要介绍的是通过Sleuth+Zipking的方式实现SpringCloud的微服务云链路追踪,在文中我们提到了有关Zipkin的MQ接收sleuth日志信息,和日志信息持久化的用法,我们将在以后的文章中介绍, 有关Skywalking这个同样可以作为微服务体系中的链路追踪的解决方案,我们以后也会在专门的文章里来单独介绍Skywalking。 还望大家持续关注笔者的每个文章,关注笔者,不要错过精彩。

谢谢大家持续关注。


推荐阅读
  • Linux如何安装Mongodb的详细步骤和注意事项
    本文介绍了Linux如何安装Mongodb的详细步骤和注意事项,同时介绍了Mongodb的特点和优势。Mongodb是一个开源的数据库,适用于各种规模的企业和各类应用程序。它具有灵活的数据模式和高性能的数据读写操作,能够提高企业的敏捷性和可扩展性。文章还提供了Mongodb的下载安装包地址。 ... [详细]
  • 生成式对抗网络模型综述摘要生成式对抗网络模型(GAN)是基于深度学习的一种强大的生成模型,可以应用于计算机视觉、自然语言处理、半监督学习等重要领域。生成式对抗网络 ... [详细]
  • Week04面向对象设计与继承学习总结及作业要求
    本文总结了Week04面向对象设计与继承的重要知识点,包括对象、类、封装性、静态属性、静态方法、重载、继承和多态等。同时,还介绍了私有构造函数在类外部无法被调用、static不能访问非静态属性以及该类实例可以共享类里的static属性等内容。此外,还提到了作业要求,包括讲述一个在网上商城购物或在班级博客进行学习的故事,并使用Markdown的加粗标记和语句块标记标注关键名词和动词。最后,还提到了参考资料中关于UML类图如何绘制的范例。 ... [详细]
  • 云原生边缘计算之KubeEdge简介及功能特点
    本文介绍了云原生边缘计算中的KubeEdge系统,该系统是一个开源系统,用于将容器化应用程序编排功能扩展到Edge的主机。它基于Kubernetes构建,并为网络应用程序提供基础架构支持。同时,KubeEdge具有离线模式、基于Kubernetes的节点、群集、应用程序和设备管理、资源优化等特点。此外,KubeEdge还支持跨平台工作,在私有、公共和混合云中都可以运行。同时,KubeEdge还提供数据管理和数据分析管道引擎的支持。最后,本文还介绍了KubeEdge系统生成证书的方法。 ... [详细]
  • 这是原文链接:sendingformdata许多情况下,我们使用表单发送数据到服务器。服务器处理数据并返回响应给用户。这看起来很简单,但是 ... [详细]
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • Google Play推出全新的应用内评价API,帮助开发者获取更多优质用户反馈。用户每天在Google Play上发表数百万条评论,这有助于开发者了解用户喜好和改进需求。开发者可以选择在适当的时间请求用户撰写评论,以获得全面而有用的反馈。全新应用内评价功能让用户无需返回应用详情页面即可发表评论,提升用户体验。 ... [详细]
  • 在重复造轮子的情况下用ProxyServlet反向代理来减少工作量
    像不少公司内部不同团队都会自己研发自己工具产品,当各个产品逐渐成熟,到达了一定的发展瓶颈,同时每个产品都有着自己的入口,用户 ... [详细]
  • 深度学习中的Vision Transformer (ViT)详解
    本文详细介绍了深度学习中的Vision Transformer (ViT)方法。首先介绍了相关工作和ViT的基本原理,包括图像块嵌入、可学习的嵌入、位置嵌入和Transformer编码器等。接着讨论了ViT的张量维度变化、归纳偏置与混合架构、微调及更高分辨率等方面。最后给出了实验结果和相关代码的链接。本文的研究表明,对于CV任务,直接应用纯Transformer架构于图像块序列是可行的,无需依赖于卷积网络。 ... [详细]
  • 解决nginx启动报错epoll_wait() reported that client prematurely closed connection的方法
    本文介绍了解决nginx启动报错epoll_wait() reported that client prematurely closed connection的方法,包括检查location配置是否正确、pass_proxy是否需要加“/”等。同时,还介绍了修改nginx的error.log日志级别为debug,以便查看详细日志信息。 ... [详细]
  • Oracle优化新常态的五大禁止及其性能隐患
    本文介绍了Oracle优化新常态中的五大禁止措施,包括禁止外键、禁止视图、禁止触发器、禁止存储过程和禁止JOB,并分析了这些禁止措施可能带来的性能隐患。文章还讨论了这些禁止措施在C/S架构和B/S架构中的不同应用情况,并提出了解决方案。 ... [详细]
  • 本文详细介绍了Android中的坐标系以及与View相关的方法。首先介绍了Android坐标系和视图坐标系的概念,并通过图示进行了解释。接着提到了View的大小可以超过手机屏幕,并且只有在手机屏幕内才能看到。最后,作者表示将在后续文章中继续探讨与View相关的内容。 ... [详细]
  • 带添加按钮的GridView,item的删除事件
    先上图片效果;gridView无数据时显示添加按钮,有数据时,第一格显示添加按钮,后面显示数据:布局文件:addr_manage.xml<?xmlve ... [详细]
  • 本文介绍了一个Magento模块,其主要功能是实现前台用户利用表单给管理员发送邮件。通过阅读该模块的代码,可以了解到一些有关Magento的细节,例如如何获取系统标签id、如何使用Magento默认的提示信息以及如何使用smtp服务等。文章还提到了安装SMTP Pro插件的方法,并给出了前台页面的代码示例。 ... [详细]
  • 1简介本文结合数字信号处理课程和Matlab程序设计课程的相关知识,给出了基于Matlab的音乐播放器的总体设计方案,介绍了播放器主要模块的功能,设计与实现方法.我们将该设 ... [详细]
author-avatar
许桂欢_173
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有