【JAVA】分布式链路追踪技术概论

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
可观测链路 OpenTelemetry 版,每月50GB免费额度
简介: 【JAVA】分布式链路追踪技术概论

1.概述

当采用分布式架构后,一次请求会在多个服务之间流转,组成单次调用链的服务往往都分散在不同的服务器上。这就会带来一个问题:

故障难以溯源。

发起请求,然后请求报错,到底是调用链中哪一环出了问题?很难以定位。这时候就需要用到链路追踪技术了。所谓的链路追踪技术,也就是想办法让分布式系统中的单次请求的链路调用成为可被追踪的,便于在出现故障的时候进行快速的定位溯源。

目前有两套实现思路:

  • 基于日志来实现,常用到的有Sleuth、zipkin
  • 基于agent来实现,常用到的有skywaiking

本文着重于介绍链路追踪的概念和大概体系,sleuth、zipkin、skywalking具体的详细教程会在后续有文章推出进行具体介绍。

2.基于日志的实现

2.1.实现思想

当分布式系统中的一次请求报错时,如何定位错误?大家的第一反应可能都是去挨着看链路上各个服务的日志。这是肯定的,因为只能从这里下手。查这些日志的过程中有个很麻烦的问题——如何将不同服务间的日志对起来?一次调用在调用链的上一个服务留下了一条日志,我怎么知道这条日志对应着链路的下一个节点的哪条日志喃?所以要给每一次请求一个编号。基于这个思想,于是有了标准日志格式规范——OpenTracing。


OpenTracing规定了标准的日志格式如下:

服务ID,服务名称。

trace ID,每一次请求,调用链上的各个服务trace ID是相同的,也就是每一次请求的编号。

span ID,各个服务不同,用来区分链路上的不同节点。

导出标识,

2.2.sleuth

依赖:

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-sleuth</artifactId>
    <version>3.1.8</version>
</dependency>
 

这里我们搭建了一个简单的微服务集群,然后在APP、AuthenticationCenter、Bis中均引入sleuth:

AuthenticationCenter,鉴权中心,用来登录获取token,校验token是否合法。

APP,服务提供方。

Bis,Bis调用AuthenticationCenter登录,然后校验token是否合法,合法的话,再去调用APP中提供的服务:

最后去访问bis,会看到:

bis的日志:

AuthenticationCenter的日志:


可以看到Bis中一个方法中发出的所有请求在下游的trace ID全是一致的,只是span ID不同。

2.2.可视化

光有了日志,进行问题排查还是要一条条的翻,还是很繁琐。所以配套出现了可视化工具,由推特开发的——zipkin。其能对标准opentracing格式的日志进行收集和展示:

效果图:

 

3.基于agent的实现

skywalking是基于java agent来实现的,java agent是jkd 1.5引入的新特性,允许在main方法之前执行premain方法,来完成一些准备动作。关于 java gent,其在很多地方都有使用到,博主后续会有文章专门体系化的介绍java agent,并用java agent+字节码增强的方式来对类进行增强和监控,此处不展开。


sky walking的使用很简单,用-agent来启动即可:

java -javaagent:skywalking-agent.jar

-Dskywalking.agent.service_name=a-service

-Dskywalking.collector.backend_service=192.168.31.10:11800

-Dskywalking.logging.file_name=a-service-api.log
-jar a-service.jar
 

-Dskywalking.agent.service_name,应用的名称。

-Dskywalking.logging.file_name,数据需要上传到哪里。

skywalking拥有更加的强大和细粒度的图形监控界面。

相关实践学习
分布式链路追踪Skywalking
Skywalking是一个基于分布式跟踪的应用程序性能监控系统,用于从服务和云原生等基础设施中收集、分析、聚合以及可视化数据,提供了一种简便的方式来清晰地观测分布式系统,具有分布式追踪、性能指标分析、应用和服务依赖分析等功能。 分布式追踪系统发展很快,种类繁多,给我们带来很大的方便。但在数据采集过程中,有时需要侵入用户代码,并且不同系统的 API 并不兼容,这就导致了如果希望切换追踪系统,往往会带来较大改动。OpenTracing为了解决不同的分布式追踪系统 API 不兼容的问题,诞生了 OpenTracing 规范。OpenTracing 是一个轻量级的标准化层,它位于应用程序/类库和追踪或日志分析程序之间。Skywalking基于OpenTracing规范开发,具有性能好,支持多语言探针,无侵入性等优势,可以帮助我们准确快速的定位到线上故障和性能瓶颈。 在本套课程中,我们将全面的讲解Skywalking相关的知识。从APM系统、分布式调用链等基础概念的学习加深对Skywalking的理解,从0开始搭建一套完整的Skywalking环境,学会对各类应用进行监控,学习Skywalking常用插件。Skywalking原理章节中,将会对Skywalking使用的agent探针技术进行深度剖析,除此之外还会对OpenTracing规范作整体上的介绍。通过对本套课程的学习,不止能学会如何使用Skywalking,还将对其底层原理和分布式架构有更深的理解。本课程由黑马程序员提供。
目录
相关文章
|
4天前
|
存储 分布式计算 Java
如何在Java中实现分布式文件系统?
如何在Java中实现分布式文件系统?
|
4天前
|
存储 安全 算法
Java中的数据脱敏与隐私保护技术
Java中的数据脱敏与隐私保护技术
|
4天前
|
存储 消息中间件 运维
使用Java实现分布式日志系统
使用Java实现分布式日志系统
|
4天前
|
SQL NoSQL Java
如何在Java项目中实现分布式锁
如何在Java项目中实现分布式锁
|
4天前
|
缓存 算法 NoSQL
Java中的分布式缓存与一致性哈希算法
Java中的分布式缓存与一致性哈希算法
|
5天前
|
存储 负载均衡 算法
如何在Java中实现分布式存储系统
如何在Java中实现分布式存储系统
|
1天前
|
存储 算法 Java
分布式自增ID算法---雪花算法(SnowFlake)Java实现
分布式自增ID算法---雪花算法(SnowFlake)Java实现
|
1天前
|
存储 NoSQL Java
java为什么还需要分布式锁?
java为什么还需要分布式锁?
|
1天前
|
NoSQL 安全 Java
技术好文:Redis分布式锁的正确实现方式
技术好文:Redis分布式锁的正确实现方式
|
3天前
|
消息中间件 Java 中间件
Java面试题:解释分布式事务的概念,讨论常见的分布式事务解决方案。
Java面试题:解释分布式事务的概念,讨论常见的分布式事务解决方案。
8 0