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
- 启动Spring Boot应用:
mvn spring-boot:run
- 使用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
-
集成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
-
启动多个微服务并进行追踪
:
- 启动订单处理微服务和库存微服务。
- 使用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
-
安装和配置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>
- 重启微服务并多次下订单。
-
使用开放追踪
:
-
在
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
,以平衡追踪数据量和系统性能。不断学习和掌握这些技术的最新发展,将有助于更好地应对微服务系统中的各种挑战。
超级会员免费看
1166

被折叠的 条评论
为什么被折叠?



