springcloud (Finchley版本)简易入门 | 第七课: sleuth分布式链路跟踪

目录

 

一、sleuth介绍

二、术语

三、Zipkin

3.1、编写一个Zipkin Server

四、实战

4.1、sleuth微服务整合Zipkin 

4.2、zipkin server 用Elasticsearch 做数据持久化

4.2.1、zipkin 与 Elasticsearch整合:

参考资料


一、sleuth介绍

Spring Cloud Sleuth 主要功能就是在分布式系统中提供追踪解决方案,它大量借用了Google Dapper、 Twitter Zipkin和 Apache HTrace的设计先来了解一下 Sleuth的术语, Sleuth借用了 Dapper的术语。并且兼容支持了 zipkin,你只需要在pom文件中引入相应的依赖即可。

微服务架构上通过业务来划分服务的,通过REST调用,对外暴露的一个接口,可能需要很多个服务协同才能完成这个接口功能,如果链路上任何一个服务出现问题或者网络超时,都会形成导致接口调用失败。随着业务的不断扩张,服务之间互相调用会越来越复杂。

Paste_Image.png

二、术语

  • Span:基本工作单元,例如,在一个新建的span中发送一个RPC等同于发送一个回应请求给RPC,span通过一个64位ID唯一标识,trace以另一个64位ID表示,span还有其他数据信息,比如摘要、时间戳事件、关键值注释(tags)、span的ID、以及进度ID(通常是IP地址) span在不断的启动和停止,同时记录了时间信息,当你创建了一个span,你必须在未来的某个时刻停止它。
  • trace(跟踪):一组共享"rootspan"的 span组成的树状结构称为 traceo trac也用一个64位的 ID唯一标识, trace 中的所有 span都共享该 trace的 ID。
  • annotation(标注): annotation用来记录事件的存在,其中,核心annotation用来定义请求的开始和结束

            cs - Client Sent -客户端发起一个请求,这个annotion描述了这个span的开始

            sr - Server Received -服务端获得请求并准备开始处理它,如果将其sr减去cs时间戳便可得到网络延迟

            ss - Server Sent -注解表明请求处理的完成(当请求返回客户端),如果ss减去sr时间戳便可得到服务端需要的处理请求时间

            cr - Client Received -表明span的结束,客户端成功接收到服务端的回复,如果cr减去cs时间戳便可得到客户端从服务端获取回复的所有所需时间 将Span和Trace在一个系统中使用Zipkin注解的过程图形化:

Spring Cloud Sleuth可以追踪10种类型的组件:async、Hystrix,messaging,websocket,rxjava, scheduling,web(Spring MVC Controller,Servlet),webclient(Spring RestTemplate)、Feign、Zuul

下面我们通过一张图来看一下一个简单的微服务调用链:

这张图是spring cloud 官方给出的示例图 图片详细讲了我们上文所说的概念在调用链中 处于什么状态以及改变。

三、Zipkin

Zipkin是 Twitter开源的分布式跟踪系统,基于 Dapper的论文设计而来。它的主要功能是收集系统的时序数据,从 而追踪微服务架构的系统延时等问题。 Zipkin还提供了一个非常友好的界面,来帮助分析追踪数据。官网地址:http://zipkin。

为什么要Zipkin

因为sleuth对于分布式链路的跟踪仅仅是一些数据的记录, 这些数据我们人为来读取和处理难免会太麻烦了,所以 我们一般吧这种数据上交给Zipkin Server 来统一处理。

3.1、编写一个Zipkin Server

新建一个 zipkin-server 微服务。引入依赖

 <dependencies>
        <dependency>
            <groupId>io.zipkin.java</groupId>
            <artifactId>zipkin-autoconfigure-ui</artifactId>
            <version>2.8.4</version>
        </dependency>
        <dependency>
            <groupId>io.zipkin.java</groupId>
            <artifactId>zipkin-server</artifactId>
            <version>2.8.4</version>
        </dependency>

        <dependency>
            <groupId>io.zipkin.java</groupId>
            <artifactId>zipkin-autoconfigure-storage-elasticsearch-http</artifactId>
            <version>2.3.1</version>
        </dependency>
    </dependencies>

在启动类上加入注解:@EnableZipkinServer:

/**
 * Zipkin服务器
 */
@SpringBootApplication
@EnableZipkinServer
public class AppZipkinServer {

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

yml文件加上如下配置:

management:
  metrics:
    web:
      server:
        autoTimeRequests: false
server:
  port: 9494

这个配置解释一下: 在zipkin2.7.x以后便不支持自定义服务器需要使用官方的版本或者Docker 但是如果还是要使 用的话就得加上这个配置。

完成上面的步骤之后,我们启动项目, 你会发现Zipkin 的专属图标, 而且细心的同学会发现 他是基于spring boot 来的, 然后打开浏览器 访问: /zipkin/

四、实战

4.1、sleuth微服务整合Zipkin 

改造user、power、order微服务 ,在pom中增加依赖:

   <dependency>
      <groupId>org.springframework.cloud</groupId>
      <artifactId>spring-cloud-starter-sleuth</artifactId>
   </dependency>

    <dependency>
       <groupId>org.springframework.cloud</groupId>
       <artifactId>spring-cloud-starter-zipkin</artifactId>
    </dependency>

然后在微服务中加入以下配置:

spring:
  zipkin:
    base-url: http://localhost:9494  #指定Zipkin server地址
  sleuth:
    sampler:
      probability: 1.0 #request采样的数量的标准 默认是0.1 也即是10%  顾名思义 采取10%的请求数据  因为在分布式系统中,数据量可能会非常大,因此采样非常重要。我们示例数据少最好配置为1全采样

然后启动微服务并模拟一次调用链 我这里是用user 微服务调用了order微服务 ,order微服务调用了power微服务(注意,每个微服务都需要和 zipkin整合)

调用完成之后 我们去zipkin server 页面去看看:

点击进去可以看一次调用的链路

4.2、zipkin server 用Elasticsearch 做数据持久化

刚刚我们介绍了如何把分布式链路调用信息上传到 zipkin server 但是 有一个问题:

当zipkin重启后我们的分布式链路数据全部清空了。

因为zipkin server 默认数据是存储在内存当中, 所以当你服务重启之后内存自然而然也就清空了。

我们这里借用ES来做数据持久化, 当然 还可以用ELK来做, 我们这里演示ES

关于Elasticsearch 具体的介绍 我们本文暂时不讨论, 没学习过的同学可以把他当作mysql来看待

Elasticsearch 下载地址:https://www.elastic.co/cn/downloads/elasticsearch

4.2.1、zipkin 与 Elasticsearch整合:

首先 我们在我们的zipkin server里面引入依赖:

 <dependency>
            <groupId>io.zipkin.java</groupId>
            <artifactId>zipkin-autoconfigure-storage-elasticsearch-http</artifactId>
            <version>2.3.1</version>
        </dependency>

然后在yml加入配置:

zipkin:
  storage:
    type: elasticsearch
    elasticsearch:
      cluster: elasticsearch
      hosts: http://localhost:9200
      index: zipkin

4.2.1、在kibaba展示数据

图片1.png

 

在上图的界面中,单击“Management”按钮,然后单击“Add New”,添加一个index。我们将在上节ElasticSearch中写入链路数据的index配置为“zipkin”,那么在界面填写为“zipkin-*”,单击“Create”按钮,界面如下图所示:

图片2.png

创建完成index后,单击“Discover”,就可以在界面上展示链路数据了,展示界面如下图所示。

图片3.png

参考资料

https://zipkin.io/

https://github.com/spring-cloud/spring-cloud-sleuth

https://cloud.spring.io/spring-cloud-static/spring-cloud-sleuth/2.1.0.RELEASE/single/spring-cloud-sleuth.html

https://github.com/openzipkin/zipkin/blob/master/zipkin-server/src/main/resources/zipkin-server-shared.yml

https://github.com/openzipkin/zipkin/blob/master/zipkin-storage/mysql-v1/src/main/resources/mysql.sql

https://windmt.com/2018/04/24/spring-cloud-12-sleuth-zipkin/

https://segmentfault.com/a/1190000015697673

elatstic 版本为2.6.x,下载地址:https://www.elastic.co/downloads/past-releases

http://www.cnblogs.com/JreeyQi/p/9336692.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值