前言

在spring cloud分布式架构中,系统被拆分成了许多个服务单元,业务复杂性提高。如果出现了异常情况,很难定位到错误位置,所以需要实现分布式链路追踪,跟进一个请求有哪些服务参与,参与的顺序如何,从而去明确一个问题。

spring cloud sleuth

通常来说,一个分布式服务跟踪系统主要由三部分:数据收集、数据存储和数据展示。

对于大规模的分布式系统来说,数据存储可分为实时数据和全量数据两部分。实时数据用来排查故障,全量数据用于系统优化;数据展示涉及数据挖掘和分析。

  • 名词解释

服务追踪的追踪单元是从客户端发起请求抵达被追踪的系统边界开始,到被追踪的边界开始,到被追踪的紫铜向客户返回响应为止的过程,称呼为一个 "trace"。每个 trace 中会调用若干个服务,为了记录调用了哪些服务,以及每次调用的响应时间等信息,在调用每个服务时,都会迈入一个调用记录,成为一个 "span"。如此,若干个有序的 span 就组成了一个 trace

在系统向外界提供服务的过程中,会不断地有请求和响应发生,也就会不断生成 trace,把这些带有spantrace 记录下来,就可以描绘出一幅系统的服务拓扑图。附带上 span 中的响应时间,以及请求成功与否等信息,就可以在发生问题的时候,找到异常的服务;根据历史数据,还可以从系统整体层面分析出哪里性能差,定位性能优化的目标。


spring cloud sleuth 为服务之间提供链路追踪。我们可以清楚的认识到一个请求经过了哪些服务,每个服务处理花了多长时间,理清服务之间的调用关系和顺序


spring cloud sleuth 主要提供了数据收集部分功能,因此需要结合 zipkin,将信息发送到zipkin,利用zipkin的存储来存储信息,利用zipkin ui来展示数据。

zipkin

Zipkin 是一个开放源代码分布式的跟踪系统,由Twitter公司开源,主要用于数据的存储、查找和展示。 zipkin 提供了可拔插数据存储方式,生产环境中推荐使用 Elasticsearch,还能结合 kibana 使用。

Zipkin 和 Config 结构类似,分为服务端 Server,客户端Client,客户端就是各个微服务应用。

具体使用

zipkin-server服务端

在Spring boot 2.0版本之后,官方不再推荐支持自己搭建服务,而是直接提供编译好的jar包,直接运行jar包,启动服务,非常方便。还有docker启动,Running from Source等,具体的可以在官网查看,链接:https://zipkin.io/pages/quickstart.html

Docker方式(quickest)

docker run -d -p 9411:9411 openzipkin/zipkin

java(终端命令模式)

curl -sSL https://zipkin.io/quickstart.sh | bash -s
java -jar zipkin.jar

备注:必须环境为java8及其以上。jar包下载地址:https://search.maven.org/remote_content?g=io.zipkin&a=zipkin-server&v=LATEST&c=exec

运行

浏览器启动地址http://localhost:9411/zipkin/,成功之后看到如下界面

客户端

项目依赖(maven)

  • 仅仅使用Spring Cloud Sleuth,不包含Zipkin
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-sleuth</artifactId>
</dependency>
  • 同时使用Spring Cloud Sleuth + Zipkin(HTTP查看)
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-zipkin</artifactId>
</dependency>
  • 使用RabbitMQ或Kafka而不是HTTP

如果使用Kafka,则必须相应地设置property spring.zipkin.sender.type属性:

spring.zipkin.sender.type: kafka

注意: spring-cloud-sleuth-stream 已不推荐使用,现已不兼容。

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

详情见官网:https://cloud.spring.io/spring-cloud-sleuth/reference/html/#sleuth-adding-project

  • 实例

在所有服务中引入

<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-zipkin</artifactId>
</dependency>
</dependencies>

Spring应用在监测到Java依赖包中有sleuth和zipkin后,会自动在RestTemplate的调用过程中向HTTP请求注入追踪信息,并向Zipkin Server发送这些信息。

配置文件(建议application.yml)

server:
port: 9400
spring:
application:
name: zipkin-server
zipkin:
base-url: http://ivms.io:9411
sender:
type: web
sleuth:
sampler:
probability: 0.1
rate: 2
eureka:
client:
serviceUrl:
defaultZone: http://192.168.2.42:8761/eureka/
logging:
level:
root: debug

Spring Cloud Sleuth有一个Sampler策略,可以通过这个实现类来控制采样算法。默认采样率为0.1,即10%,这里设置 1.0,全部采样。

注意一下,版本不同,所使用的配置也不同。sender.type需要手动指定,默认是rabbitmq,不然会导致zipkin界面没有客户端连接。还有sleuth.sampler中的percentage现在也变成了rate,要注意,之后也可能会再变化,跟着版本走,别人的例子都是参考一个大致方向

启动服务

然后把测试服务启动,随便请求一个接口

  • 控制台输出

会发现有这样子的东西打印,这是好事,证明追踪到了请求记录。解释一下:

  1. 第一个值 zipkin-client1,记录了应用的名称

  2. 第二个a942e108d3baceb8,是 Spring Cloud Sleuth 生成的一个 ID,称为 Trace ID,它用来标识一条请求链路。一条请求链路中包含一个 Trace ID,多个 Span ID。(上面说过了)

  3. 第三个就是spanID了,它表示一个基本的工作单元,比如发送一个 HTTP 请求。

  4. true代表是否要将该信息输出到 Zipkin Server 中来收集和展示。因为我们设置了采集率1.0,所以自然是true

  • zaipkin UI展示

然后就看一下浏览器显示什么吧,打开 http://localhost:9411/zipkin/

可以看到Service Name中多了一个东西 zipkin-client1(我的服务名,这不是什么专业名词哈),然后点击 Find Traces 就可以看到一条服务调用记录

可以看到上面显示了服务调用耗时,请求数量,是否成功,然后点击记录可以看到服务调用链路关系,点击依赖分析可以看到服务之间的依赖关系,自己尝试一下

结语:很简单,但我花了两天,因为升级之后完全大改,网上也没有资料,只能去看官网文档,更坑的是中文网和官网写的不一样(对比spring cloud sleuth),摊手。之后会结合 gateway、ELK 实践一下,缘分更新。

springcloud --- spring cloud sleuth和zipkin日志管理(spring boot 2.18)的更多相关文章

  1. 跟我学SpringCloud | 第十一篇:使用Spring Cloud Sleuth和Zipkin进行分布式链路跟踪

    SpringCloud系列教程 | 第十一篇:使用Spring Cloud Sleuth和Zipkin进行分布式链路跟踪 Springboot: 2.1.6.RELEASE SpringCloud: ...

  2. Spring Cloud Sleuth 和 Zipkin 进行分布式跟踪使用指南

    分布式跟踪允许您跟踪分布式系统中的请求.本文通过了解如何使用 Spring Cloud Sleuth 和 Zipkin 来做到这一点. 对于一个做所有事情的大型应用程序(我们通常将其称为单体应用程序) ...

  3. Distributed traceability with Spring Cloud: Sleuth and Zipkin

    I. Sleuth 0. Concept Trace A set of spans that form a call tree structure, forms the trace of the re ...

  4. spring cloud 入门系列八:使用spring cloud sleuth整合zipkin进行服务链路追踪

    好久没有写博客了,主要是最近有些忙,今天忙里偷闲来一篇. =======我是华丽的分割线========== 微服务架构是一种分布式架构,微服务系统按照业务划分服务单元,一个微服务往往会有很多个服务单 ...

  5. Spring Cloud sleuth with zipkin over RabbitMQ教程

    文章目录 Spring Cloud sleuth with zipkin over RabbitMQ demo zipkin server的搭建(基于mysql和rabbitMQ) 客户端环境的依赖 ...

  6. springcloud(十二):使用Spring Cloud Sleuth和Zipkin进行分布式链路跟踪

    随着业务发展,系统拆分导致系统调用链路愈发复杂一个前端请求可能最终需要调用很多次后端服务才能完成,当整个请求变慢或不可用时,我们是无法得知该请求是由某个或某些后端服务引起的,这时就需要解决如何快读定位 ...

  7. 【spring cloud】spring cloud Sleuth 和Zipkin 进行分布式链路跟踪

    spring cloud 分布式微服务架构下,所有请求都去找网关,对外返回也是统一的结果,或者成功,或者失败. 但是如果失败,那分布式系统之间的服务调用可能非常复杂,那么要定位到发生错误的具体位置,就 ...

  8. 使用Spring Cloud Sleuth和Zipkin进行分布式链路跟踪

    原文:http://www.cnblogs.com/ityouknow/p/8403388.html 随着业务发展,系统拆分导致系统调用链路愈发复杂一个前端请求可能最终需要调用很多次后端服务才能完成, ...

  9. spring cloud深入学习(十三)-----使用Spring Cloud Sleuth和Zipkin进行分布式链路跟踪

    随着业务发展,系统拆分导致系统调用链路愈发复杂一个前端请求可能最终需要调用很多次后端服务才能完成,当整个请求变慢或不可用时,我们是无法得知该请求是由某个或某些后端服务引起的,这时就需要解决如何快读定位 ...

随机推荐

  1. 牛客多校第七场 C Bit Compression 思维

    链接:https://www.nowcoder.com/acm/contest/145/C来源:牛客网 A binary string s of length N = 2n is given. You ...

  2. CF - 1110F Nearest Leaf

    题目传送门 题解: 先用题目给定的dfs方式得到dfs序,记录下出入的dfs序. 很明显可以得知的是,以u为根的子树的dfs序在 in[u] - out[u] 的范围之内. 将每个询问先全部存到对应的 ...

  3. Java 中创建对象的 5 种方式!

    Java中有5种创建对象的方式,下面给出它们的例子还有它们的字节码 Employee类: class Employee implements Cloneable, Serializable { pri ...

  4. 关于格林尼治时间(GMT)和DateTime相互转换的分享

    普及一下什么是格林尼治时间? 世界时UT即格林尼治 平太阳时间,是指格林尼治所在地的标准时间,也是表示地球自转速率的一种形式.以地球自转为基础的时间计量系统.地球自转的角度可用地方子午线相对于地球上的 ...

  5. MongoDB入门及 c# .netcore客户端MongoDB.Driver使用

    MongoDB 是一个基于分布式文件存储的数据库.由 C++ 语言编写.旨在为 WEB 应用提供可扩展的高性能数据存储解决方案. MongoDB 是一个介于关系数据库和非关系数据库之间的产品,是非关系 ...

  6. innobackupex备份参数slave-info、safe-slave-backup

    mysql物理备份用的比较多的是innobackupex命令,备份常用,但对于里面的两个参数slave-info.safe-slave-backup一直搞的不太明白,今儿亲测了一下. 先解释一下参数意 ...

  7. IOCAutofac与ORMEntityFramwork的联系--单例模式

    在你阅读之前默认你已经理解了IOC.DI.ORM以及autofac和EF的使用 在我最近写项目的时候我在单步调试时偶然发现的一个问题 先说明我的项目使用.NET MVC 三层架构,运用IOC Auto ...

  8. apk签名发布及其原理

    如果我们在ADT中开发完了一个android项目,如何将它打包呢?方法如下: 1.unsigned APP(无签名的APP) 最懒惰的方法,可以直接在项目的bin目录下直接将apk拷贝出来,就ok了. ...

  9. Linux服务器端口access改为trunk all

    1.确认可用网卡及vlan id eth5可用 vlan25:10.118.25.0/24 2.编辑网卡配置文件 vim /etc/sysconfig/network-scripts/ifcfg-et ...

  10. SqlServer2014怎样还原数据库

    场景 在SqlServer2014企业版上怎样进行数据库的还原,首先你得有一个其他数据 的备份文件. 实现 打开cmd,输入sql,打开SqlServer 2014 Management Studio ...