Sleuth 也进入维护模式,未来替换方向 Micrometer Tracing。
Sleuth 支持的最高 Spring Boot 为 2.X ,更高版本使用 Micrometer。
在微服务框架中,一个由客户端发起的请求在后端系统中会经过多个不同的服务节点调用来协同产生最后的请求结果,每一个前端请求都会形成一条复杂的分布式服务调用链路,链路中的任何一环出现高延时或错误都会引起整个请求失败。
随着问题越来越深入和微服务的增多,导致链条变得越来越复杂。我们需要一个能够获取链路中各类信息,提升微服务各项数据指标的技术。
分布式链路追踪就是将一次分布式请求还原成调用链路进行日志记录、性能监控并将调用情况集中展示。比如各个服务节点的耗时、请求机器、每个服务节点的请求状态等。
Spring Cloud Sleuth(Micrometer) 提供了一套完整的分布式链路追踪解决方案(Distributed Tracing)并且兼容支持了 zipkin。
行业内其他的分布式追踪方案:Cat、Zipkin、Pinpoint、Skywalking
Spring Cloud 内原生的为 Zipkin,脱离原生建议使用 Skywalking。
链路追踪是如何实现的?
链路追踪会再每个服务调用时给服务加上 TraceID 和 SpanID。链路通过 TraceID 唯一标识,通过 SpanID 标识发起的请求信息,各子服务再通过格子内部的 parentID 相互关联(不进行扩展)。
Zipkin 是一种分布式链路追踪系统的图形化工具,Zipkin 是 Twitter 开源的分布式追踪系统,能够手机微服务运行过程中的实时调用链路信息,并将这些调用链路信息展示到图形化界面上供开发人员分析。开发人员可以从 Zipkin 中分析出链路中的性能瓶颈,识别问题从而精确定位。
学习地址:OpenZipkin · A distributed tracing system
zipkin 下载 jar 包后双击启动即可,下载地址见学习地址。
zipkin 本地访问网址:http://localhost:9411/
在父工程pom下新增链路追踪配置
<!--micrometer-tracing-bom导入追踪版本中心-->
<dependency>
<groupId>io.micrometer</groupId>
<artifactId>micrometer-tracing-bom</artifactId>
<version>${micrometer-tracing.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!--micrometer-tracing指标追踪-->
<dependency>
<groupId>io.micrometer</groupId>
<artifactId>micrometer-tracing</artifactId>
<version>${micrometer-tracing.version}</version>
</dependency>
<!--micrometer-tracing-bridge-brave适配zipkin-->
<dependency>
<groupId>io.micrometer</groupId>
<artifactId>micrometer-tracing-bridge-brave</artifactId>
<version>${micrometer-tracing.version}</version>
</dependency>
<!--micrometer-observation 指标监控-->
<dependency>
<groupId>io.micrometer</groupId>
<artifactId>micrometer-observation</artifactId>
<version>${micrometer-observation.version}</version>
</dependency>
<!--feign-micrometer-->
<dependency>
<groupId>io.github.openfeign</groupId>
<artifactId>feign-micrometer</artifactId>
<version>${feign-micrometer.version}</version>
</dependency>
<!--zipkin-reporter-brave-->
<dependency>
<groupId>io.zipkin.reporter2</groupId>
<artifactId>zipkin-reporter-brave</artifactId>
<version>${zipkin-reporter-brave.version}</version>
</dependency>
在调用方和服务方模块中都添加依赖
<!--micrometer-tracing指标追踪-->
<dependency>
<groupId>io.micrometer</groupId>
<artifactId>micrometer-tracing</artifactId>
</dependency>
<!--micrometer-tracing-bridge-brave适配zipkin-->
<dependency>
<groupId>io.micrometer</groupId>
<artifactId>micrometer-tracing-bridge-brave</artifactId>
</dependency>
<!--micrometer-observation 指标监控-->
<dependency>
<groupId>io.micrometer</groupId>
<artifactId>micrometer-observation</artifactId>
</dependency>
<!--feign-micrometer-->
<dependency>
<groupId>io.github.openfeign</groupId>
<artifactId>feign-micrometer</artifactId>
</dependency>
<!--zipkin-reporter-brave-->
<dependency>
<groupId>io.zipkin.reporter2</groupId>
<artifactId>zipkin-reporter-brave</artifactId>
</dependency>
调用方和服务方模块的 application.yml 文件根路径中添加配置:
management:
zipkin:
tracing:
endpoint: http://localhost:9411/api/v2/spans
tracing:
sampling:
probability: 1.0 # 采样率默认为0.1,含义是10次记录采集一次 1.0表示全部采集
服务方中新增Controller
@RestController
public class PayMicrometerController {
@PostMapping("pay/micrometer")
public ResultVO getPayMicrometer(@RequestBody MicrometerDTO micrometerDTO){
return new ResultVO(200, "成功", micrometerDTO.getId()+"/"+System.currentTimeMillis());
}
}
api 中新增访问入口(如有疑问请看前文)
/**
* 验证 micrometer
* @param micrometerDTO
* @return
*/
@PostMapping("pay/micrometer")
public ResultVO getPayMicrometer(@RequestBody MicrometerDTO micrometerDTO);
服务方新增调用
@RestController
public class OrderMicrometerController {
@Resource
private OpenFeignApi openFeignApi;
@PostMapping("feign/micrometer")
public ResultVO getPayMicrometer(@RequestBody MicrometerDTO micrometerDTO) {
return openFeignApi.getPayMicrometer(micrometerDTO);
}
}
此时进行访问,在 Zipkin 页面(http://localhost:9411/)中,点击右上角的 RUN QUERY 查询可以查看对应的链路时间。
右侧设置按钮可以调整查询间隔或其他时间。
下方 Service filters 可以选择查看当前某个启用的服务。
点击对应数据的 show 可以看到具体的细节,其中包含一个请求的完整过程。首先请求通过 cloud-consumer-service(调用方)发送 post 请求到 /feign/micrometer url,之后通过 circuit-breaker 断路器,经过 post 请求发送到 cloud-payment-service(服务方)的 /pay/micrometer url,完成具体业务代码后进行返回,请求通过各个模块的时间均有体现。
页面右侧数据栏体现了服务名和 SpanID、ParentID 等详细参数,ParentID 为 none 表示该服务为第一服务。依次向下点击中间的请求信息,右侧的信息跟随变化,下一级请求的 ParentID 为上一级的 SpanID,以此记录链路信息。
上方 Dependencies 可以体现服务的调用依赖关系。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。