springcloud-springcloud之sleuth分布式链路跟踪;zipkin埋点数据;elasticsearch数据持久化(十八)(代码片段)

MinggeQingchun MinggeQingchun     2022-10-21     780

关键词:

阅读本文前可先参考

​​​​​​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应用性能管理)工具

二、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官网地址:

http://zipkin.io

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、Sleuth微服务整合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 重启或宕机,历史数据依然不会丢失

springcloud-springcloud之config分布式配置;config注册至eureka;集成security安全认证(十七)(代码片段)

阅读本文前可先参考​​​​​​SpringCloud-SpringCloud根/父项目,开发准备(二)_MinggeQingchun的博客-CSDN博客https://blog.csdn.net/MinggeQingchun/article/details/125337347https://blog.csdn.net/MinggeQingchun/arti 查看详情

springcloud-springcloud之config分布式配置;加解密;配置信息局部刷新;springcloudbus+rabbitmq全局刷新(十六)(代码片段)

阅读本文前可先参考​​​​​​SpringCloud-SpringCloud根/父项目,开发准备(二)_MinggeQingchun的博客-CSDN博客https://blog.csdn.net/MinggeQingchun/article/details/125337347一、加解密在Git仓库中明文存储配置信息值,对于某些敏感... 查看详情

springcloud-springcloud之sleuth分布式链路跟踪;zipkin埋点数据;elasticsearch数据持久化(十八)(代码片段)

阅读本文前可先参考​​​​​​SpringCloud-SpringCloud根/父项目,开发准备(二)_MinggeQingchun的博客-CSDN博客一、SpringCloudSleuth微服务有几种监控方式,如SpringBootActuator监控微服务,SpringBootAdmin监控微服务,Hy... 查看详情

springcloud-springcloud之security服务安全机制(二十)(代码片段)

阅读本文前可先参考​​​​​​SpringCloud-SpringCloud根/父项目,开发准备(二)_MinggeQingchun的博客-CSDN博客SpringSecurity微服务的Rest服务都是基于http请求的,因此很有可能暴露在公网上,任何人都可能调用访问&#... 查看详情

springcloud-springcloud之gateway网关(十三)

阅读本文前可先参考​​​​​​SpringCloud-SpringCloud根/父项目,开发准备(二)_MinggeQingchun的博客-CSDN博客一、API网关引自百度百科API网关,软件术语,两个相互独立的局域网之间通过路由器进行通信,中... 查看详情

springcloud-springcloud之zuul和gateway网关(十四)(代码片段)

SpringCloudGateway是SpringCloud的一个子项目。而zuul则是Netflix公司的项目,只是Spring将zuul集成在SpringCloud中使用而已。因为zuul2.0连续跳票和zuul1的性能表现不是很理想,所以催生了spring团队开发了Gateway项目ZuulZuul是netflix公司的... 查看详情

springcloud-springcloud之config分布式配置;server,client配置(十五)(代码片段)

阅读本文前可先参考​​​​​​SpringCloud-SpringCloud根/父项目,开发准备(二)_MinggeQingchun的博客-CSDN博客在分布式微服务系统中,几乎所有服务的运行都离不开配置文件的支持,这些配置文件通常由各个服务... 查看详情

springcloud-springcloudnetflix之ribbon(代码片段)

阅读本文前可先参考 SpringCloud-SpringCloud根/父项目,开发准备(二)_MinggeQingchun的博客-CSDN博客SpringCloudRibbon是一套基于NetflixRibbon实现的客户端负载均衡和服务调用工具Ribbon是Netflix公司发布的开源组件,其主要功... 查看详情

springcloud-springcloud之apolloconfig携程阿波罗配置中心(二十一)(代码片段)

由于SpringCloud自带的Config需要配合Bus使用,且不能实时刷新,因此市面上出现了很多开元的配置中心市面上开源的配置中心Apollo(阿波罗):携程框架部门研发的分布式配置中心,能够集中化管理应用不同... 查看详情

springcloud-springcloud根/父项目,开发准备(代码片段)

一、SpringCloud开发项目工程说明在后续的SpringCloud工程项目开发,以及博文中,都要注意此文说明!1、SpringCloud本身并不是一个拿来即可用的框架,它是一套微服务规范,共有两代实现。(1)SpringCloudNet... 查看详情

springcloud-springcloudalibaba之gateway集成sentinel(代码片段)

阅读本文前可先参考SpringCloud-SpringCloud之Gateway网关(十三)_MinggeQingchun的博客-CSDN博客_spring.cloud.gateway.routes[0]SpringCloud-SpringCloudAlibaba之Sentinel规则持久化(十)_MinggeQingchun的博客-CSDN 查看详情

springcloud-springcloudnetflix之hystrixdashboard仪表盘监控(代码片段)

阅读本文前可先参考SpringCloud-SpringCloud根/父项目,开发准备(二)_MinggeQingchun的博客-CSDN博客https://blog.csdn.net/MinggeQingchun/article/details/125308948https://blog.csdn.net/MinggeQingchun/article/de 查看详情

springcloud-springcloudnetflix之eureka,ribbon(代码片段)

阅读本文前可先参考 SpringCloud-SpringCloud根/父项目,开发准备(二)_MinggeQingchun的博客-CSDN博客我们首先来看下不需要注册服务中心,服务消费者直接调用服务提供者一、服务消费者直接访问服务提供者1、服务提... 查看详情

springcloud-springcloudnetflix之zuul网关;路由(代码片段)

阅读本文前可先参考SpringCloud-SpringCloud根/父项目,开发准备(二)_MinggeQingchun的博客-CSDN博客一、API网关引自百度百科API网关,软件术语,两个相互独立的局域网之间通过路由器进行通信,中间的路由被称... 查看详情

orm之filter参数(代码片段)

‘exact‘:‘=%s‘,‘iexact‘:‘LIKE%s‘,‘contains‘:‘LIKEBINARY%s‘,‘icontains‘:‘LIKE%s‘,‘regex‘:‘REGEXPBINARY%s‘,‘iregex‘:‘REGEXP%s‘,‘gt‘:‘>%s‘,‘gte‘:‘>=%s‘,‘lt‘:‘<%s‘,‘lte‘:‘<=%s‘,‘startswith‘:‘LI 查看详情

神经网络之:s型神经元

1.S型神经元和感知器类似,但是被修改为权重和偏置的微小改动只引起输出的微小变化2.S型神经元结构:   S型函数:    带有x1,x2,........,权重w1,w2.....,和偏置b的S型神经元的输出是:  sigmoid函数图像  查看详情

springcloud-springcloud简介(代码片段)

1,springcloud简介​springcloud是分布式微服务架构的一站式解决方案,是多种微服务架构落地技术的集合体,俗称微服务全家桶。实现的功能有服务注册与发现,服务调用,服务熔断,负载均衡,服务降... 查看详情

python之字符串常用方法

1.字符串常用方法print(s.zfill(4))#在前面补0print(s.strip())print(s.lstrip())print(s.rstrip())print(s.replace(‘a‘,‘A‘))#替换print(s.count(‘c‘))#统计出现次数print(s.index(‘c‘))#找下标.找不到报错print(s.find(‘d‘))#找下标,找不到返回-1print 查看详情