课程名称:Spring Cloud / Alibaba 微服务架构实战
课程章节:第8章-集成 SpringCloud Sleuth 实现微服务通信跟踪
课程讲师:张勤一
课程内容:
1. 集成SpringCloud Sleuth
-
给需要实现链路跟踪的模块添加pom依赖
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-sleuth</artifactId> </dependency>
第一原则:引入Sleuth前提是保证微服务存在跨进程通信,否则意义不大(可以通过更简单的方式实现)。
- 引入依赖后,打印的日志会有些许变化。
2. 演示通过代码获取链路信息
- Controller
package com.imooc.ecommerce.controller;
import com.imooc.ecommerce.service.SleuthTraceInfoService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* <h1>打印跟踪信息</h1>
* */
@Slf4j
@RestController
@RequestMapping("/sleuth")
public class SleuthTraceInfoController {
private final SleuthTraceInfoService traceInfoService;
public SleuthTraceInfoController(SleuthTraceInfoService traceInfoService) {
this.traceInfoService = traceInfoService;
}
/**
* <h2>打印日志跟踪信息</h2>
* */
@GetMapping("/trace-info")
public void logCurrentTraceInfo() {
traceInfoService.logCurrentTraceInfo();
}
}
Service
package com.imooc.ecommerce.service;
import brave.Tracer;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
/**
* 使用代码更直观的看到 Sleuth 生成的相关跟踪信息
* */
@Slf4j
@Service
public class SleuthTraceInfoService {
/** brave.Tracer 跟踪对象 */
private final Tracer tracer;
public SleuthTraceInfoService(Tracer tracer) {
this.tracer = tracer;
}
/**
* <h2>打印当前的跟踪信息到日志中</h2>
* */
public void logCurrentTraceInfo() {
log.info("Sleuth trace id: [{}]", tracer.currentSpan().context().traceId());
log.info("Sleuth span id: [{}]", tracer.currentSpan().context().spanId());
}
}