18.SpringCloud - Spring Cloud 之 Sleuth分布式链路跟踪;Zipkin埋点数据;Elastic Search 数据持久化(十八)
18.SpringCloud - Spring Cloud 之 Sleuth分布式链路跟踪;Zipkin埋点数据;Elastic Search 数据持久化(十八)
阅读本文前可先参考
SpringCloud - Spring Cloud根/父项目,开发准备(二)_MinggeQingchun的博客-CSDN博客
一、Spring Cloud Sleuth
微服务有几种监控方式,如Spring Boot Actuator监控微服务,Spring Boot Admin监控微服务,Hystrix Dashboard监控Hystrix服务,Hystrix Turbine聚合多个Hystrix服务的监控信息等
对于一个由几十个、甚至几百个大型微服务构成的微服务架构系统,通常会遇到下面一些问题,如:
如何串联整个调用链路,快速定位问题?
如何理清各个微服务之间的依赖关系?
如何进行各个微服务接口的性能分折?
如何跟踪整个业务流程的调用处理顺序?
Spring Cloud Sleuth 为 spring Cloud提供了分布式跟踪的解决方案,它大量借用了Google Dapper、Twitter Zipkin和 Apache HTrace的设计。
Spring Cloud Sleuth 微服务跟踪(sleuth)其实是一个工具,它在整个分布式系统中能跟踪一个用户请求的过程(包括数据采集,数据传输,数据存储,数据分析,数据可视化),捕获这些跟踪数据,就能构建微服务的整个调用链的视图,这是调试和监控微服务的关键工具
SpringCloudSleuth有4个特点
特点 | 说明 |
---|---|
提供链路追踪 | 通过sleuth可以很清楚的看出一个请求经过了哪些服务, 可以方便的理清服务局的调用关系 |
性能分析 | 通过sleuth可以很方便的看出每个采集请求的耗时, 分析出哪些服务调用比较耗时,当服务调用的耗时 随着请求量的增大而增大时,也可以对服务的扩容提 供一定的提醒作用 |
数据分析 优化链路 | 对于频繁地调用一个服务,或者并行地调用等, 可以针对业务做一些优化措施 |
可视化 | 对于程序未捕获的异常,可以在zipkpin界面上看到 |
Spring Cloud Sleuth可以追踪10种类型的组件:async、Hystrix,messaging,websocket,rxjava,scheduling,web(Spring MVC Controller,Servlet),webclient(Spring RestTemplate)、Feign、Zuul
span(跨度):基本工作单元。span用一个64位的id唯一标识。除ID外,span还包含其他数据,例如描述、时间戳事件、键值对的注解(标签), spanID、span父 ID等。span被启动和停止时,记录了时间信息。初始化 span被称为"rootspan",该 span的 id和 trace的 ID相等;
trace(跟踪):一组共享"rootspan"的 span组成的树状结构称为 traceo trace也用一个64位的 ID唯一标识, trace中的所有 span都共享该 trace的 ID;
annotation(标注): annotation用来记录事件的存在,其中,核心annotation用来定义请求的开始和结束。
CS(Client sent客户端发送):客户端发起一个请求,该annotation描述了span的开始;
SR(server Received服务器端接收):服务器端获得请求并准备处理它。如果用 SR减去 CS时间戳,就能得到网络延迟;
SS(server sent服务器端发送):该annotation表明完成请求处理(当响应发回客户端时)。如果用 SS减去 SR时间戳,就能得到服务器端处理请求所需的时间;
CR(Client Received客户端接收): span结束的标识。客户端成功接收到服务器端的响应。如果 CR减去 CS时间戳,就能得到从客户端发送请求到服务器响应的所需的时间;
分布式链路追踪技术成熟产品
当然,分布式链路追踪技术已然成熟,产品也不少,国内外都有,如:
1、Spring Cloud Sleuth + Twitter Zipkin
2、阿里巴巴的"鹰眼"EagleEye
3、大众点评的"CAT"
4、美团的"Mtrace"
5、京东的"Hydra"
6、新浪的"Watchman"
这些产品我们也把他们叫做APM(Application Performance Management,即应用性能管理 ,简单来说就是应用监控)系统工具
二、Zipkin
(Spring Cloud Sleuth 整合Zipkin实现分布式链路跟踪)
Spring Cloud Sleuth对于分布式链路的跟踪仅仅是生成一些数据(埋点、打点),这些数据不便于阅读,因此我们一般把这种跟踪数据上传给Zipkin Server,由Zipkin通过UI页面统一进行数据的展示
Zipkin是Twitter开源的分布式实时数据跟踪系统(Distributed Tracking System),基于Google Dapper的论文设计而成,Google开源了 Dapper链路追踪组件,并在2010年发表了论文《Dapper, a Large-Scale Distributed Systems Tracing Infrastructure》,这篇文章是业内实现链路追踪的标杆和理论基础,具有非常大的参考价值。
Zipkin它的主要功能是收集系统的时序数据,从而追踪微服务架构的系统延时等问题,从而达到链路调用监控跟踪作用,另外Zipkin还提供了一个非常友好的UI界面,来帮助分析追踪数据
Zipkin官网地址:
GitHub地址
https://github.com/openzipkin/zipkin
1、搭建ZipKin Server服务端
搭建Zipkin Server 有两种方式
1、使用Java源码搭建服务端
2、使用Zipkin 官网编译好的 jar 执行
注:
1、如果你的项目是spring boot1.x (<2),可以使用Java源码 Spring Boot 项目编译,但是要注意 Zipkin 版本和 Spring Cloud版本兼容问题,不然会报错
2、Spring Boot 2.x 以后官网不推荐使用源码方式编译,推荐使用官网编译好的jar执行
Spring Boot 2.0 之后,在引入 zipkin-autoconfigure-ui 和 zipkin-server
依赖时必须要指定zipkin-server的版本号,而且即使指定版本号会出现非常多的问题,不要试图通过降低zipkin client 端的spring-cloud-starter-sleuth 和 spring-cloud-sleuth-zipkin依赖包的版本来解决bug,博主亲身体会多么痛的领悟!!!不起作用,会出现其他bug
1、使用Java源码搭建服务端
1、新建一个springboot Module(springcloud-9-service-sleuth-zipkin),搭建Zipkin Server服务端,设置父项目(服务提供者)
2、添加 zipkin-autoconfigure-ui,zipkin-server 等依赖
<!-- zipkin-autoconfigure-ui(网页界面) -->
<dependency>
<groupId>io.zipkin.java</groupId>
<artifactId>zipkin-autoconfigure-ui</artifactId>
<version>2.12.3</version>
</dependency>
<!-- zipkin-server -->
<dependency>
<groupId>io.zipkin.java</groupId>
<artifactId>zipkin-server</artifactId>
<version>2.12.3</version>
</dependency>
注:这个里面有版本的兼容性问题,当前我们的Spring Cloud Hoxton.SR12(2021-07-06)版本如果使用zipkin-server的最新的版本,可能会启动失败
<!--继承统一的父项目-->
<parent>
<groupId>com.company</groupId>
<artifactId>springcloud-demo</artifactId>
<version>1.0.0</version>
</parent>
<groupId>com.company</groupId>
<artifactId>springcloud-9-service-sleuth-zipkin</artifactId>
<version>1.0.0</version>
<name>springcloud-9-service-sleuth-zipkin</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<!-- zipkin-autoconfigure-ui(网页界面) -->
<dependency>
<groupId>io.zipkin.java</groupId>
<artifactId>zipkin-autoconfigure-ui</artifactId>
<version>2.12.3</version>
</dependency>
<!-- zipkin-server -->
<dependency>
<groupId>io.zipkin.java</groupId>
<artifactId>zipkin-server</artifactId>
<version>2.12.3</version>
</dependency>
</dependencies>
<build>
<plugins>
<!--spring boot提供的编译、打包的Maven插件-->
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
3、创建 aplication.properties 文件,用于获取配置信息 #内嵌的Undertow服务器的端口
#内嵌的Undertow服务器的端口
server.port=9410
#zipkin启动报错无法访问的解决方法
management.metrics.web.server.autoTimeRequests=false
4、在 Spring Boot 的启动类中,加入注解:@EnableZipkinServer
import zipkin2.server.internal.EnableZipkinServer;
@EnableZipkinServer //开启zipkin server的支持
@SpringBootApplication
public class Service9SleuthZipkinApplication {
public static void main(String[] args) {
SpringApplication.run(Service9SleuthZipkinApplication.class, args);
}
}
5、然后启动Zipkin Server服务,访问http://localhost:9410 (默认启动了Undertow服务的9410端口)
2、使用Zipkin 官网编译好的 jar 执行
Zipkin GitHub地址 :
GitHub - openzipkin/zipkin: Zipkin is a distributed tracing system
1、下载Zipkin官网的 jar 包,下载地址
https://search.maven.org/remote_content?g=io.zipkin&a=zipkin-server&v=LATEST&c=exec
(1)或者 点击 Quick-start 的 latest released server
就可以直接下载 ,就是有点慢,没办法,只能慢慢等
(2)或者通过 Linux 命令,创建一个 Zipkin 文件夹存放路径,下载后传到 Windows系统即可
# 创建目录zipkin
mkdir xxx/xxxx/zipkin
# 进入zipkin目录
cd xxx/xxxx/zipkin
# 下载zipkin的jar包
curl -sSL https://zipkin.io/quickstart.sh | bash -s
2、下载之后 执行 jar 包
java -jar zipkin-server-2.23.16-exec.jar
3、 访问http://localhost:9411 (默认启动了Undertow服务的9411端口)
新版本界面
老版本界面
服务名:就是微服务配置文件中的application name;
Span名称:跨度;
时间段 :现在查询的时间段;
根据Annotation查询:根据标注查询,用于自定义查询条件;
持续时间:一次调用链的持续时间;
数量:一页数量;
排序:排序规则
2、S leuth微服务整合Zipkin
1、在 微服务 消费者,提供者项目中添加如下依赖
<!-- spring-cloud-starter-sleuth -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-sleuth</artifactId>
</dependency>
<!-- spring-cloud-starter-zipkin -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-zipkin</artifactId>
</dependency>
2、 配置文件
#指定Zipkin server地址
spring.zipkin.base-url=http://localhost:9411
#发送跟踪数据到zipkin的类型web(http)
spring.zipkin.sender.type=web
#request采样的数量 默认是0.1 也即是10%,即采样10%的请求数据;
#因为在分布式系统中,数据量可能会非常大,因此采样非常重要我们示例数据少最好配置为1全采样,100%的采集会稍微影响一点性能
spring.sleuth.sampler.probability=1.0
3、启动测试
三、Elastic Search
我们已经把分布式链路调用信息上传到 zipkin server 上,通过zipkin server 的ui界面我们能看到调用链路信息,但是这些上传了的跟踪信息没有持久化保存
当zipkin重启后分布式链路数据就全部清空了,因为zipkin server 默认数据是存储在内存中的,所以为了后续一直都能查看调用链路信息,因此需要将 Zipkin Server 数据持久化
Elastic Search是一个分布式、高扩展、高实时的搜索和数据分析引擎,一个建立在全文搜索引擎 Apache Lucene基础上的搜索引擎,支持各种数据类型,包括文本、数字、地理、结构化、非结构化。
GitHub
https://github.com/elastic/elasticsearch
下载
Download Elasticsearch | Elastic
以下摘自百度百科
Elasticsearch是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口。Elasticsearch是用Java语言开发的,并作为Apache许可条款下的开放源码发布,是一种流行的企业级搜索引擎。Elasticsearch用于云计算中,能够达到实时搜索,稳定,可靠,快速,安装使用方便。官方客户端在Java、.NET(C#)、PHP、Python、Apache Groovy、Ruby和许多其他语言中都是可用的。根据DB-Engines的排名显示,Elasticsearch是最受欢迎的企业搜索引擎,其次是Apache Solr,也是基于Lucene。
Lucene
Lucene是apache下的一个开源的,一套用java写的全文检索的工具包
全文检索
从非结构化数据 (不定长或无固定格式的数据,如邮件,word文档等磁盘上的文件)中提取出的然后重新组织(分词 )的信息,我们称之索引 。先建立索引,再对索引进行搜索的过程就叫全文检索
分词
将采集到的文档内容切分成一个一个的词。如"I like apples , i mean fruit",根据一定的规则后分词为"i"、"like"、"apple"、"mean"、"fruit"。
Elastic Search基于lucene,封装 了许多lucene底层功能,提供了分布式的服务、简单易用的restful API接口和许多语言的客户端
1、 Elastic Search下载安装
将 Elastic Search 下载后,解压下载后的压缩包即完成安装,切换到bin目录,使用双击elasticsearch.bat 脚本启动
启动后访问,(默认端口9200)
++++http://localhost:9200++++
如果返回 JSON 信息表示安装成功
Zipkin 与 Elastic Search整合
在zipkin Server中添加依赖:
1、添加依赖
<dependency>
<groupId>io.zipkin.java</groupId>
<artifactId>zipkin-autoconfigure-storage-elasticsearch-http</artifactId>
<version>2.8.4</version>
</dependency>
2、配置文件:
zipkin.storage.type=elasticsearch
zipkin.storage.elasticsearch.cluster=elasticsearch
zipkin.storage.elasticsearch.hosts=http://localhost:9201
zipkin.storage.elasticsearch.index=zipkin
至此 zipkin server上的跟踪数据便存储在了Elasticsearch中,当zipkin server 重启或宕机,历史数据依然不会丢失
来源:https://blog.csdn.net/MinggeQingchun/article/details/125407863