Spring Cloud Sleuth + Zipkin实现分布式链路跟踪

Spring Cloud Sleuth为SpringCloud应用实现了一种分布式链路跟踪解决方案,通过Sleuth可以很清楚了解到一个服务请求经过了哪些服务,每个服务处理花费了多长时间。

Sleuth术语

    Span 

        Span是基本的工作单元。Span包括一个64位的唯一ID,一个64位trace码,描述信息,时间戳事件,key-value 注解(tags),span处理者的ID(通常为IP)。 

        每个trace中会调用若干个服务,为了记录调用了哪些服务,以及每次调用的消耗时间等信息,在每次调用服务时,埋入一个调用记录,称为一个span。

    Trace

         包含一系列的span,它们组成了一个树型结构。

         从客户发起请求(request)抵达被追踪系统的边界开始,到被追踪系统向客户返回响应(response)为止的过程,称为一个 trace。

    Annotation 

         用于及时记录存在的事件。常用的Annotation如下:

              cs - Client Sent:客户端发送一个请求,表示span的开始

              sr - Server Received:服务端接收请求并开始处理它。(sr-cs)等于网络的延迟

              ss - Server Sent:服务端处理请求完成,开始返回结果给服务端。(ss-sr)表示服务端处理请求的时间

              cr - Client Received:客户端完成接收返回结果,此时span结束。(cr-sr)表示客户端接收服务端数据的时间

 Sleuth的用途:

        耗时分析: 通过Sleuth可以很方便的了解到每个采样请求的耗时,从而分析出哪些服务调用比较耗时;

        可视化错误: 对于程序未捕捉的异常,可以通过集成Zipkin服务界面上看到;

        链路优化: 对于调用比较频繁的服务,可以针对这些服务实施一些优化措施。

Spring Cloud Sleuth 可以结合Zipkin,将信息发送到Zipkin,利用Zipkin的存储来存储信息,利用Zipkin UI来展示数据。

Zipkin是Twitter的一个开源项目,它基于Google Dapper实现,它致力于收集服务的定时数据,以解决微服务架构中的延迟问题,包括数据的收集、存储、查找和展现。

Zipkin原理:基本思路是在服务调用的请求和响应中加入ID,标明上下游请求的关系。利用这些信息,可以可视化地分析服务调用链路和服务间的依赖关系。

Zipkin提供了可插拔数据存储方式:In-Memory(默认)、MySql、Cassandra 以及 Elasticsearch。

Zipkin主要由4个核心组件构成:

       Collector:收集器组件,它主要用于处理从外部系统发送过来的跟踪信息,将这些信息转换为Zipkin内部处理的Span格式,以支持后续的存储、分析、展示等功能。

       Storage:存储组件,它主要对处理收集器接收到的跟踪信息,默认会将这些信息存储在内存中,我们也可以修改此存储策略,通过使用其他存储组件将跟踪信息存储到数据库中。

       RESTful API:API组件,它主要用来提供外部访问接口。比如给客户端展示跟踪信息,或是外接系统访问以实现监控等。

       Web UI:UI组件,基于API组件实现的上层应用。通过UI组件用户可以方便而又直观地查询和分析跟踪信息。

Zipkin分为两端,一个是Zipkin服务端,一个是Zipkin客户端,客户端也就是微服务应用。客户端会配置服务端的URL地址,一旦发生服务间的调用时,会被配置在微服务里面的Sleuth监听器监听,并生成相应的Trace和Span信息发送给服务端。发送的方式主要有两种,一种是HTTP报文的方式,另一种是消息总线的方式如RabbitMQ。

Zipkin服务端

        使用Spring Boot 2.x版本后,官方直接提供了编译好的jar包来给我们使用,比如本范例使用的jar包是zipkin-server-2.9.4-exec.jar

        到 https://dl.bintray.com/openzipkin/maven/io/zipkin/java/zipkin-server/ 下载相应的jar包。

        执行 java -jar zipkin-server-2.9.4-exec.jar 命令启动Zipkin Server,端口默认是9411

        在浏览器访问 http://localhost:9411,显示效果如下图:

Spring Cloud Sleuth + Zipkin实现分布式链路跟踪
 Zipkin客户端:

     在pom.xml文件添加以下依赖:

<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>

     在application.properties文件添加以下配置:

#设置采样比例为1.0。默认是0.1
spring.sleuth.sampler.probability=1.0

#Zipkin服务器的地址
spring.zipkin.base-url=http://localhost:9411/

    启动注册中心和各个微服务应用,注册中心的主界面最终如下:

Spring Cloud Sleuth + Zipkin实现分布式链路跟踪
 

    访问微服务URL后,在Zipkin Server即可查看到服务的调用关系:

Spring Cloud Sleuth + Zipkin实现分布式链路跟踪
 Zipkin Server改用Mysql存储数据

       到 https://github.com/openzipkin/zipkin/tree/master/zipkin-storage 下载mysql的建表脚本

       手动创建一个名为zipkin的数据库,执行建表脚本

       执行以下命令启动zipkin-server:

java -jar zipkin-server-2.9.4-exec.jar --STORAGE_TYPE=mysql --MYSQL_HOST=localhost --MYSQL_TCP_PORT=3306 --MYSQL_USER=root --MYSQL_PASS=root

相关推荐