Spring cloud系列十四 分布式链路监控Spring Cloud Sleuth

1. 概述

Spring Cloud Sleuth实现对Spring cloud 分布式链路监控 
本文介绍了和Sleuth相关的内容,主要内容如下:

  • Spring Cloud Sleuth中的重要术语和意义:Span、Trance、Annotation
  • Zipkin中图形化展示分布式链接监控数据并说明字段意义
  • Spring Cloud集成Sleuth + Zipkin 的代码demo: Sleuth集成Zipkin, Zipkin数据持久化等

2. 术语

Span 
Span是基本的工作单元。Span包括一个64位的唯一ID,一个64位trace码,描述信息,时间戳事件,key-value 注解(tags),span处理者的ID(通常为IP)。 
最开始的初始Span称为根span,此span中span id和 trace id值相同。

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

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

  • cs - Client Sent:客户端发送一个请求,表示span的开始
  • sr - Server Received:服务端接收请求并开始处理它。(sr-cs)等于网络的延迟
  • ss - Server Sent:服务端处理请求完成,开始返回结束给服务端。(ss-sr)表示服务端处理请求的时间
  • cr - Client Received:客户端完成接受返回结果,此时span结束。(cr-sr)表示客户端接收服务端数据的时间

如果一个服务的调用关系如下: 
这里写图片描述

那么此时将Span和Trace在一个系统中使用Zipkin注解的过程图形化: 
这里写图片描述

每个颜色的表明一个span(总计7个spans,从A到G),每个span有类似的信息

Trace Id = X
Span Id = D
Client Sent
  • 1
  • 2
  • 3

此span表示span的Trance Id是X,Span Id是D,同时它发送一个Client Sent事件

spans 的parent/child关系图形化如下: 
这里写图片描述

3. 在Zipkin中图形化展示分布式链接监控数据

3.1 spans在zipkin界面的信息解读

在Zipkin中展示了上图的跟踪信息,红框里是对上图调用span的跟踪 
这里写图片描述

但是你点击这个trace时,我们只看到4个span 
这里写图片描述

为什么两个界面显示的span数量不同,一个是7,一个4.

  • 1 个 spans:来自servier1的接口http:/start 被调用,分别是Server Received (SR) 和 Server Sent (SS) annotations.
  • 2 个 spans:来自 service1 调用service2 的 http:/foo 接口。service1 端有两个span,分别为 Client Sent (CS) 和 Client Received (CR) annotations。service2 端也有两个span,分别为Server Received (SR) 和Server Sent (SS) 。物理上他有2个span,但是从逻辑上说这个他们组成一个RPC调用的span。
  • 2个span:来自 service2 调用 service3 的 http:/bar 接口,service2 端有两个span,分别为Client Sent (CS) 和 Client Received (CR) annotations。service3 端也有两个span,分别为Server Received (SR) 和Server Sent (SS) 。物理上他有2个span,但是从逻辑上说它们都是同一个RPC调用的span。
  • 2个span:来自 service2 调用 service4 的 http:/bar 接口,service2 端有两个span,分别为Client Sent (CS) 和 Client Received (CR) annotations。service4 端也有两个span,分别为Server Received (SR) and Server Sent (SS) 。物理上他有2个span,但是从逻辑上说这个它们都是同一个RPC调用的span。

所以我们计算物理spans有7个:

  • 1个来自 http:/start 被请求
  • 2个来自 service1调用service2
  • 2个来自 service2调用service3
  • 2个来自 service2调用service4.

从逻辑上说,我们只看到4个span:

  • 1个来自 service1 的接口http:/start 被请求
  • 3个来自 服务之前的RCP接口调用

3.2. Zipkin可视化错误

如果调用链路中发生接口调用失败,zipkin会默认使用红色展示信息,如下图: 
这里写图片描述
点击红色的span,可以看到详细的失败信息: 
这里写图片描述

4. Spring Cloud集成Sleuth + Zipkin

本节演示在Spring Cloud中集成Sleuth并将链路监控数据传送到Zipkin,使用Zipkin展示数据,并配置mysql进行数据持久化

4.1. 相关工程

cloud-registration-center 
注册中心

cloud-service-zipkin 
提供测试服务接口,对外提供有两个接口: 
- 调用成功后,马上返回一个结果: http://127.0.0.1:17602//zipkin/simple 
- 调用成功后,服务sleep 5s后再返回: http://127.0.0.1:17602//zipkin/sleep

cloud-consumer-zipkin 
消费服务 
此服务会通过Feign调用cloud-service-zipkin里提供的两个接口(/zipkin/sleep和/zipkin/simple),我们访问如下URL会调用的对应的接口: 
http://127.0.0.1:17603//zipkin/simple 
http://127.0.0.1:17603//zipkin/sleep

以上3个服务的代码比较简单,这里代码略,可以自己看github里的代码。下文中只列出和Sleuth和Zipkin相关的配置。

cloud-dashboard-zipkin 
配置Zipkin服务,提供可视化链路监控 
Zipkin首页:http://127.0.0.1:17601/zipkin/

4.2. 在工程中使用sleuth+zipkin+http配置

在cloud-service-zipkin和cloud-consumer-zipkin中启动sleuth,sleuth会收集spans信息,并使用http异步地将spans 信息发送到Zipkin,然后Zipkin展示信息

cloud-service-zipkin和cloud-consumer-zipkin配置Sleuth+Zipkin 
2个工程中为了集成Sleuth和Zipkin,需要在普通工程基础上增加如下配置:

  • pom.xml增加sleuth和zipkin相关的jar
<!-- sleuth配置 -->
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-sleuth</artifactId>
</dependency>
<!-- 引入zipkin  -->
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-zipkin</artifactId>
</dependency>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • application-zipkin.yml 
    Zipkin+Sleuth配置参数: 
    • spring.zipkin.baseUrl:指定cloud-dashboard-zipkin的服务地址,本例子中使用真实的IP。在新的版本spring-cloud-sleuth-core-1.3.0.RELEASE中,可以实现通过服务名称进行访问
    • spring.sleuth.sampler.percentage:设置采样率,为了测试设置100%采集
spring:zipkin:enabled: true# zipkkin dashboard的地址:通过真实IP地址访问baseUrl: http://localhost:17601/# 通过cloud-dashboard-zipkin注册到注册中心的服务名称访问,本版本(spring-cloud-sleuth-core-1.2.5.RELEASE)不支持,需要从spring-cloud-sleuth-core-1.3.0.RELEASE开始支持这个功能# 配置如下:# baseUrl: http://cloud-dashboard-zipkin/sleuth:sampler:#  默认值为0.1f,现在为了测试设置100%采集percentage: 1
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

cloud-dashboard-zipkin 
配置zipkin服务

  • pom.xml
<!-- spring-cloud-starter-zipkin -->
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-zipkin</artifactId>
</dependency>
<!-- zipkin 界面-->
<dependency><groupId>io.zipkin.java</groupId><artifactId>zipkin-autoconfigure-ui</artifactId>
</dependency>
<!-- zipkin 服务类-->
<dependency><groupId>io.zipkin.java</groupId><artifactId>zipkin-server</artifactId>
</dependency>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 配置参数 
    bootstrap-zipkin-http.yml
# port
server:port: 17601spring:application:# 本服务注册到注册到服务器的名称, 这个名称就是后面调用服务时的服务标识符name: cloud-dashboard-zipkin
eureka:client:serviceUrl:# 服务器注册/获取服务器的zonedefaultZone: http://127.0.0.1:10761/eureka/# defaultZone: http://192.168.21.3:10761/eureka/,http://192.168.21.4:10761/eureka/instance:prefer-ip-address: true
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • application-zipkin-http.yml 
    关闭本工程的推送到zipkin服务的功能
spring:zipkin:enabled: false
  • 1
  • 2
  • 3

启动类: 
@EnableZipkinServer:注解此类为Zipkin服务

@EnableEurekaClient // 配置本应用将使用服务注册和服务发现
@SpringBootApplication
@EnableZipkinServer // 启动Zipkin服务
public class ZipkinDashboardCloudApplication {public static void main(String[] args) {args = new String[1];args[0] = "--spring.profiles.active=zipkin-http";SpringApplication.run(ZipkinDashboardCloudApplication.class, args);}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

4.3. 测试

启动zipkin服务,提供可视化链路监控 
Zipkin访问地址: http://127.0.0.1:17601/zipkin/

我们演示链路跟踪,访问以下两个请求: 
http://127.0.0.1:17603/zipkin/simple :正常方法 
http://127.0.0.1:17603/zipkin/sleep :访问超时

进入zipkin,访问成功为蓝色,失败为红部。同时显示各个服务花费的时间 
这里写图片描述

点击蓝色记录,进入详细界面 
可知整个接口花费约19ms,cloud-zipkin-service的业务执行15ms,cloud-zipkin-consumer访问cloud-zipkin-service的 网络延迟为2ms,返回结果给cloud-zipkin-service的网络延迟是4s 
这里写图片描述

点击cloud-zipkin-service得到更精确的数据

这里写图片描述

4.4. Zipkin数据持久化

默认情况,zipkin存储记录到内存,如果服务重启,则所有记录丢失。为了保证持久性,zipkin支持Mysql、Elasticsearch、Cassandra存储。我们演示为zipkin配置MYSQL数据库,其它两种配置类似,本文略 
pom.xml为cloud-dashboard-zipkin引入新jar

 <!-- zipkin 存储到数据库需要引入此类 -->
<dependency><groupId>io.zipkin.java</groupId><artifactId>zipkin-autoconfigure-storage-mysql</artifactId>
</dependency><!--保存到数据库需要如下依赖-->
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>6.0.6</version>
</dependency>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

配置参数: 
application-zipkin-http.yml: 
配置启动时会根据classpath:/mysql.sql初始化数据库

spring:zipkin:enabled: false# 配置mysqldatasource:schema: classpath:/mysql.sql# url: jdbc:mysql://127.0.0.1/testurl: jdbc:mysql://127.0.0.1:3306/test?zeroDateTimeBehavior=convertToNull&serverTimezone=GMT%2b8username: rootpassword: root
# Switch this on to create the schema on startup:initialize: truecontinueOnError: truesleuth:enabled: false
zipkin:storage:type: mysql
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

重启服务,服务成功后,查看数据库,自动生成数据库 
这里写图片描述

如此数据库配置完毕,所有的spans信息存储到数据库中,重启服务,也不会丢失记录

4.5 在工程中使用sleuth+zipkin+ Spring Cloud Stream配置

本版本(spring-cloud-sleuth-core-1.2.5.RELEASE)支持集成spring-cloud-sleuth-stream,但是在新版本从spring-cloud-sleuth-core-1.3.0.RELEASE开始不支持spring-cloud-sleuth-stream。推荐直接使用通过集成RabbitMQ 或 Kafka。关于集成RabbitMQ 或 Kafka,关键是引入spring-rabbit 或 spring-kafka依赖包。默认的目的名称为zipkin. 
对于这个的使用demo。这里暂时略

5. 代码

以上的详细的代码见下面 
github代码,请尽量使用tag v0.11,不要使用master,因为我不能保证master代码一直不变

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/387078.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux源码编译安装程序

一、程序的组成部分 Linux下程序大都是由以下几部分组成&#xff1a; 二进制文件&#xff1a;也就是可以运行的程序文件 库文件&#xff1a;就是通常我们见到的lib目录下的文件 配置文件&#xff1a;这个不必多说&#xff0c;都知道 帮助文档&#xff1a;通常是我们在linux下用…

selenium用法详解

selenium用法详解 selenium主要是用来做自动化测试&#xff0c;支持多种浏览器&#xff0c;爬虫中主要用来解决JavaScript渲染问题。 模拟浏览器进行网页加载&#xff0c;当requests,urllib无法正常获取网页内容的时候一、声明浏览器对象 注意点一&#xff0c;Python文件名或者…

haoop笔记

8:00 2019/3/141&#xff1a;什么是hadoop? hadoop是解决大数据问题的一整套技术方案2&#xff1a;hadoop的组成? 核心框架 分布式文件系统 分布式计算框架 分布式资源分配框架 hadoop对象存储 机器计算3&#xff1a;hadoop 云计算 大数据 微服务 人工智能关系 参见word学习…

Sleuth则是用来共方便的集成Zipkin。

简述 使用 spring cloud 用到最多的是各种rest服务调用&#xff0c;Twitter的Zipkin 是一种实现分布式跟踪解决方案&#xff0c;Sleuth则是用来共方便的集成Zipkin。调用跟踪系统的业务场景 随着服务的拆分&#xff0c;系统的模块变得越来越多&#xff0c;不同的模块可能由不同…

Spring Cloud 中 分布式事务解决方案 -- 阿里GTS的使用

1&#xff1a;依赖引入<!--gts相关--><!--数据库连接--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-jdbc</artifactId></dependency><dependency><groupId>mysql&…

《HTTP 权威指南》笔记:第十五章 实体与编码

&#xfffc; 如果把 「HTTP 报文」想象为因特网货运系统的「箱子」,那么「HTTP 实体」就是报文中的实际的「货物」. 其中,实体又包含了「实体首部」 和 「实体主体」,实体首部用于描述各种参数,实体主体就是原始货物. 常见的实体首部 实体的大小: Content-Length 定义: 报文的…

Spring Cloud Sleuth进阶实战

为什么需要Spring Cloud Sleuth 微服务架构是一个分布式架构&#xff0c;它按业务划分服务单元&#xff0c;一个分布式系统往往有很多个服务单元。由于服务单元数量众多&#xff0c;业务的复杂性&#xff0c;如果出现了错误和异常&#xff0c;很难去定位。主要体现在&#xff…

Element表格嵌入复选框以及单选框

1&#xff0c;element 表格嵌入CheckBox 效果图如下&#xff1a; 2&#xff0c;element结合checkBox实现单选效果如下&#xff1a; html代码&#xff1a; <template><div><p>shopInfo</p><el-tableref"multipleTable":data"tableDat…

温故之 “插入排序”

概念&#xff1a;将一个数据插入已经排好序的有序数组中&#xff0c;从而得到一个新的多一个数据的有序数组。 概念理解~~ 将要排序的是一个乱的数组int[] arrays {3, 2, 1, 3, 3}; 在未知道数组元素的情况下&#xff0c;我们只能把数组的第一个元素作为已经排好序的有序数据&…

实验二3

#include "stdafx.h" #include "stdio.h" int main(int argc, char* argv[]) {int a,b,c; scanf("%d %d %d",&a,&b,&c);if(ab&&bc) printf("等边三角形");else if((ab&&b!c)||(ac&&c!b)||(bc&a…

webpack来打包你的vue项目,如发现你的vendor.js过大

1.如果你使用了webpack来打包你的vue项目&#xff0c;如发现你的vendor.js过大则可以参考本文的解决方案. 2.造成过大的原因是因为在main.js导入第三库太多时,webpack合并js时生成了vendor.js(我们习惯把第三方库放在vendor里面)造成的.如下图在main.js引用element-ui等第三方…

TF01 简介

总览 如何从实体中提取特征&#xff0c;对于很多传统机器学习算法的性能有巨大影响。 一旦解决了数据表达和特征提取&#xff0c;很多人工智能任务也就解决了90%。 对许多机器学习算法来说&#xff0c;特征提取不是一件简单的事情。 深度学习解决的核心问题之一就是自动的将简…

K8s基本概念入门

序言 没等到风来&#xff0c;绵绵小雨&#xff0c;所以写个随笔&#xff0c;聊聊k8s的基本概念。 k8s是一个编排容器的工具&#xff0c;其实也是管理应用的全生命周期的一个工具&#xff0c;从创建应用&#xff0c;应用的部署&#xff0c;应用提供服务&#xff0c;扩容缩容应用…

idea出现找不到实体类

今天经理遇到一个很奇怪的问题&#xff1a; 在使用idea时&#xff0c;就是包真实存在&#xff0c;但是包中的实体类却无法智能提示&#xff0c;也无法导入成功&#xff1b; 我推荐的解决办法是重新导入&#xff0c;但是没有用&#xff0c;经理在网上找了很多解决方式&#xff0…

TF02 入门

计算模型——图 数据模型——张量 运行模型——会话 TensorFlow计算模型——计算图 计算图是TF中最基本的一个概念&#xff0c;TF中的所有计算都会被转化为计算图上的结点。 TF是一个通过计算图的形式来表述计算的编程系统。TF中的每一个计算都是计算图上的一个节点&#x…

ElasticSearch、Logstash和Kiabana三个开源工具。

一 方案背景 通常&#xff0c;日志被分散的储存不同的设备上。如果你管理数十上百台服务器&#xff0c;你还在使用依次登录每台机器的传统方法查阅日志。这样是不是感觉很繁琐和效率低下。开源实时日志分析ELK平台能够完美的解决日志收集和日志检索、分析的问题&#xff0c;ELK…