Springcloud下的微服务-服务链路追踪(Spring Cloud Sleuth+zipkin)

转自:https://blog.csdn.net/ahaha413525642/article/details/79882744

 版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/ahaha413525642/article/details/79882744

参考 
官网文档 
史上最简单的SpringCloud教程 | 第九篇: 服务链路追踪(Spring Cloud Sleuth) 
zipkin简介

Spring Cloud Sleuth 主要功能就是在分布式系统中提供追踪解决方案,并且兼容支持了 zipkin,zipkin为分布式链路调用监控系统,聚合各业务系统调用延迟数据,达到链路调用监控跟踪。

随着微服务数量不断增长,它们之间的关系会越来越复杂,如果链路上任何一个服务出现问题或者网络超时,都会形成导致接口调用失败,需要跟踪一个请求从一个微服务到下一个微服务的传播过程

分布式服务跟踪可以:

  1. 提供链路追踪,故障快速定位:可以通过调用链结合业务日志快速定位错误信息
  2. 可视化各个阶段耗时,进行性能分析
  3. 各个调用环节的可用性、梳理服务依赖关系以及优化
  4. 数据分析,优化链路:可以得到用户的行为路径,汇总分析应用在很多业务场景

zipkin涉及几个概念:

  1. Span:基本工作单元,一次链路调用(可以是RPC,DB等没有特定的限制)创建一个span,通过一个64位ID标识它, 
    span通过还有其他的数据,例如描述信息,时间戳,key-value对的(Annotation)tag信息,parent-id等,其中parent-id ,可以表示span调用链路来源,通俗的理解span就是一次请求信息
  2. Trace:类似于树结构的Span集合,表示一条调用链路,存在唯一标识
  3. Annotation: 注解,用来记录请求特定事件相关信息(例如时间),通常包含四个注解信息 
    cs - Client Start,表示客户端发起请求 
    sr - Server Receive,表示服务端收到请求 
    ss - Server Send,表示服务端完成处理,并将结果发送给客户端 
    cr - Client Received,表示客户端获取到服务端返回信息

完整的调用链路 
这里写图片描述

把注意力集中到一条链路中,一条链路通过Trace Id唯一标识,Span标识发起的请求信息,各span通过parent id 关联起来 
这里写图片描述

整个链路的依赖关系如下: 
这里写图片描述

利用Annotation信息来计算调用的延迟 
这里写图片描述 
sr-cs 得到请求发出延迟 
ss-sr 得到服务端处理延迟 
cr-cs 得到真个链路完成延迟

zipkin demo

案例主要有三个工程组成: 
一个server-zipkin,它的主要作用使用ZipkinServer 的功能,收集调用数据,并展示; 
一个service-hi,对外暴露hi接口; 
一个service-miya,对外暴露miya接口; 
这两个service可以相互调用;并且只有调用了,server-zipkin才会收集数据的

server-zipkin

引入依赖


    io.zipkin.java
    zipkin-server



    io.zipkin.java
    zipkin-autoconfigure-ui

启动类加上注解@EnableZipkinServer,开启ZipkinServer的功能

zipkin-client service-hi,service-miya

引入依赖

  
      org.springframework.cloud
     spring-cloud-starter-zipkin

或在IDEA 创建springboot项目时选择 
这里写图片描述

在配置文件application.yml中

server:
  port: 8988
spring:
  application:
    name: service-hi
  zipkin:
    base-url: http://localhost:9411

可以看出,zipkin-client的搭建很简单,通过引入spring-cloud-starter-zipkin依赖和设置spring.zipkin.base-url就可以了

接口

@SpringBootApplication
@RestController
public class ServiceMiyaApplication {

    public static void main(String[] args) {
        SpringApplication.run(ServiceMiyaApplication.class, args);
    }

    private static final Logger LOG = Logger.getLogger(ServiceMiyaApplication.class.getName());

    @RequestMapping("/hello")
    public String hello(){
        LOG.log(Level.INFO, "hi is being called");
        return "hi i'm miya!";
    }

    @RequestMapping("/miya")
    public String miya(){
        LOG.log(Level.INFO, "info is being called");
        return restTemplate.getForObject("http://localhost:8988/hello",String.class);
    }

    @Autowired
    private RestTemplate restTemplate;

    @Bean
    public RestTemplate getRestTemplate(){
        return new RestTemplate();
    }

    @Bean
    public AlwaysSampler defaultSampler(){
        return new AlwaysSampler();
    }
}
@SpringBootApplication
@RestController
public class ServiceHiApplication {

    public static void main(String[] args) {
        SpringApplication.run(ServiceHiApplication.class, args);
    }

    private static final Logger LOG = Logger.getLogger(ServiceHiApplication.class.getName());

    @Autowired
    private RestTemplate restTemplate;

    @Bean
    public RestTemplate getRestTemplate(){
        return new RestTemplate();
    }

    @RequestMapping("/hello")
    public String hello(){
        LOG.log(Level.INFO, "calling trace service-hi ");
        return "i'm service-hi";
    }

    @RequestMapping("/hi")
    public String hi(){
        LOG.log(Level.INFO, "calling trace service-hi  ");
        return restTemplate.getForObject("http://localhost:8989/hello", String.class);
    }

    @Bean
    public AlwaysSampler defaultSampler(){
        return new AlwaysSampler();
    }
}

AlwaysSampler 类,它会导出所有的span,不能缺少该类

先启动http://localhost:9411,可以看到zipkin的UI界面 
这里写图片描述

先调用http://localhost:8988/hi 
这里写图片描述
再调用http://localhost:8989/miya 
这里写图片描述
可以很清楚的看到调用微服务之间的调用关系 
(注意,这里接口如果为/info好像有莫名的错误)

点击find traces,可以看到具体服务相互调用的数据 
这里写图片描述

你可能感兴趣的:(springCloud,springCloud)