1 sleuth


1.1 sleuth-consumer
1.1.1 业务层ProductService.java
package com.agan.book.consumer.service;
import org.springframework.cloud.netflix.feign.FeignClient;
import com.agan.book.product.facade.ProductFacade;
@FeignClient(name="e-book-product")
public interface ProductService extends ProductFacade{
}
@RestController
public class OrderController {
@Autowired
private ProductService productService;
/\*\*
\* 模拟内容: 登录 查看产品 下订单
\*
\* 1.测试登录 账号 admin admin
\* 2.查看所有产品列表
\* 3.选第一款产品,下订单
\* 4.实现订单交易支付
\* 5.查看所有的订单信息
\*
\* @throws ParseException
\*/
@RequestMapping(value = "/productList", method = RequestMethod.GET)
public List<Product> productList() {
// 1.测试登录 账号 admin admin
// Integer userid = this.login();
// 2.查看所有产品列表
List<Product> products = this.productService.findAllProduct();
return products;
// // 3.选第一款产品,下订单
// Product product = products.get(0);
// Order order = new Order();
// order.setUserId(userid);
// order.setProductId(product.getId());
// order.setPrice(product.getPrice());
// Integer orderid=this.orderService.createOrder(order);
//// System.out.println(order.getId()+"------------------------------------------------");
//// return null;
//// 4.实现订单交易支付
// Trade trade = new Trade();
// trade.setUserId(order.getUserId());
// trade.setOrderId(orderid);
// trade.setPrice(order.getPrice());
// trade.setPayType((byte)1);// 支付类型:1-支付宝支付,2-网银在线,3-银联,4-微信支付
// trade.setPayStatus((byte)4);// 1 未付款 2 付款中 3 付款失败 4 付款完成
// trade.setGatewayPayNum(String.valueOf((new Date()).getTime()));// 网关支付流水号取当前时间
// trade.setGatewayPayPrice(order.getPrice());
// trade.setGatewayPayTime(new Date());
// this.tradeService.createTrade(trade);
// // 5.查看所有的订单信息
// List<Order> orders = this.orderService.findOrderByUserId(userid);
// return orders;
}
// private Integer login() {
// String userName = "admin";
// String password = "admin";
// Integer id = this.userService.login(userName, password);
// if (id != null) {
// System.out.println("登录成功 id=" + id);
// } else {
// System.out.println("登录失败");
// }
// return id;
// }
}


Sleuth 是 Spring Cloud 提供的一款分布式链路追踪工具,主要用于在微服务架构中追踪请求的完整调用链路,帮助开发者快速定位问题、分析性能瓶颈。以下是其核心作用:
1. 请求链路追踪
- 唯一标识:为每个请求生成唯一的 Trace ID(全局唯一),并在服务间传递,将跨服务的调用串联成一条完整链路。
- Span 记录:每个服务节点(或操作步骤)生成 Span ID,记录请求的开始、结束时间、元数据等信息。
- 父子关系:通过 Span 的父子关系,构建请求在服务间的调用树(如服务 A → 服务 B → 服务 C)。
2. 分布式调试
- 问题定位:当请求失败或响应缓慢时,通过 Trace ID 快速定位问题所在的服务或接口。
- 日志聚合:将分散在多个服务中的日志通过 Trace ID 关联,还原完整的请求路径,简化排查过程。
3. 性能分析
- 耗时统计:记录每个 Span 的耗时,分析服务间调用的延迟(如数据库查询、HTTP 调用等)。
- 依赖分析:识别服务间的依赖关系,发现潜在的性能瓶颈(如高频调用的下游服务)。
4. 集成可视化工具(如 Zipkin)
- Sleuth 默认支持与 Zipkin 集成,将链路数据上报到 Zipkin 服务器,生成可视化的调用链路图。
- 示例效果:
- 查看每个服务的耗时占比。
- 发现慢请求或异常调用(如 HTTP 500 错误)。
- 分析跨服务调用的拓扑关系。
5. 无缝兼容 Spring 生态
- 自动注入:与 Spring Boot、Spring Cloud Gateway、OpenFeign、消息队列(如 RabbitMQ/Kafka)等组件无缝集成,自动添加追踪信息。
- 日志增强:在日志中自动打印 Trace ID 和 Span ID,无需手动修改代码。
6. 支持异步和并发场景
- 适用于多线程、异步任务(如
@Async
)、消息驱动等复杂场景,确保链路上下文正确传递。
典型使用场景
- 微服务调用链追踪:跨服务调试 API 调用。
- 慢查询分析:定位耗时过长的服务或接口。
- 异常传播追踪:分析异常在服务间的传递路径。
- 容量规划:通过调用频率和耗时优化资源配置。
示例代码
在 Spring Boot 项目中,只需添加依赖即可启用 Sleuth:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-sleuth</artifactId>
</dependency>
日志输出示例:
2023-10-01 12:00:00 [service-a,80f3c7b0d5e1d3ab,7e8d2b4c5a6f1e2d] INFO ...
2023-10-01 12:00:01 [service-b,80f3c7b0d5e1d3ab,d3e4f5a6b7c8d9e0] INFO ...
其中 [application-name,TraceID,SpanID]
由 Sleuth 自动注入。
总结
Sleuth 的核心价值在于为分布式系统提供透明的链路追踪能力,结合 Zipkin 等工具,显著提升系统的可观测性,是微服务治理中不可或缺的一环。