1、用另一种场景来类比Sleuth和Zipkin的作用
我们来设想一个快递公司的物流追踪系统。设你在网上购买了一本书,当你的订单提交后,后台系统会生成一个唯一的订单号,这个订单号就相当于Sleuth中的Trace ID。你的订单会经过几个主要的处理阶段:接单、打包、运输、配送,每个阶段都可以看作是微服务中的一个服务节点。
Sleuth的角色
- 接单:订单系统接收订单,标记订单状态为“待打包”,并将订单信息传递给打包部门。
- 打包:打包部门收到订单信息,开始准备商品,打包完成后,订单状态变为“待运输”,并通知运输部门。
- 运输:运输部门接到通知,将包裹发往目的地,途中可能经过多个中转站。
- 配送:最后,配送员从最近的仓库取出包裹,送到你的家门口。
在这个过程中,每个环节都是一个“Span”,Sleuth会记录每个Span的开始和结束时间,以及它与上一个Span的关系,比如打包环节是由接单环节触发的。这就像在每个包裹上贴上一个条形码,每次包裹经过一个处理点,条形码都会被扫描,记录下时间戳。
Zipkin的角色
Zipkin就像是快递公司的物流追踪网站,你可以输入订单号(Trace ID)来查看包裹的实时位置和历史轨迹。它收集了所有这些条形码扫描的信息,把它们整合起来,让你看到包裹从仓库到你手中的完整路径,包括每个处理点花费的时间。
为什么需要它们
在快递公司的场景中,如果没有物流追踪系统,一旦包裹丢失或延迟,查找原因会非常困难。同样,在微服务架构中,如果没有Sleuth和Zipkin,当某个服务调用失败或响应缓慢时,很难快速定位问题所在。有了Sleuth和Zipkin,开发人员可以像快递公司那样,迅速追踪到问题发生在哪个服务节点,以及它与其它服务的交互情况,从而更快地修复问题。
接下来我们就带着以下的问题走进微服务的世界里。
在分布式与微服务场景下,我们需要解决如下问题:
- 如何实时观测系统的整体调用链路情况。
- 如何快速发现并定位到问题。
- 如何尽可能精确的判断故障对系统的影响范围与影响程度。
- 如何尽可能精确的梳理出服务之间的依赖关系,并判断出服务之间的依赖关系是否合理。
- 如何尽可能精确的分析整个系统调用链路的性能与瓶颈点。
- 如何尽可能精确的分析系统的存储瓶颈与容量规划。
Spring Cloud Sleuth官方地址
ZipKin官方下载地址
提示:注意版本问题
2、分布式链路追踪的原理
分布式链路追踪是一种在分布式系统中跟踪请求流经多个服务的机制。在微服务架构中,一个用户请求可能需要跨越多个服务边界才能完成,而每个服务又可能调用其他服务。这种复杂的服务调用链使得传统的监控和日志记录难以有效诊断问题。分布式链路追踪正是为了解决这一难题而生,它的主要原理可以概括为以下几个关键点:
- Trace 和 Span 概念
- Trace:一个 Trace 代表一个完整的请求链路,即从客户端发起请求直到最终响应返回的全过程。每个 Trace 都有一个全局唯一的 ID。
- Span:Span 是 Trace 中的最小单位,表示一次服务调用,它可以包含开始时间、结束时间、调用耗时、调用的状态以及一些元数据(例如标签和注释)。每个 Span 也有一个唯一的 ID,并且可能关联到一个或多个 Tags。
- 传播 Context
在请求跨服务边界时,链路追踪系统会传播一个上下文(Context),其中包含了 Trace ID 和 Span ID,以及可能的采样决策。这样,每个服务节点都能识别出它属于哪一个 Trace,以及它在 Trace 中的位置。 - 数据收集和报告
每个服务节点在其本地会收集 Span 数据,包括时间戳、持续时间、状态代码等。这些数据随后会被报告给一个中央化的数据收集器,如 Zipkin 或 SkyWalking Server。 - 数据存储和查询
收集到的数据会被存储在一个持久化存储中,以便后续分析和查询。存储系统通常支持基于 Trace ID 的查询,以及更复杂的查询条件,如服务名称、时间范围等。 - 可视化和分析
通过可视化界面,链路追踪数据可以以图形化的方式展现出来,形成调用树或者调用链。这有助于快速识别瓶颈、异常和依赖关系。
3、ZipKin的使用
cmd中:java -jar zipkin-server-3.0.0-rc0-exec.jar
访问地址:http://localhost:94 11/zipkin/
4、Micrometer+ZipKin搭建链路监控步骤
- 父工程需要引入的依赖(POM文件):
<!--micrometer-tracing-bom导入链路追踪版本中心 1-->
<dependency><groupId>io.micrometer</groupId><artifactId>micrometer-tracing-bom</artifactId><version>1.2.0</version><type>pom</type><scope>import</scope>
</dependency>
<!--micrometer-tracing指标追踪 2-->
<dependency><groupId>io.micrometer</groupId><artifactId>micrometer-tracing</artifactId><version>1.2.0</version>
</dependency>
<!--micrometer-tracing-bridge-brave适配zipkin的桥接包 3-->
<dependency><groupId>io.micrometer</groupId><artifactId>micrometer-tracing-bridge-brave</artifactId><version>1.2.0</version>
</dependency>
<!--micrometer-observation 4-->
<dependency><groupId>io.micrometer</groupId><artifactId>micrometer-observation</artifactId><version>1.12.0</version>
</dependency>
<!--feign-micrometer 5-->
<dependency><groupId>io.github.openfeign</groupId><artifactId>feign-micrometer</artifactId><version>12.5</version>
</dependency>
<!--zipkin-reporter-brave 6-->
<dependency><groupId>io.zipkin.reporter2</groupId><artifactId>zipkin-reporter-brave</artifactId><version>2.17.0</version>
</dependency>
- 配置文件配置
#========================zipkin===================
management:zipkin:tracing:endpoint: http://localhost:9411/api/v2/spanstracing:sampling:probability: 1.0 #采样率默认为0.1(0.1就是10次只能有一次被记录下来),值越大收集越及时。
- 测试
- 测试之前要保证ZipKin已经成功启动了。。
- 其次要测试的每个微服务工程也已经启动,并成功注册Concul服务注册中心。
- 访问测试的地址,发送请求。
- 浏览器地址栏输入http:/localhost:9411回车,会出现以下界面:
- 点击【show】按钮查看:
- 还可以查看依赖关系: