介绍
当系统拆分后,一个前端请求的调用链路会变长,会调用多个不同的后端服务。当一个请求变慢或不可用时,为了方便定位问题,于是就有了分布式链路追踪。
分布式链路追踪会在请求中增加traceId和spanId,一个链路包含一个traceId多个spanId
例如一个前端请求调用订单系统,而订单系统再去调用库存系统。
订单系统的日志如下(默认不是如下这种格式,可以配置成如下格式,默认格式后面会提到)
[INFO][traceId=aaa][SpanId=123]
库存系统的日志如下
[INFO][traceId=aaa][SpanId=456]
一个请求链路有一个traceId,在不同系统中值一样,有多个spanId,在不同系统中值不一样。
分布式链路追踪有很多实现,这里简单介绍一下与Zipkin的整合
github地址:https://github.com/erlieStar/spring-cloud-learning
与Zipkin进行整合
创建zipkin-service
spring boot 2.x版本后,官方不推荐自己编译,而是提供了编译好的jar包供我们使用,直接下载启动即可
curl -sSL https://zipkin.io/quickstart.sh | bash -s
java -jar zipkin.jar
启动后访问http://localhost:9411/zipkin
创建消费者服务
示例项目:consumer-zipkin(spring-cloud-sleuth)
1.项目配置如下
pom.xml
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-zipkin</artifactId>
</dependency>
application.yaml
server:
port: 8080
spring:
zipkin:
base-url: http://localhost:9411
application:
name: consumer-zipkin
sleuth:
sampler:
probability: 1.0 # 采样比例,1.0表示全部采集
2.启动类如下
@Slf4j
@RestController
@SpringBootApplication
public class ConsumerZipkin {
public static void main(String[] args) {
SpringApplication.run(ConsumerZipkin.class);
}
@Autowired
private RestTemplate restTemplate;
@Bean
public RestTemplate restTemplate() {
return new RestTemplate();
}
@GetMapping("hello")
public String hello() {
log.info("start invoke");
return restTemplate.getForObject("http://localhost:8090/hello", String.class);
}
}
创建生产者服务
示例项目:producer-zipkin(spring-cloud-sleuth)
1.项目配置如下
pom.xml
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-zipkin</artifactId>
</dependency>
application.yaml
server:
port: 8090
spring:
zipkin:
base-url: http://localhost:9411
application:
name: producer-zipkin
sleuth:
sampler:
probability: 1.0 # 采样比例,1.0表示全部采集
2.启动类如下
@Slf4j
@RestController
@SpringBootApplication
public class ProducerZipkin {
public static void main(String[] args) {
SpringApplication.run(ProducerZipkin.class);
}
@RequestMapping("hello")
public String hello() {
log.info("new request");
return "hi zipkin";
}
}
开始调用
访问http://localhost:8080/hello
zipkin分析出如下调用关系
consumer-zikpin打印日志如下
INFO [consumer-zipkin,53836e18c9552b3f,53836e18c9552b3f,true] 6664 --- [nio-8080-exec-1] com.javashitang.ConsumerZipkin : start invoke
producer-zipkin打印日志如下
INFO [producer-zipkin,53836e18c9552b3f,6eefb28892009df6,true] 20832 --- [nio-8090-exec-1] com.javashitang.ProducerZipkin : new request
分析一下日志格式
[consumer-zipkin,53836e18c9552b3f,53836e18c9552b3f,true]
第一个值:应用名称
第二个值:traceId
第三个值:spanId
第四个值:是否将该信息输出到zipkin等服务中来收集和展示
输入traceId,分析出如下调用链路