首页 > 其他分享 >[微服务]Spring Cloud Sleuth全链路追踪

[微服务]Spring Cloud Sleuth全链路追踪

时间:2023-10-30 12:36:08浏览次数:32  
标签:Sleuth return zipkin spring Spring 链路 public Cloud 追踪


Spring Cloud Sleuth全链路追踪

全链路追踪组件追踪的数据遵循的规则:

1,Span:基本单元;

执行一次服务调用就生成一个span,用于记录当时的情况 ,以一个64位ID作为唯一标识.span还有其他数据标识如摘要,时间戳信息,关键tag等;

2,Trace:一次请求;

以一个64位ID为唯一标识,可以是一个业务号,通过该ID标识多个span为同一个业务请求,会以一个树状图的形式展示服务的调用;

3,Annotation:注解;

代表调用的客户端和服务端的行为,

Cs :客户端发起一个服务调用,即span的开始

Sr:服务端获取请求信息,并开始处理,sr-cs的时间得到一个时间戳即网络延迟时间;

Ss:服务端处理完请求,将结果返回客户端 ss-sr 的时间得到一个时间戳,即服务端处理请求的所用时间;

Cr:客户端成功接收到服务端的恢复,cr-cs得到的时间戳即客户端从服务端获取响应的时间;

日志部分:

[微服务]Spring Cloud Sleuth全链路追踪_spring

1,搭建链路追踪服务

spring-cloud-sleuth-learn: spring-cloud-sleuth全链路追踪 (gitee.com)

搭建之后重点看一下全链路追踪的zipkin部分:

[微服务]Spring Cloud Sleuth全链路追踪_spring cloud_02

选择服务名就可以查看服务的调用情况:

请求的链路耗时,以及经理了哪些服务的调用;

[微服务]Spring Cloud Sleuth全链路追踪_spring_03

2,自定义样本标记属性

如果我们要在网管中记录是否是Get请求,我们可以使用网关过滤器:

配置过滤器---zuul模块中继承ZuulFilter

@Slf4j

@Component

public class TraceFilter extends ZuulFilter {

    @Autowired

    private Tracer tracer;



    /**

     * 过滤器类型

     *

     * @return

     */

    @Override

    public String filterType() {

        return FilterConstants.PRE_TYPE;

    }



    /**

     * 过滤器顺序

     *

     * @return

     */

    @Override

    public int filterOrder() {

        return FilterConstants.PRE_DECORATION_FILTER_ORDER + 10;

    }



    @Override

    public boolean shouldFilter() {

        RequestContext currentContext = RequestContext.getCurrentContext();

        return "GET".equalsIgnoreCase(currentContext.getRequest().getMethod());

    }



    @Override

    public Object run() throws ZuulException {

        tracer.currentSpan().tag("1001", "GET请求");

        String traceId = tracer.currentSpan().context().traceIdString();

        String spanId = tracer.currentSpan().context().spanIdString();

        log.info("当前追踪参数: traceId={},spanId={}", traceId, spanId);

        return null;

    }

}



Zipkin中找到该请求

[微服务]Spring Cloud Sleuth全链路追踪_链路_04

上面的全链路追踪的数据保存在zipkin服务器中,服务器出现故障/重启数据就丢失了,因此我们可以考虑全链路数据的保存---持久化:

3,持久化全链路数据

Zipkin模块中引入相关依赖:

<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>

            <version>2.1.0.RELEASE</version>

        </dependency>

        <dependency>

            <groupId>org.springframework.cloud</groupId>

            <artifactId>spring-cloud-starter-zipkin</artifactId>

            <version>2.1.0.RELEASE</version>

        </dependency>



<!--        zipkin服务包-->

        <dependency>

            <groupId>io.zipkin.java</groupId>

            <artifactId>zipkin-server</artifactId>

            <version>2.12.3</version>

        </dependency>

<!--zipkinui 配置包-->

        <dependency>

            <groupId>io.zipkin.java</groupId>

            <artifactId>zipkin-autoconfigure-ui</artifactId>

            <version>2.12.3</version>

        </dependency>

<!--        该依赖中会自动下载数据库相关的表-->

        <dependency>

            <groupId>io.zipkin.java</groupId>

            <artifactId>zipkin-autoconfigure-storage-mysql</artifactId>

            <version>2.12.3</version>

        </dependency>

        <dependency>

            <groupId>mysql</groupId>

            <artifactId>mysql-connector-java</artifactId>

            <version>8.0.27</version>

        </dependency>

        <dependency>

            <groupId>org.springframework.boot</groupId>

            <artifactId>spring-boot-starter-jdbc</artifactId>

            <version>2.1.0.RELEASE</version>

        </dependency>

建立数据库表:

springcloudsleuth全链路追踪数据表资源

表的位置:

[微服务]Spring Cloud Sleuth全链路追踪_java_05

配置文件:

@Configuration

public class ZipKinMysqlConfig {

    @Bean

    public MySQLStorage mySQLStorage(DataSource datasource) {

        return MySQLStorage.newBuilder().datasource(datasource).executor(Runnable::run).build();

    }



}

配置文件:

spring:

  application:

    name: sleuth-zipkin

  datasource:

    url: jdbc:mysql://172.21.114.22:3306/seluth

    driver-class-name: com.mysql.cj.jdbc.Driver

    username: root

    password: ******

    tomcat:

      min-idle: 10

      max-active: 50

      max-idle: 20

#zipkin持久化配置

zipkin:

  storeage:

    type: mysql

eureka:

  client:

    serviceUrl:

     defaultZone: http://localhost:1001/eureka,http://localhost:1002/eureka

management:

  metrics:

    web:

      server:

#        取消自动定时,如果不设置,时间序列数量可能会比较长,导致异常

        auto-time-requests: false

server:

  port: 5001

写入数据库的操作并不是实时性的,而是异步操作;

标签:Sleuth,return,zipkin,spring,Spring,链路,public,Cloud,追踪
From: https://blog.51cto.com/u_15912968/8087441

相关文章

  • 浅析SpringBoot加载配置的6种方式
    从配置文件中获取属性应该是SpringBoot开发中最为常用的功能之一,但就是这么常用的功能,仍然有很多开发者抓狂~今天带大家简单回顾一下这六种的使用方式:说明Environment对象Environment是springboot核心的环境配置接口,它提供了简单的方法来访问应用程序属性,包括系统属......
  • spring-boot-starter-redis 熟练运用
    Redis的Java客户端很多,官方推荐的有三种:Jedis  (javaredis)RedissonLettuceSpring对Redis客户端进行了整合,提供了SpringDataRedis,在SpringBoot项目中还提供了对应的Starter,即spring-boot-starter-data-redis。Jedis(了解)项目准备Jedis是Redis的Java版本客户端,现......
  • Python Wordcloud报错:Only supported for TrueType fonts,多种解决方案
    PythonWordcloud报错:OnlysupportedforTrueTypefonts,多种解决方案。报错内容如下:2023-10-26T09:35:41.190459839ZTraceback(mostrecentcalllast):2023-10-26T09:35:41.190502589ZFile“lib/task/compute.py”,line621,in2023-10-26T09:35:41.190514101Zcompute_......
  • SpringBoot3特性——错误信息Problemdetails
    SpringFramework6实现了HTTPAPI规范RFC7807的问题详细信息。在本文中,我们将学习如何在SpringBoot3RESTAPI(使用SpringFramework6)中处理异常,并使用ProblemDetailsAPI提供错误响应。详见https://www.sivalabs.in/spring-boot-3-error-reporting-using-proble......
  • SpringCloud复习:(2)@LoadBalanced注解的工作原理
    @LoadBalanced注解标记了一个RestTemplate或WebClientbean使用LoadBalancerClient来进行负载均衡。LoadBalancerAutoConfiguration类给带注解的@RestTemplate添加了拦截器:LoadBalancerInterceptor.具体流程如下:首先定义一个LoadBalancerInterceptor然后定义了一个RestTemplateC......
  • SpringCloud复习:(3)LoadBalancerInterceptor
    使用Ribbon时,execute方法会由RibbonLoadBalancerClient类来实现它会调用重载的execute方法getLoadBalancer默认会返回ZoneAwareLoadBalancer(基类是BaseLoadBalancer).此处调用的getServer方法就会根据负载均衡策略选择适当的服务器来为下一步的http请求做准备。这个execute方法......
  • SpringCloud复习:(1)netflix包里的DiscoveryClient类
    DiscoveryClient类实现了EurekaClient接口它的主要作用:服务注册,服务续约,服务下线,获取服务列表。initScheduledTasks方法用来开启定时任务来完成上述功能。上图中的代码用来从服务器定期(默认30秒)拉取服务列表(ScheduledExecutorService的应用场景)其中TimedSupervisorTask这个Run......
  • 【Spring】AOP实现原理
    注册AOP代理创建器在平时开发过程中,如果想开启AOP,一般会使用@EnableAspectJAutoProxy注解,这样在启动时,它会向Spring容器注册一个代理创建器用于创建代理对象,AOP使用的是AnnotationAwareAspectJAutoProxyCreator,它实现了SmartInstantiationAwareBeanPostProcessor,从名字中可以看出......
  • springboot Filter @Resource 为空 、@Value 无法读取yml配置的问题
    问题1:在过滤器中使用@Resource为nullSpring中,web应用启动的顺序是:listener->filter->servlet,先初始化listener,然后再来就filter的初始化,再接着才到我们的dispathServlet的初始化,因此,当我们需要在filter里注入一个注解的bean时,就会注入失败,因为filter初始化时,注解的bean还没初......
  • 一款基于 Spring Boot 的公众号管理系统,已开源,别再自己写了!
    来源:https://gitee.com/niefy/wx-managewx-managewx-manage是一个支持公众号管理系统,支持多公众号接入。wx-manage提供公众号菜单、自动回复、公众号素材、简易CMS、等管理功能,请注意本项目仅为管理后台界面,需配合后端程序wx-api一起使用。项目简介wx-manage是一个微信公众号......