31、Spring Cloud Sleuth与分布式追踪实战

Spring Cloud Sleuth与分布式追踪实战

1. Spring Cloud Sleuth简介

Spring Cloud Sleuth为Spring微服务实现了分布式追踪解决方案,它借鉴了Google的Dapper的许多概念和术语。在Sleuth中,基本工作单元称为“span”,它代表通信网络中两点之间执行的工作。例如,订单处理微服务接收客户端的订单并进行处理,然后与库存微服务同步通信,收到响应后将 ORDER_PROCESSING_COMPLETED 事件发布到消息系统。

每个span都有一个父span,一组形成树状结构的span被称为“trace”。对于给定的请求,trace的值在所有span中保持不变,trace ID有助于关联微服务之间的消息。

2. 使用Spring Cloud Sleuth进行分布式追踪

要运行相关示例,需要安装Java 8或更高版本、Maven 3.2或更高版本以及Git客户端。安装完成后,克隆Git仓库:

git clone https://github.com/microservices-for-enterprise/samples.git

示例代码位于 ch13 目录。

2.1 将Spring Cloud Sleuth与Spring Boot微服务集成

集成Sleuth和Spring Boot非常简单。下载Git仓库中的示例后,相关源代码位于 ch13/sample01 目录。

ch13/sample01/pom.xml 文件中添加以下Maven依赖:

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

此依赖会引入与Sleuth相关的所有依赖。Sleuth会拦截所有进入给定微服务的HTTP请求,检查消息中是否已有追踪信息,若有则提取并提供给相应的微服务。同时,Sleuth会将追踪信息注入Spring Mapped Diagnostic Context (MDC),使微服务生成的日志自动包含追踪数据。当HTTP请求从微服务发出时,Sleuth会再次将追踪信息注入出站请求或响应。

以下是 ch13/sample01/src/main/java/com/apress/ch13/sample01/service/OrderProcessing.java 中的示例代码,用于记录与订单检索请求相关的数据:

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

@RequestMapping(value = "/{id}", method = RequestMethod.GET)
public ResponseEntity<?> getOrder(@PathVariable("id") String orderId) {
    Logger logger = LoggerFactory.getLogger(OrderProcessing.class);
    logger.info("retrieving order:" + orderId);
    Item book1 = new Item("101", 1);
    Item book2 = new Item("103", 5);
    PaymentMethod myvisa = new PaymentMethod("VISA", "01/22", "John Doe",
            "201, 1st Street, San Jose, CA");
    Order order = new Order("101021", orderId, myvisa, new Item[] { book1, book2 },
            "201, 1st Street, San Jose, CA");
    return ResponseEntity.ok(order);
}

在运行代码之前,需要在 ch13/sample01/src/main/resources/application.properties 文件中配置以下重要属性:

spring.application.name=sample01
spring.sleuth.sampler.percentage=0.1

spring.application.name 属性的值会作为服务名称添加到日志中,同时还会包含trace ID和span ID。 spring.sleuth.sampler.percentage 属性表示需要追踪的请求百分比,默认值为0.1,即只有10%的请求会发布到Zipkin,将其设置为1.0则会发布所有请求。

运行订单处理微服务并调用它的步骤如下:
1. 在 ch13/sample01 目录下执行以下命令进行清理和安装:

mvn clean install
  1. 启动Spring Boot应用:
mvn spring-boot:run
  1. 使用cURL命令调用服务:
curl http://localhost:9000/order/11

执行cURL命令后,会打印订单详情,同时在运行订单处理微服务的命令控制台中会看到包含trace ID和span ID以及其他元数据的日志。

3. 多微服务之间的消息追踪

如果已经按照上一节的说明启动了订单处理微服务( sample01 ),请保持其运行。此外,还需要启动库存微服务。在 ch13/sample02 目录下运行以下命令启动库存微服务:

mvn clean install
mvn spring-boot:run

使用以下cURL命令向订单处理微服务下订单:

curl -v -k -H "Content-Type: application/json" -d '{"customer_id":"101021","payment_method":{"card_type":"VISA","expiration":"01/22","name":"John Doe","billing_address":"201, 1st Street, San Jose, CA"},"items":[{"code":"101","qty":1},{"code":"103","qty":5}],"shipping_address":"201, 1st Street, San Jose, CA"}' http://localhost:9000/order

在运行订单处理微服务的命令控制台中,会打印包含追踪信息的日志:

INFO [sample01,76f19c035e8e1ddb,76f19c035e8e1ddb,false] 29786 --- [nio-9000-exec-1] c.a.c.sample01.service.OrderProcessing : creating order :10dcc849-3d8d-49fb-ac58-bc5da29db003

在运行库存微服务的命令控制台中,会打印以下日志:

INFO [sample04,76f19c035e8e1ddb,be46d1595ef606a0,false] 29802 --- [io-10000-exec-1] c.a.ch13.sample02.service.Inventory : item code 101
INFO [sample04,76f19c035e8e1ddb,be46d1595ef606a0,false] 29802 --- [io-10000-exec-1] c.a.ch13.sample02.service.Inventory : item code 103

可以看到,两个微服务打印的日志中,trace ID相同,但每个微服务有自己的span ID。

4. 使用Zipkin进行数据可视化和关联

Zipkin是一个分布式追踪系统,有助于可视化和关联微服务之间的通信路径,还能通过收集计时数据诊断延迟问题。所有微服务都可以配置为将包含追踪信息的日志发布到Zipkin。

4.1 安装和配置Zipkin

使用Docker设置Zipkin非常简单。假设已经安装并运行了Docker,使用以下命令启动一个包含Zipkin的Docker容器:

docker run -d -p 9411:9411 openzipkin/zipkin

此命令将主机的9411端口绑定到Docker容器的9411端口。启动Zipkin节点后,可以通过 http://localhost:9411/zipkin/ http://localhost:9411 访问其基于Web的控制台。

4.2 配置微服务将日志发布到Zipkin

如果订单处理微服务和库存微服务正在运行,请先停止它们,然后在 application.properties 文件中添加以下配置:

spring.zipkin.baseUrl=http://localhost:9411/

同时,在两个微服务的 pom.xml 文件中添加以下依赖:

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-sleuth-zipkin</artifactId>
    <version>2.0.0.RC1</version>
</dependency>

启动订单处理微服务和库存微服务,并多次使用以下cURL命令下订单,以便在Zipkin中收集足够的日志:

curl -v -k -H "Content-Type: application/json" -d '{"customer_id":"101021","payment_method":{"card_type":"VISA","expiration":"01/22","name":"John Doe","billing_address":"201, 1st Street, San Jose, CA"},"items":[{"code":"101","qty":1},{"code":"103","qty":5}],"shipping_address":"201, 1st Street, San Jose, CA"}' http://localhost:9000/order

微服务发布到Zipkin的追踪数据会在命令控制台中打印日志,注意日志中追踪信息的第四个参数,表示日志是否发布到Zipkin,此时该参数设置为 true

在Zipkin的Web控制台主页的“Service Name”下拉框中,可以看到两个服务名称: sample01 sample02 。选择一个服务名称,就可以找到与该微服务相关的所有追踪信息。

Zipkin还可以通过分析入站和出站流量模式为微服务构建依赖图,在有多个微服务的部署中非常有用。

以下是一个简单的流程图,展示了微服务与Zipkin之间的交互:

graph LR
    A[微服务1] -->|发布日志| B[Zipkin]
    C[微服务2] -->|发布日志| B[Zipkin]
    B -->|可视化和关联| D[用户]
5. 事件驱动的日志聚合架构

与之前的设计不同,事件驱动的日志聚合架构中,Zipkin服务器和微服务之间没有直接耦合。每个微服务将日志发布到消息系统(如RabbitMQ或Kafka),Zipkin从消息系统中获取日志。这种模式的优点是,即使Zipkin服务器暂时停机,微服务也可以独立地继续发布日志,Zipkin重启后会从消息系统中获取所有日志。

以下是该架构的流程图:

graph LR
    A[微服务1] -->|发布日志| B[消息系统]
    C[微服务2] -->|发布日志| B[消息系统]
    B -->|获取日志| D[Zipkin]
    D -->|可视化和关联| E[用户]
6. 开放追踪简介

当同一微服务部署中的不同微服务使用不同的追踪模块时,分布式追踪会变得很棘手。例如,订单处理微服务可能使用Sleuth生成span和trace,而库存微服务使用另一个模块。虽然两者都可以将追踪数据发布到Zipkin,但除非两个模块对span和trace有相同的定义,并尊重彼此生成的追踪数据,否则这些信息将毫无用处。

开放追踪(Open Tracing)是一项旨在解决此问题的倡议,它通过建立开放标准,精确定义了开放追踪数据模型下的span和trace。开放追踪需要跨多种编程语言工作,目前已经为九种编程语言定义了语言级API,并且有多个实现。例如,Uber开发的开源分布式追踪系统Jaeger支持开放追踪,并包含多种编程语言的开放追踪客户端库。

7. 使用开放追踪和Spring Boot微服务及Zipkin进行分布式追踪

Zipkin支持开放追踪,但Sleuth不支持。在之前的示例中,Sleuth作为Zipkin的追踪客户端,使用的是Zipkin特定的格式,无法与开放追踪兼容。

ch13/sample03 目录下的示例展示了如何从Spring Boot微服务发布与开放追踪兼容的追踪数据。在 ch13/sample03/pom.xml 文件中添加以下Maven依赖:

<dependency>
    <groupId>io.opentracing.contrib</groupId>
    <artifactId>opentracing-spring-cloud-starter</artifactId>
    <version>0.1.13</version>
</dependency>

这些依赖会引入将与开放追踪兼容的追踪信息发布到Zipkin所需的所有依赖。

综上所述,通过Spring Cloud Sleuth、Zipkin和开放追踪等工具和技术,可以有效地实现微服务的分布式追踪,帮助开发人员更好地理解和调试微服务系统。在实际应用中,可以根据具体需求选择合适的追踪方案,并结合事件驱动的日志聚合架构提高系统的可靠性和可维护性。

Spring Cloud Sleuth与分布式追踪实战

8. 技术对比总结

为了更清晰地了解不同追踪技术和架构的特点,下面通过表格进行对比:
| 技术/架构 | 特点 | 适用场景 |
| — | — | — |
| Spring Cloud Sleuth | 与Spring Boot集成简单,自动添加追踪信息到日志 | 基于Spring Boot的微服务系统 |
| Zipkin | 分布式追踪系统,可可视化和关联通信路径,诊断延迟问题 | 需要对微服务通信进行追踪和分析的场景 |
| 事件驱动的日志聚合架构 | 微服务与Zipkin解耦,提高系统可靠性 | 对系统稳定性要求较高,可能出现Zipkin服务器故障的场景 |
| 开放追踪(Open Tracing) | 建立开放标准,解决不同追踪模块兼容性问题 | 微服务使用多种追踪模块的场景 |

9. 操作步骤总结

以下是使用Spring Cloud Sleuth和Zipkin进行分布式追踪的详细操作步骤列表:
1. 环境准备 :安装Java 8或更高版本、Maven 3.2或更高版本以及Git客户端。
2. 克隆代码仓库

git clone https://github.com/microservices-for-enterprise/samples.git
  1. 集成Sleuth到Spring Boot微服务
    • pom.xml 文件中添加依赖:
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-sleuth</artifactId>
    <version>2.0.0.RC1</version>
</dependency>
- 配置`application.properties`文件:
spring.application.name=sample01
spring.sleuth.sampler.percentage=0.1
- 编写业务代码并记录日志。
- 运行微服务:
mvn clean install
mvn spring-boot:run
- 使用cURL命令调用服务:
curl http://localhost:9000/order/11
  1. 启动多个微服务并进行追踪
    • 启动订单处理微服务和库存微服务。
    • 使用cURL命令下订单:
curl -v -k -H "Content-Type: application/json" -d '{"customer_id":"101021","payment_method":{"card_type":"VISA","expiration":"01/22","name":"John Doe","billing_address":"201, 1st Street, San Jose, CA"},"items":[{"code":"101","qty":1},{"code":"103","qty":5}],"shipping_address":"201, 1st Street, San Jose, CA"}' http://localhost:9000/order
  1. 安装和配置Zipkin
    • 使用Docker启动Zipkin容器:
docker run -d -p 9411:9411 openzipkin/zipkin
- 配置微服务将日志发布到Zipkin:
    - 在`application.properties`文件中添加配置:
spring.zipkin.baseUrl=http://localhost:9411/
    - 在`pom.xml`文件中添加依赖:
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-sleuth-zipkin</artifactId>
    <version>2.0.0.RC1</version>
</dependency>
- 重启微服务并多次下订单。
  1. 使用开放追踪
    • pom.xml 文件中添加依赖:
<dependency>
    <groupId>io.opentracing.contrib</groupId>
    <artifactId>opentracing-spring-cloud-starter</artifactId>
    <version>0.1.13</version>
</dependency>
10. 综合流程图

下面是一个综合的流程图,展示了从微服务启动到使用Zipkin进行追踪和可视化的整个过程:

graph LR
    A[环境准备] --> B[克隆代码仓库]
    B --> C[集成Sleuth到Spring Boot微服务]
    C --> D[启动单个微服务并测试]
    D --> E[启动多个微服务并追踪]
    E --> F[安装和配置Zipkin]
    F --> G[配置微服务发布日志到Zipkin]
    G --> H[使用开放追踪(可选)]
    H --> I[使用Zipkin进行可视化和分析]
11. 总结与建议

通过上述内容,我们了解了Spring Cloud Sleuth、Zipkin和开放追踪在微服务分布式追踪中的应用。在实际项目中,建议根据项目的规模、复杂度和技术栈来选择合适的追踪方案。
- 如果项目基于Spring Boot开发,且微服务数量较少,使用Spring Cloud Sleuth和Zipkin的组合可以快速实现分布式追踪。
- 当微服务使用多种追踪模块时,考虑引入开放追踪标准,以确保不同模块之间的兼容性。
- 对于对系统稳定性要求较高的项目,采用事件驱动的日志聚合架构可以避免因Zipkin服务器故障导致的日志丢失问题。

同时,在使用这些技术时,要注意合理配置追踪参数,如 spring.sleuth.sampler.percentage ,以平衡追踪数据量和系统性能。不断学习和掌握这些技术的最新发展,将有助于更好地应对微服务系统中的各种挑战。

【四轴飞行器】非线性三自由度四轴飞行器模拟器研究(Matlab代码实现)内容概要:本文围绕非线性三自由度四轴飞行器模拟器的研究展开,重点介绍基于Matlab代码实现的四轴飞行器动力学建模仿真方法。研究构建了考虑非线性特性的飞行器数学模型,涵盖姿态动力学运动学方程,实现了三自由度(滚转、俯仰、偏航)的精确模拟。文中详细阐述了系统建模过程、控制算法设计思路及仿真结果分析,帮助读者深入理解四轴飞行器的飞行动力学特性控制机制;同时,该模拟器可用于算法验证、控制器设计教学实验。; 适合人群:具备一定自动控制理论基础和Matlab编程能力的高校学生、科研人员及无人机相关领域的工程技术人员,尤其适合从事飞行器建模、控制算法开发的研究生和初级研究人员。; 使用场景及目标:①用于四轴飞行器非线性动力学特性的学习仿真验证;②作为控制器(如PID、LQR、MPC等)设计测试的仿真平台;③支持无人机控制系统教学科研项目开发,提升对姿态控制系统仿真的理解。; 阅读建议:建议读者结合Matlab代码逐模块分析,重点关注动力学方程的推导实现方式,动手运行并调试仿真程序,以加深对飞行器姿态控制过程的理解。同时可扩展为六自由度模型或加入外部干扰以增强仿真真实性。
基于分布式模型预测控制DMPC的多智能体点对点过渡轨迹生成研究(Matlab代码实现)内容概要:本文围绕“基于分布式模型预测控制(DMPC)的多智能体点对点过渡轨迹生成研究”展开,重点介绍如何利用DMPC方法实现多智能体系统在复杂环境下的协同轨迹规划控制。文中结合Matlab代码实现,详细阐述了DMPC的基本原理、数学建模过程以及在多智能体系统中的具体应用,涵盖点对点转移、避障处理、状态约束通信拓扑等关键技术环节。研究强调算法的分布式特性,提升系统的可扩展性鲁棒性,适用于多无人机、无人车编队等场景。同时,文档列举了大量相关科研方向代码资源,展示了DMPC在路径规划、协同控制、电力系统、信号处理等多领域的广泛应用。; 适合人群:具备一定自动化、控制理论或机器人学基础的研究生、科研人员及从事智能系统开发的工程技术人员;熟悉Matlab/Simulink仿真环境,对多智能体协同控制、优化算法有一定兴趣或研究需求的人员。; 使用场景及目标:①用于多智能体系统的轨迹生成协同控制研究,如无人机集群、无人驾驶车队等;②作为DMPC算法学习仿真实践的参考资料,帮助理解分布式优化模型预测控制的结合机制;③支撑科研论文复现、毕业设计或项目开发中的算法验证性能对比。; 阅读建议:建议读者结合提供的Matlab代码进行实践操作,重点关注DMPC的优化建模、约束处理信息交互机制;按文档结构逐步学习,同时参考文中提及的路径规划、协同控制等相关案例,加深对分布式控制系统的整体理解。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值