使用Spring Cloud Sleuth实现微服务跟踪

2023-12-07 20:08

本文主要是介绍使用Spring Cloud Sleuth实现微服务跟踪,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

使用Spring Cloud Sleuth实现微服务跟踪

之前已经了解了几种监控微服务的方式,例如使用Spring Boot Actuator监控微服务示例,使用Hystrix监控Hystrix Command等。

为什么要实现微服务追踪

Peter Deutsch的分布式计算的八大误区。

  • 网络可靠
  • 延迟为零
  • 带宽无限
  • 网络绝对安全
  • 网络拓扑不会改变
  • 必须有一名管理员
  • 传输成本为零
  • 网络同质化
    从中可以看到,该文章很多点都在描述一个问题——网络问题。网络常常很脆弱,同时网络资源也是有限的。
    我们知道,微服务之间通过网络进行通信。如果能够跟踪每个请求,了解请求经过哪些微服务、请求耗费时间、网络延迟、业务逻辑耗费时间等指标,那么就能更好地分析系统瓶颈、解决系统问题。因此,微服务跟踪很有必要。

Spring Cloud Sleuth简介

Spring Cloud Sleuth为Spring Cloud提供了分布式跟踪的解决方式,它大量借用了Google Dapper、Twitter Zipkin和Apache HTrace的设计。
先来了解一下Sleuth的术语,Sleuth借用了Dapper的术语。

  • span(跨度):基本工作单位。span用一个64位的ID唯一标识。除ID外、span还包含其他数据,例如描述、时间戳事件、键值对的注解(标签),spanID、span父ID等。
    span被启动和停止时,记录了时间信息。初始化span被称为"root span",该span的ID和trace的ID相等。
  • trace(跟踪):一组共享"root span"的span组成的树状结构称为trace。trace也用一个64位的ID唯一标识,trace中的所有span都共享该trace的ID。
  • annotation(标注):annotation用来记录事件的存在,其中,核心annotation用来定义请求的开始和结束。
    1)CS(Client Sent客户端发送):客户端发起一个请求,该annotation描述了span的开始。
    2)SR(Server Received服务器端接收):服务器端获得请求并准备处理它。如果用SR减去CS时间戳,就能得到网络延迟。
    3)SS(Server Sent服务器端发送):该annotation表明完成请求处理(当响应发回客户端时)。如果用SS减去SR时间戳,就能得到服务器端处理请求所需的时间。
    4)CR(Client Received客户端接收):span结束的标识。客户端成功接收到服务器端的响应。如果CR减去CS时间戳,就能得到从客户端发送请求到服务器响应的所需的时间。

整合Spring Cloud Sleuth

1)复制项目microservice-simple-provider-user,将ArtifactId修改为microservice-simple-provider-user-trace。
2)为项目添加依赖

		<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-sleuth</artifactId></dependency>

3)修改application.yml,添加以下内容

spring:application:name: microservice-provider-user
logging:              level:root: INFOorg.springframework.web.servlet.DispatcherServlet: DEBUG

这样就整合好Sleuth了。同理,也可为项目microservice-simple-consumer-movie整合Sleuth,记为microservice-simple-consumer-movie-trace。
4)同理,也可为项目microservice-simple-consumer-movie整合Sleuth,记为microservice-simple-consumer-movie-trace。
测试
1)启动项目microservice-simple-provider-user-trace。
2)访问http://localhost:8000/1
在这里插入图片描述
其中,ceb98e825708846f是traceID,ceb98e825708846f等是spanID。
仔细分析日志,不难看出请求的具体过程,也可将日志如下设置

logging:level:org.springframework.cloud.sleuth: DEBUG

在这里插入图片描述
3)启动项目microserver-simple-consumer-movie-trace。
4)访问http://localhost:8010/user/1会发现两个项目都会打印类似以上的日志。
在这里插入图片描述
在这里插入图片描述

Spring Cloud Sleuth与Zipkin配合使用

Zipkin简介

Zipkin是Twitter开源的分布式跟踪系统,基于Dapper的论文设计而来。它的主要功能是收集系统的时序数据,从而追踪微服务架构的系统延时等问题。Zipkin还提供了一个非常友好的界面,来帮助分析追踪数据。

编写Zipkin Server

1)创建一个ArtifactId是microservice-trace-zipkin-server的Maven工程,并为先买个添加以下依赖

        <dependency><groupId>io.zipkin.java</groupId><artifactId>zipkin-autoconfigure-ui</artifactId></dependency><dependency><groupId>io.zipkin.java</groupId><artifactId>zipkin-server</artifactId></dependency>

2)编写启动类,使用EnableZipkinServer注解,声明一个Zipkin Server。

package com.example;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import zipkin.server.EnableZipkinServer;@SpringBootApplication
@EnableZipkinServer
public class ZipkinServerApplication {public static void main(String[] args){SpringApplication.run(ZipkinServerApplication.class,args);}
}

3)编写配置文件,在application.yml中添加

server:port: 9411

测试
1)启动项目microservice-trace-zipkin-server
2)访问http://localhost:9411/
在这里插入图片描述

  • Service Name表示服务名称,也就是各个微服务spring.application.name的值。
  • 第二列表示span的名称,all表示所有span,也可选择指定span
  • Start time、End time,分别用于指定起始时间和截止时间。
  • Duration表示持续时间,即span从创建到关闭所经历的时间
  • Limit表示查询几条数据。类似MySQL数据库中的limit关键词。
  • Annotation Query,用于自定义查询条件。

微服务整合Zipkin

1)复制项目microservice-simple-provider-user-trace,将ArtifactId修改为microservice-simple-provider-user-trace-zipkin。
2)为项目添加以下依赖

		<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-sleuth-zipkin</artifactId></dependency>

3)在配置文件application.yml中添加如下内容

spring:zipkin:base-url: http://localhost:9411sleuth:sampler:percentage: 1.0

其中:

  • spring.zipkin.base-url:指定Zipkin的地址。
  • spring.sleuth.sampler.percentage:指定需采样的请求的百分比,默认值是0.1,即10%。这是因为在分布式系统中,数据量可能会非常大,因此采样非常重要。
    这样就为项目整合了Zipkin。同理,为项目microservice-simple-consumer-movie-trace整合Zipkin,记为microservice-simple-consumer-movie-trace-zipkin。
    测试
    1)启动项目microservice-trace-zipkin-server。
    2)启动项目microservice-simple-provider-user-trace-zipkin
    3)启动项目microservice-simple-consumer-movie-trace-zipkin
    4)访问http://localhost:8010/user/1
    在这里插入图片描述

5)访问Zipkin Server首页http://localhost:9411/,填入起始时间、结束时间等筛选条件后,单击Find a trace按钮,可看到trace列表。
在这里插入图片描述
6)单击该trace
在这里插入图片描述
7)单击span,即可获得span的详情信息。
在这里插入图片描述
8)Zipkin还有助于分析微服务间的依赖关系。单击导航栏上的Dependencies按钮。
在这里插入图片描述
注:Sleuth支持多种采样器,例如AlwaysSampler、NeverSampler、PercentageBasedSampler等。

@Bean
public Sample defaultSampler(){return new AlwaysSampler();
}

Sleuth默认采样百分比是10%,Sleuth会忽略大量span所导致的。因此,建议在开发、测试时,将属性spring.sleuth.sampler.percentage设大一点,例如1.0(100%)。

Zipkin与Eureka配合使用

改造Zipkin Server

对于Zipkin Server,只需将其注册到Eureka Server上即可。如何将服务注册到Eureka Server,这里略。
为Zipkin Server设置的服务名称为zipkin-server。

server:port: 9411
spring:application:name: zipkin-server
eureka:client:service-url:defaultZone: http://localhost:8761/eureka/instance:prefer-ip-address: true
改造微服务

1)复制项目microservice-provider-user,将ArtifactId修改为microservice-provider-user-zipkin。
2)为项目添加以下依赖,从而整合Sleuth以及Zipkin

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

3)在配置文件application.yml中添加如下内容

spring:zipkin:base-url: http://zipkin-serversleuth:sampler:percentage: 1.0
eureka:client:service-url:defaultZone: http://localhost:8761/eureka/instance:prefer-ip-address: true

测试
1)启动microservice-discovery-eureka
2)启动microservice-trace-zipkin-server-eureka
3)启动microservice-provider-user-zipkin
4)访问localhost:9411
在这里插入图片描述

使用消息中间件收集数据

前文是使用HTTP直接收集跟踪数据的,这里使用消息中间件收集追踪数据。

  • 微服务与Zipkin Server解耦,微服务无须知道Zipkin Server的网络地址
  • 在一些场景下,Zipkin Server与微服务网络可能不通,使用HTTP直接收集的方式无法工作,此时可借助消息中间件实现数据收集。
    这里使用RabbitMQ作为消息中间件进行演示。
    注:Spring Cloud Edgware之前的版本使用的是Zipkin 1.x,想要用MQ方式收集数据,需整合spring-cloud-sleuth-stream。而Edgware及更高版本使用Zipkin2.x,本身以支持基于MQ的数据收集方式,故而spring-cloud-sleuth-stream将被废弃。两种使用方式不兼容。
    这里基于Edgware,故而讲解的是基于Zipkin2.x自身提供的、基于MQ的数据收集功能。
改造Zipkin Server

1)复制项目microservice-trace-zipkin-server,将ArtifactId修改为microservice-trace-zipkin-server-stream。
2)将pom.xml的依赖修改为

    <dependencies><dependency><groupId>io.zipkin.java</groupId><artifactId>zipkin-autoconfigure-ui</artifactId></dependency><dependency><groupId>io.zipkin.java</groupId><artifactId>zipkin-server</artifactId></dependency><dependency><groupId>io.zipkin.java</groupId><artifactId>zipkin-autoconfigure-collector-rabbitmq</artifactId><version>2.3.1</version></dependency>

3)将配置文件application.yml修改为

server:port: 9411
zipkin:collector:rabbitmq:addresses: localhost:5672password: guestusername: guestqueue: zipkin

这样,Zipkin Server就改造完成了。

改造微服务

1)复制项目microservice-simple-provider-user-trace-zipkin,将ArtifactId修改为microservice-simple-provider-user-trace-zipkin-stream。
2)修改pom.xml,删除Sleuth及Zipkin相关依赖,并添加以下依赖

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

3)修改配置文件application.yml,删除其中的

spring:zipkin:base-url: http://localhost:9411

添加内容

spring:rabbitmq:host: localhostport: 5672username: guestpassword: guestzipkin:rabbitmq:queue: zipkin

同理改造电影微服务。
测试
同之前测试
在这里插入图片描述

使用Elasticsearch存储跟踪数据

在前文的示例中,Zipkin Server是将数据存储在内存中的。这种方式一般不适用于生产环境,因为一旦Zipkin Server重启或发生崩溃,就会导致历史数据的丢失。
Zipkin Server支持多种后端存储,例如MySQL、Elasticsearch、Cassndra等。
用项目microservice-trace-zipkin-server-stream进行改造,让其使用RabbitMQ收集跟踪数据并使用Elasticsearch6.1.1作为后端存储。
1)复制项目microservice-trace-zipkin-server-stream,将ArtifactId修改为microservice-trace-zipkin-server-stream-elasticsearch。
2)为项目添加依赖

        <dependency><groupId>io.zipkin.java</groupId><artifactId>zipkin-autoconfigure-storage-elasticsearch-http</artifactId><version>2.3.1</version></dependency>

3)修改配置文件application.yml

zipkin:storage:type: elasticsearchelasticsearch:cluster: elasticsearchhosts: http://localhost:9200index: zipkinindex-shards: 5index-replicas: 1

测试
1)启动Elasticsearch
2)启动项目microservice-trace-zipkin-server-stream-elasticsearch
3)启动项目microservice-simple-provider-user-trace-zipkin-stream。
4)启动项目microservice-simple-consumer-movie-trace-zipkin-stream
5)按照前文讲解的方式测试,可获得预期结果。
6)访问Zipkin首页,可正常显示跟踪数据。
7)访问http://localhost:9200/_search。
8)重启Zipkin Server,在Zipkin Server首页输入条件查询,仍可查询到历史数据,说明可以正常从Elasticsearch中读取数据。

这篇关于使用Spring Cloud Sleuth实现微服务跟踪的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/467183

相关文章

JVM 的类初始化机制

前言 当你在 Java 程序中new对象时,有没有考虑过 JVM 是如何把静态的字节码(byte code)转化为运行时对象的呢,这个问题看似简单,但清楚的同学相信也不会太多,这篇文章首先介绍 JVM 类初始化的机制,然后给出几个易出错的实例来分析,帮助大家更好理解这个知识点。 JVM 将字节码转化为运行时对象分为三个阶段,分别是:loading 、Linking、initialization

Spring Security 基于表达式的权限控制

前言 spring security 3.0已经可以使用spring el表达式来控制授权,允许在表达式中使用复杂的布尔逻辑来控制访问的权限。 常见的表达式 Spring Security可用表达式对象的基类是SecurityExpressionRoot。 表达式描述hasRole([role])用户拥有制定的角色时返回true (Spring security默认会带有ROLE_前缀),去

浅析Spring Security认证过程

类图 为了方便理解Spring Security认证流程,特意画了如下的类图,包含相关的核心认证类 概述 核心验证器 AuthenticationManager 该对象提供了认证方法的入口,接收一个Authentiaton对象作为参数; public interface AuthenticationManager {Authentication authenticate(Authenti

Spring Security--Architecture Overview

1 核心组件 这一节主要介绍一些在Spring Security中常见且核心的Java类,它们之间的依赖,构建起了整个框架。想要理解整个架构,最起码得对这些类眼熟。 1.1 SecurityContextHolder SecurityContextHolder用于存储安全上下文(security context)的信息。当前操作的用户是谁,该用户是否已经被认证,他拥有哪些角色权限…这些都被保

Spring Security基于数据库验证流程详解

Spring Security 校验流程图 相关解释说明(认真看哦) AbstractAuthenticationProcessingFilter 抽象类 /*** 调用 #requiresAuthentication(HttpServletRequest, HttpServletResponse) 决定是否需要进行验证操作。* 如果需要验证,则会调用 #attemptAuthentica

Spring Security 从入门到进阶系列教程

Spring Security 入门系列 《保护 Web 应用的安全》 《Spring-Security-入门(一):登录与退出》 《Spring-Security-入门(二):基于数据库验证》 《Spring-Security-入门(三):密码加密》 《Spring-Security-入门(四):自定义-Filter》 《Spring-Security-入门(五):在 Sprin

Java架构师知识体认识

源码分析 常用设计模式 Proxy代理模式Factory工厂模式Singleton单例模式Delegate委派模式Strategy策略模式Prototype原型模式Template模板模式 Spring5 beans 接口实例化代理Bean操作 Context Ioc容器设计原理及高级特性Aop设计原理Factorybean与Beanfactory Transaction 声明式事物

中文分词jieba库的使用与实景应用(一)

知识星球:https://articles.zsxq.com/id_fxvgc803qmr2.html 目录 一.定义: 精确模式(默认模式): 全模式: 搜索引擎模式: paddle 模式(基于深度学习的分词模式): 二 自定义词典 三.文本解析   调整词出现的频率 四. 关键词提取 A. 基于TF-IDF算法的关键词提取 B. 基于TextRank算法的关键词提取

使用SecondaryNameNode恢复NameNode的数据

1)需求: NameNode进程挂了并且存储的数据也丢失了,如何恢复NameNode 此种方式恢复的数据可能存在小部分数据的丢失。 2)故障模拟 (1)kill -9 NameNode进程 [lytfly@hadoop102 current]$ kill -9 19886 (2)删除NameNode存储的数据(/opt/module/hadoop-3.1.4/data/tmp/dfs/na

Hadoop数据压缩使用介绍

一、压缩原则 (1)运算密集型的Job,少用压缩 (2)IO密集型的Job,多用压缩 二、压缩算法比较 三、压缩位置选择 四、压缩参数配置 1)为了支持多种压缩/解压缩算法,Hadoop引入了编码/解码器 2)要在Hadoop中启用压缩,可以配置如下参数