sleuth

[复制链接]
发表于 2024-11-24 13:11:34 | 显示全部楼层 |阅读模式

1 sleuth

image.png

image.png

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;

// }

}

image.png

image.png

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)、消息驱动等复杂场景,确保链路上下文正确传递。

典型使用场景

  1. 微服务调用链追踪:跨服务调试 API 调用。
  2. 慢查询分析:定位耗时过长的服务或接口。
  3. 异常传播追踪:分析异常在服务间的传递路径。
  4. 容量规划:通过调用频率和耗时优化资源配置。

示例代码

在 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 等工具,显著提升系统的可观测性,是微服务治理中不可或缺的一环。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×

GMT+8, 2025-9-7 23:51 , Processed in 0.150371 second(s), 35 queries Archiver|手机版|小黑屋|Attic ( 京ICP备2020048627号 )

快速回复 返回顶部 返回列表