微服务实战05-服务链路追踪

本文涉及的产品
云原生网关 MSE Higress,422元/月
注册配置 MSE Nacos/ZooKeeper,182元/月
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
简介: 微服务实战05-服务链路追踪

在前面的例子里,我们有两个微服务,分别是订单服务和物流服务,随着业务的增加,就会有越来越多的微服务存在,他们之间也会有更加复杂的调用关系。


这个调用关系,仅仅通过观察代码,会越来越难以识别,所以就需要通过 zipkin 服务链路追踪服务器 这个东西来用图片进行识别了。


Zipkin是一个分布式的服务跟踪系统,可以帮助我们收集分布式系统的性能数据,并跟踪请求在不同服务间的流转情况。 它通过在不同的服务间发送轻量级跟踪数据并存储它们,来帮助我们理解不同子系统间的互动状态和分析性能指标。


Zipkin的核心是将分布式交易的跟踪信息进行聚合、存储和展示,并提供了强大的工具来分析这些数据和定位系统问题。Zipkin主要包括四个组件:Collector、Storage、API和UI,下面来分别介绍。


Collector:用于聚合、处理和存储跟踪数据,并将这些数据发送到Storage进行存储。


Storage:将接收到的跟踪数据存储在后端存储(如:Mysql、Elasticsearch等)中,用于以后查询和分析。


API:用于存储、查询跟踪数据,并通过UI展示查询结果。


UI:展示通过API查询到的跟踪数据,以及相关的分析工具。


改造订单+物流服务

先添加依赖:

56.png


zipkin依赖

<dependency>
  <groupId>org.springframework.cloud</groupId>
  <artifactId>spring-cloud-starter-zipkin</artifactId>
 </dependency> 

两个的配置文件都加上

spring:
  zipkin:
    base-url: http://localhost:9411

57.png58.png

抽样策略

Zipkin支持通过配置抽样策略的方式来控制采集和存储跟踪数据的量,从而避免造成系统资源占用过高,降低系统的可用性。 Zipkin提供了三种基本的采样策略:


AlwaysSample:表示始终采样所有的请求数据,不论你的系统请求频率有多高,对性能会有很大的影响,不建议在生产环境中使用。


PercentageBasedSampler:表示基于一定比例进行采样。其中,比率由参数“rate”来指定。例如,设定为0.5,则意味着只有一半的请求会被保留下来,另一半请求则会被丢弃。这个策略适用于大多数生产环境中的情况。


ProbabilitySampler:表示以一个定义好的概率来决定是否采样一个请求。概率值由参数“samplingProbability”来确定,默认为0.001。


如果以上的采样策略不能够满足您的需求,您也可以自己实现一个采取策略,Zipkin提供了接口可以供您扩展,只需要实现Sampler接口即可。


在启动类里配置 Sampler 抽样策略: ALWAYS_SAMPLE 表示持续抽样


@Bean
public Sampler defaultSampler() {
   return Sampler.ALWAYS_SAMPLE;
}  

两个服务的启动类都要加。


zipkin下载

你可以在Zipkin官方网站上下载最新版本的Zipkin Server jar包。下载地址为:https://search.maven.org/artifact/io.zipkin.java/zipkin-server 你也可以在Maven中央仓库中查找对应版本的依赖。具体依赖信息如下:


<dependency> 
  <groupId>io.zipkin.java</groupId> 
  <artifactId>zipkin-server</artifactId> 
  <version>2.23.2</version> 
</dependency> 

可以修改上述配置中的版本号来获取不同版本的Zipkin Server jar包。


下载好了以后,用 java -jar命令运行,如果端口被占用,用下面的方法来解除。(以下方法仅适用于我遇到的情况)


查询9411端口使用情况

netstat -ano | findstr ":9411"

发现被19500占用

  TCP    0.0.0.0:9411           0.0.0.0:0              LISTENING       19500
  TCP    [::]:9411              [::]:0                 LISTENING       19500

查看19500是什么进程

 tasklist | findstr "19500"

 

javaw.exe   19500 Console   1    585,120 K

最终发现是javaw,执行命令 taskkill /im javaw.exe /f 杀死进程即可,最好使用 taskkill /pid 进程号 /f 按进程号杀死进程。

重新启动jar,成功了。

59.png

验证

依次启动注册中心,和两个服务,其中oms有1个集群共两个端口。

60.png

访问:http://localhost:9411/zipkin/dependency/

61.png

访问一次:http://localhost:8084/logistic/create 这就触发一次feign调用。

再访问zipkin, 就看到了这个:

62.png


总结

Zipkin是一种分布式跟踪系统,它可以帮助开发人员识别分布式系统中的性能问题。以下是Zipkin的优缺点:


优点:


易于使用:Zipkin易于安装和配置,并提供简单直观的用户界面,使开发人员可以轻松使用和理解系统性能和瓶颈问题。


能够识别延迟:Zipkin能够帮助开发人员识别分布式系统中的延迟并分析其原因。开发人员可以使用这些信息来查找瓶颈和优化性能。


可扩展性:Zipkin使用代码库和模块结构,以适应大型分布式系统,因此随着系统的扩大,它可以轻松地扩展。


缺点:


对于小规模项目来说,Zipkin的配置可能会有些冗长复杂,需要一定的学习成本。


Zipkin需要将跟踪数据存储在专门的存储系统中,存储系统的维护和管理可能需要一定的成本和精力。


在高并发环境中,Zipkin的性能可能会受到影响,因为它需要捕获和处理大量的跟踪数据。


zipkin存储数据

注意,本教程并没有用数据库来给zipkin提供存储, Zipkin Server默认存储追踪数据至内存中,这种方式并不适合生产环境,一旦server关闭重启或者服务崩溃,就会导致历史数据消失。Zipkin支持修改存储策略使用其他存储组件,支持MySQL,Elasticsearch等。


1、数据库脚本

(将链路追踪数据存储到MySQL中,实现同步处理)

打开MySQL数据库,创建zipkin库,执行一下SQL脚本。

官网地址:zipkin/mysql.sql at master · openzipkin/zipkin · GitHub


CREATE TABLE IF NOT EXISTS zipkin_spans (
  `trace_id_high` BIGINT NOT NULL DEFAULT 0 COMMENT 'If non zero, this means the trace uses 128 bit traceIds instead of 64 bit',
  `trace_id` BIGINT NOT NULL,
  `id` BIGINT NOT NULL,
  `name` VARCHAR(255) NOT NULL,
  `remote_service_name` VARCHAR(255),
  `parent_id` BIGINT,
  `debug` BIT(1),
  `start_ts` BIGINT COMMENT 'Span.timestamp(): epoch micros used for endTs query and to implement TTL',
  `duration` BIGINT COMMENT 'Span.duration(): micros used for minDuration and maxDuration query',
  PRIMARY KEY (`trace_id_high`, `trace_id`, `id`)
) ENGINE=InnoDB ROW_FORMAT=COMPRESSED CHARACTER SET=utf8 COLLATE utf8_general_ci;
ALTER TABLE zipkin_spans ADD INDEX(`trace_id_high`, `trace_id`) COMMENT 'for getTracesByIds';
ALTER TABLE zipkin_spans ADD INDEX(`name`) COMMENT 'for getTraces and getSpanNames';
ALTER TABLE zipkin_spans ADD INDEX(`remote_service_name`) COMMENT 'for getTraces and getRemoteServiceNames';
ALTER TABLE zipkin_spans ADD INDEX(`start_ts`) COMMENT 'for getTraces ordering and range';
CREATE TABLE IF NOT EXISTS zipkin_annotations (
  `trace_id_high` BIGINT NOT NULL DEFAULT 0 COMMENT 'If non zero, this means the trace uses 128 bit traceIds instead of 64 bit',
  `trace_id` BIGINT NOT NULL COMMENT 'coincides with zipkin_spans.trace_id',
  `span_id` BIGINT NOT NULL COMMENT 'coincides with zipkin_spans.id',
  `a_key` VARCHAR(255) NOT NULL COMMENT 'BinaryAnnotation.key or Annotation.value if type == -1',
  `a_value` BLOB COMMENT 'BinaryAnnotation.value(), which must be smaller than 64KB',
  `a_type` INT NOT NULL COMMENT 'BinaryAnnotation.type() or -1 if Annotation',
  `a_timestamp` BIGINT COMMENT 'Used to implement TTL; Annotation.timestamp or zipkin_spans.timestamp',
  `endpoint_ipv4` INT COMMENT 'Null when Binary/Annotation.endpoint is null',
  `endpoint_ipv6` BINARY(16) COMMENT 'Null when Binary/Annotation.endpoint is null, or no IPv6 address',
  `endpoint_port` SMALLINT COMMENT 'Null when Binary/Annotation.endpoint is null',
  `endpoint_service_name` VARCHAR(255) COMMENT 'Null when Binary/Annotation.endpoint is null'
) ENGINE=InnoDB ROW_FORMAT=COMPRESSED CHARACTER SET=utf8 COLLATE utf8_general_ci;
ALTER TABLE zipkin_annotations ADD UNIQUE KEY(`trace_id_high`, `trace_id`, `span_id`, `a_key`, `a_timestamp`) COMMENT 'Ignore insert on duplicate';
ALTER TABLE zipkin_annotations ADD INDEX(`trace_id_high`, `trace_id`, `span_id`) COMMENT 'for joining with zipkin_spans';
ALTER TABLE zipkin_annotations ADD INDEX(`trace_id_high`, `trace_id`) COMMENT 'for getTraces/ByIds';
ALTER TABLE zipkin_annotations ADD INDEX(`endpoint_service_name`) COMMENT 'for getTraces and getServiceNames';
ALTER TABLE zipkin_annotations ADD INDEX(`a_type`) COMMENT 'for getTraces and autocomplete values';
ALTER TABLE zipkin_annotations ADD INDEX(`a_key`) COMMENT 'for getTraces and autocomplete values';
ALTER TABLE zipkin_annotations ADD INDEX(`trace_id`, `span_id`, `a_key`) COMMENT 'for dependencies job';
CREATE TABLE IF NOT EXISTS zipkin_dependencies (
  `day` DATE NOT NULL,
  `parent` VARCHAR(255) NOT NULL,
  `child` VARCHAR(255) NOT NULL,
  `call_count` BIGINT,
  `error_count` BIGINT,
  PRIMARY KEY (`day`, `parent`, `child`)
) ENGINE=InnoDB ROW_FORMAT=COMPRESSED CHARACTER SET=utf8 COLLATE utf8_general_ci;

把以上代码转存成sql文件

62.png


2、部署Zipkin服务端

添加启动参数,重新部署服务端

官网地址:zipkin/zipkin-server-shared.yml at master · openzipkin/zipkin · GitHub

java -jar zipkin-server-2.10.1-exec.jar --STORAGE_TYPE=mysql --MYSQL_HOST=localhost --MYSQL_TCP_PORT=3306 --MYSQL_USER=root --MYSQL_PASS=NULL --MYSQL_DB=zipkin

再调用服务,可以看到数据存到mysql了。

63.png



相关实践学习
分布式链路追踪Skywalking
Skywalking是一个基于分布式跟踪的应用程序性能监控系统,用于从服务和云原生等基础设施中收集、分析、聚合以及可视化数据,提供了一种简便的方式来清晰地观测分布式系统,具有分布式追踪、性能指标分析、应用和服务依赖分析等功能。 分布式追踪系统发展很快,种类繁多,给我们带来很大的方便。但在数据采集过程中,有时需要侵入用户代码,并且不同系统的 API 并不兼容,这就导致了如果希望切换追踪系统,往往会带来较大改动。OpenTracing为了解决不同的分布式追踪系统 API 不兼容的问题,诞生了 OpenTracing 规范。OpenTracing 是一个轻量级的标准化层,它位于应用程序/类库和追踪或日志分析程序之间。Skywalking基于OpenTracing规范开发,具有性能好,支持多语言探针,无侵入性等优势,可以帮助我们准确快速的定位到线上故障和性能瓶颈。 在本套课程中,我们将全面的讲解Skywalking相关的知识。从APM系统、分布式调用链等基础概念的学习加深对Skywalking的理解,从0开始搭建一套完整的Skywalking环境,学会对各类应用进行监控,学习Skywalking常用插件。Skywalking原理章节中,将会对Skywalking使用的agent探针技术进行深度剖析,除此之外还会对OpenTracing规范作整体上的介绍。通过对本套课程的学习,不止能学会如何使用Skywalking,还将对其底层原理和分布式架构有更深的理解。本课程由黑马程序员提供。
相关文章
|
4月前
|
监控 Java API
Spring Boot 3.2 结合 Spring Cloud 微服务架构实操指南 现代分布式应用系统构建实战教程
Spring Boot 3.2 + Spring Cloud 2023.0 微服务架构实践摘要 本文基于Spring Boot 3.2.5和Spring Cloud 2023.0.1最新稳定版本,演示现代微服务架构的构建过程。主要内容包括: 技术栈选择:采用Spring Cloud Netflix Eureka 4.1.0作为服务注册中心,Resilience4j 2.1.0替代Hystrix实现熔断机制,配合OpenFeign和Gateway等组件。 核心实操步骤: 搭建Eureka注册中心服务 构建商品
745 3
|
2月前
|
Cloud Native Serverless API
微服务架构实战指南:从单体应用到云原生的蜕变之路
🌟蒋星熠Jaxonic,代码为舟的星际旅人。深耕微服务架构,擅以DDD拆分服务、构建高可用通信与治理体系。分享从单体到云原生的实战经验,探索技术演进的无限可能。
微服务架构实战指南:从单体应用到云原生的蜕变之路
|
2月前
|
监控 Cloud Native Java
Spring Boot 3.x 微服务架构实战指南
🌟蒋星熠Jaxonic,技术宇宙中的星际旅人。深耕Spring Boot 3.x与微服务架构,探索云原生、性能优化与高可用系统设计。以代码为笔,在二进制星河中谱写极客诗篇。关注我,共赴技术星辰大海!(238字)
Spring Boot 3.x 微服务架构实战指南
|
6月前
|
缓存 负载均衡 监控
微服务架构下的电商API接口设计:策略、方法与实战案例
本文探讨了微服务架构下的电商API接口设计,旨在打造高效、灵活与可扩展的电商系统。通过服务拆分(如商品、订单、支付等模块)和标准化设计(RESTful或GraphQL风格),确保接口一致性与易用性。同时,采用缓存策略、负载均衡及限流技术优化性能,并借助Prometheus等工具实现监控与日志管理。微服务架构的优势在于支持敏捷开发、高并发处理和独立部署,满足电商业务快速迭代需求。未来,电商API设计将向智能化与安全化方向发展。
421 102
|
4月前
|
负载均衡 监控 Java
微服务稳定性三板斧:熔断、限流与负载均衡全面解析(附 Hystrix-Go 实战代码)
在微服务架构中,高可用与稳定性至关重要。本文详解熔断、限流与负载均衡三大关键技术,结合API网关与Hystrix-Go实战,帮助构建健壮、弹性的微服务系统。
511 1
微服务稳定性三板斧:熔断、限流与负载均衡全面解析(附 Hystrix-Go 实战代码)
|
9月前
|
NoSQL 测试技术 MongoDB
微服务——MongoDB实战演练——MongoTemplate实现评论点赞
本节介绍如何使用MongoTemplate实现评论点赞功能。传统方法通过查询整个文档并更新所有字段,效率较低。为优化性能,采用MongoTemplate对特定字段直接操作。代码中展示了如何利用`Query`和`Update`对象构建更新逻辑,通过`update.inc(&quot;likenum&quot;)`实现点赞数递增。测试用例验证了功能的正确性,确保点赞数成功加1。
192 0
|
6月前
|
NoSQL Java 微服务
2025 年最新 Java 面试从基础到微服务实战指南全解析
《Java面试实战指南:高并发与微服务架构解析》 本文针对Java开发者提供2025版面试技术要点,涵盖高并发电商系统设计、微服务架构实现及性能优化方案。核心内容包括:1)基于Spring Cloud和云原生技术的系统架构设计;2)JWT认证、Seata分布式事务等核心模块代码实现;3)数据库查询优化与高并发处理方案,响应时间从500ms优化至80ms;4)微服务调用可靠性保障方案。文章通过实战案例展现Java最新技术栈(Java 17/Spring Boot 3.2)的应用.
507 9
|
11月前
|
存储 Prometheus Cloud Native
分布式系统架构6:链路追踪
本文深入探讨了分布式系统中的链路追踪理论,涵盖追踪与跨度的概念、追踪系统的模块划分及数据收集的三种方式。链路追踪旨在解决复杂分布式系统中请求流转路径不清晰的问题,帮助快速定位故障和性能瓶颈。文中介绍了基于日志、服务探针和边车代理的数据收集方法,并简述了OpenTracing、OpenCensus和OpenTelemetry等链路追踪协议的发展历程及其特点。通过理解这些概念,可以更好地掌握开源链路追踪框架的使用。
1149 41
|
存储 监控 开发者
分布式链路监控系统问题之系统拆分后链路追踪技术的问题如何解决
分布式链路监控系统问题之系统拆分后链路追踪技术的问题如何解决
183 0
|
消息中间件 SpringCloudAlibaba Java
【Springcloud Alibaba微服务分布式架构 | Spring Cloud】之学习笔记(八)Config服务配置+bus消息总线+stream消息驱动+Sleuth链路追踪
【Springcloud Alibaba微服务分布式架构 | Spring Cloud】之学习笔记(八)Config服务配置+bus消息总线+stream消息驱动+Sleuth链路追踪
1657 0