SpringCloud相关组件——分布式链路跟踪!

分布式链路跟踪

已经可以通过如Hystrix Dashboard和Spring Boot Actuator等方式监控服务的运行状况,微服务的调用和依赖往往是复杂的,如图3.2所示,这时如果系统出现异常,随着系统的调用链越来越长,我们将无法快速地定位,甚至无法定位到底哪个服务出现了问题。

所以需要一种可以追踪调用链、快速定位问题信息的工具,分布式链路跟踪就是这种工具。同样地,Spring Cloud也为我们提供了分布式链路跟踪的框架:Spring Cloud Sleuth。

设计要素和术语

凡是跟踪或监控系统都会对业务代码有一定的侵入性,所以设计的首要目的是低侵入性,所有的埋点都应该尽量少地侵入或不侵入业务代码,从而减少开发人员的负担,3.3节中监控方法的调用次数的例子就是不好的设计,将埋点直接写在了业务代码中。

其次,只要是埋点,就会涉及数据的收集、传递和存储等操作,会有一定的资源开销,但我们要尽可能地降低这些开销,降低埋点本身的性能消耗等非业务系统本身的开销。例如,一个接口本身运行只需要200ms,埋点需要1s,这个接口整体运行下来需要1.2s,这就得不偿失了。

跟踪系统一定要支持分布式,要具有良好的扩展能力。除了具备这些能力,一个完整的分布式跟踪系统还应该具备日志的生成、收集和存储的功能,以及统计和分析日志数据的功能,此外,还有展示结果辅助决策的功能。

满足以上几点,才能算是一个好的分布式链路跟踪系统。SpringCloud Sleuth中使用了Dapper的术语,其中要了解以下关键术语。

(1)Span:最基本的工作单元,如一次调用,Span中描述了该工作单元的基本信息。

(2)Trace:由一串Span组成的树状的链路,通过对Trace的分析可以得到很多有用的信息。

(3)Annotation:用于及时记录事件的存在,主要包括CS、SR、SS和CR事件,详细描述如下。

①CS:Client Sent,客户提出了请求。

②SR:Server Received,服务端获得请求并开始处理它。

③SS:Server Sent,响应被服务端发送回客户端。

④CR:Client Received,客户端已成功收到服务端的响应。

Spring Cloud Sleuth链路监控

Spring Cloud Sleuth的使用大量借助了Dapper、Zipkin和HTrace等开源框架,用于记录和追踪链路数据,对于一般使用者来讲,跟踪是隐形的,并且与外部系统的交互都会有检测,我们可以通过Sleuth简单地在日志中捕获数据,也可以将数据发送到远程收集服务器上。

因此,要使用它也十分简单,以集成Zipkin为例,我们只需在想要监控的服务上增加Spring Cloud Sleuth和Zipkin的依赖即可,代码如下。

同时,需要在Gradle中配置Spring Cloud的依赖管理插件,代码如下。

Spring Cloud Sleuth有一个Sampler策略,可以通过这个策略来控制采样算法。采样器不会阻碍与Span相关ID的产生,但是会对导出以及附加事件标签的相关操作造成影响。Sleuth默认采样算法的实现是Reservoir sampling,具体的实现类是PercentageBasedSampler,默 认 的 采 样 比 例 为 0.1 ( 10% ) 。 不 过 可 以 通 过
spring.sleuth.sampler.percentage来设 置 ,所设 置 的值 为 0.0 ~1.0,1.0表示全部采集。若需要全部采集,则配置如下。

Spring Cloud Sleuth的工作模式就是将Trace和Span添加到Slf4jMDC,因此可以从日志聚合器中的给定跟踪或跨度中提取所有日志。同时,Sleuth还提供对分布式跟踪数据模型的抽象:traces、spans、annotations 和 key-value annotations 等 。 基 于 HTrace , 但 兼 容Zipkin和Dapper。其中,大部分埋点的出口和入口均来自Spring框架的组件,如Servlet Filter、RestTemplate、Cheduled Actions、Message Channels、Zuul Filters和Feign Client等。

Spring Cloud Sleuth会在不同的服务中自动添加相关的监控埋点,如果这里想要将埋点数据收集并进行统计,就要借助Zipkin服务器把埋点的数据收集起来,默认的Sleuth会将收集的数据发送到localhost(端口9411)上的Zipkin收集器服务上。也可以通过配置项spring.zipkin.baseUrl来修改这个地址,在application.yml中的配置如下。

可以通过Docker的方式快速启动一个Zipkin服务,指令如下。

Zipkin也可以通过安装源码或者Jar包的方式运行,Zipkin的运行并不是本章介绍的重点,感兴趣的读者可以查阅Zipkin的GitHub官方地址
https://github.com/openzipkin/zipkin进行学习。下面为大家展示Zipkin的一些监控效果,如图3.8所示。

图3.8 Zipkin监控效果

关于Spring Cloud Sleuth的基础功能就介绍到这里,SpringCloud Sleuth还有很多高级的用法,如抽样、传播、自定义Span等,可以到Spring的官网上查询详细的教程。

在学习众多技术实践后,读者基本上可以搭建一套包含服务治理、监控、熔断、跟踪等功能比较完善的微服务系统,但在实际项目中,还会遇到一些技术本身无法处理的问题,这时就需要在设计层面来优化微服务结构。契约测试就是一个很好的维护服务间相互依赖的设计。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值