微服务分布式追踪模式:增强服务通信的可视性
约 3 分钟
微服务分布式追踪设计模式的意图
分布式追踪旨在监控和跟踪请求在微服务架构中不同服务之间的流动,从而提供对性能、依赖关系和故障的洞察。
也称为
- 分布式请求追踪
- 端到端追踪
微服务分布式追踪模式的详细解释,并附带实际案例
实际案例
在电子商务平台中,分布式追踪用于跟踪客户请求,从他们将商品添加到购物车到订单处理和发货的整个过程。这有助于识别瓶颈、错误和跨不同服务的延迟问题。
通俗易懂
分布式追踪允许您跟踪请求与其交互的所有服务之间的旅程,提供对系统性能的洞察,并帮助进行调试。
维基百科说
软件工程中的追踪指的是捕获和记录软件程序执行信息的流程。程序员通常将这些信息用于调试目的,并且根据追踪日志中包含的信息类型和细节,经验丰富的系统管理员或技术支持人员以及软件监控工具也可以使用这些信息来诊断软件常见的故障。
Java 中微服务分布式追踪的编程示例
此实现展示了电子商务平台的 OrderService
如何与 PaymentService
和 ProductService
交互。当客户下单时,OrderService
会调用 PaymentService
处理付款,并调用 ProductService
检查产品库存。针对每一次交互都会生成分布式追踪日志,并且可以在 Zipkin 接口中查看这些日志,以监控这些服务之间请求的流程和性能。
以下是 订单微服务
的实现。
@Slf4j
@RestController
public class OrderController {
private final OrderService orderService;
public OrderController(final OrderService orderService) {
this.orderService = orderService;
}
@PostMapping("/order")
public ResponseEntity<String> processOrder(@RequestBody(required = false) String request) {
LOGGER.info("Received order request: {}", request);
var result = orderService.processOrder();
LOGGER.info("Order processed result: {}", result);
return ResponseEntity.ok(result);
}
}
@Slf4j
@Service
public class OrderService {
private final RestTemplateBuilder restTemplateBuilder;
public OrderService(final RestTemplateBuilder restTemplateBuilder) {
this.restTemplateBuilder = restTemplateBuilder;
}
public String processOrder() {
if (validateProduct() && processPayment()) {
return "Order processed successfully";
}
return "Order processing failed";
}
Boolean validateProduct() {
try {
ResponseEntity<Boolean> productValidationResult = restTemplateBuilder
.build()
.postForEntity("http://localhost:30302/product/validate", "validating product",
Boolean.class);
LOGGER.info("Product validation result: {}", productValidationResult.getBody());
return productValidationResult.getBody();
} catch (ResourceAccessException | HttpClientErrorException e) {
LOGGER.error("Error communicating with product service: {}", e.getMessage());
return false;
}
}
Boolean processPayment() {
try {
ResponseEntity<Boolean> paymentProcessResult = restTemplateBuilder
.build()
.postForEntity("http://localhost:30301/payment/process", "processing payment",
Boolean.class);
LOGGER.info("Payment processing result: {}", paymentProcessResult.getBody());
return paymentProcessResult.getBody();
} catch (ResourceAccessException | HttpClientErrorException e) {
LOGGER.error("Error communicating with payment service: {}", e.getMessage());
return false;
}
}
}
以下是 支付微服务
的实现。
@Slf4j
@RestController
public class PaymentController {
@PostMapping("/payment/process")
public ResponseEntity<Boolean> payment(@RequestBody(required = false) String request) {
LOGGER.info("Received payment request: {}", request);
boolean result = true;
LOGGER.info("Payment result: {}", result);
return ResponseEntity.ok(result);
}
}
以下是 产品微服务
的实现。
/**
* Controller for handling product validation requests.
*/
@Slf4j
@RestController
public class ProductController {
/**
* Validates the product based on the request.
*
* @param request the request body containing product information (can be null)
* @return ResponseEntity containing the validation result (true)
*/
@PostMapping("/product/validate")
public ResponseEntity<Boolean> validateProduct(@RequestBody(required = false) String request) {
LOGGER.info("Received product validation request: {}", request);
boolean result = true;
LOGGER.info("Product validation result: {}", result);
return ResponseEntity.ok(result);
}
}
何时在 Java 中使用微服务分布式追踪模式
- 当您拥有微服务架构,并且需要监控跨多个服务的请求流程时。
- 当您需要排查分布式系统中的性能问题或错误时。
- 当您需要深入了解系统瓶颈并优化整体性能时。
微服务分布式追踪模式 Java 教程
微服务分布式追踪模式的优点和权衡
优点
- 提供对请求的端到端可视性。
- 帮助识别性能瓶颈。
- 有助于调试和排查复杂系统的故障。
权衡
- 由于追踪数据,会给每个请求增加开销。
- 需要额外的基础设施(例如 Zipkin、Jaeger)来收集和可视化追踪。
- 在大型系统中可能变得难以管理。
Java 中微服务分布式追踪模式的实际应用
- 监控和排查电子商务平台的故障。
- 金融交易系统的性能监控。
- 大型 SaaS 应用的可观察性。
相关的 Java 设计模式
- 日志聚合微服务 - 分布式追踪与日志聚合协同工作,可以提供全面的可观察性和故障排查能力。
- 断路器 - 分布式追踪可以与断路器模式一起使用,以监控和优雅地处理故障,防止微服务中出现级联故障。
- API 网关微服务 - API 网关模式可以与分布式追踪集成,为跨多个微服务的请求追踪提供一个单一入口。