Spring Cloud系列教程八:分布式链路追踪Spring Cloud Sleuth(F版)

介绍

当系统拆分后,一个前端请求的调用链路会变长,会调用多个不同的后端服务。当一个请求变慢或不可用时,为了方便定位问题,于是就有了分布式链路追踪。

分布式链路追踪会在请求中增加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
Spring Cloud系列教程八:分布式链路追踪Spring Cloud Sleuth(F版)_第1张图片

创建消费者服务

示例项目:consumer-zipkin(spring-cloud-sleuth)

1.项目配置如下

pom.xml

<dependency>
	<groupId>org.springframework.cloudgroupId>
	<artifactId>spring-cloud-starter-zipkinartifactId>
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.cloudgroupId>
	<artifactId>spring-cloud-starter-zipkinartifactId>
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分析出如下调用关系
Spring Cloud系列教程八:分布式链路追踪Spring Cloud Sleuth(F版)_第2张图片
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,分析出如下调用链路
Spring Cloud系列教程八:分布式链路追踪Spring Cloud Sleuth(F版)_第3张图片

欢迎关注

Spring Cloud系列教程八:分布式链路追踪Spring Cloud Sleuth(F版)_第4张图片

你可能感兴趣的:(Spring,Cloud)