Sleuth(Micrometer) + ZipKin分布式链路追踪

❌Sleuth目前也进入维护模式

Sleuth官宣,改头换面

Sleuth未来替换方案:Micrometer Tracing

分布式链路追踪概述

为什么会出现这个技术?需要解决哪些问题?

 在微服务框架中,一个由客户端发起的请求在后端系统中会经过多个不同的的服务节点调用来协同产生最后的请求结果,每一个前段请求都会形成一条复杂的分布式服务调用链路,链路中的任何一环出现高延时或错误都会引起整个请求最后的失败。

随着问题的复杂化+微服务的增多+调用链条的变长,画面不要太美丽.....(ToT)/~~

在分布式与微服务场景下需要解决的问题

在大规模分布式与微服务集群下,如何实时观测系统的整体调用链路情况。

在大规模分布式与微服务集群下,如何快速发现并定位到问题。

在大规模分布式与微服务集群下,如何尽可能精确的判断故障对系统的影响范围与影响程度。

在大规模分布式与微服务集群下,如何尽可能精确的梳理出服务之间的依赖关系,并判断出服务之间的依赖关系是否合理。

在大规模分布式与微服务集群下,如何尽可能精确的分析整个系统调用链路的性能与瓶颈点。

在大规模分布式与微服务集群下,如何尽可能精确的分析系统的存储瓶颈与容量规划。

上述问题就是我们的落地议题答案:

分布式链路追踪技术要解决的问题,分布式链路追踪(Distributed Tracing),就是将一次分布式请求还原成调用链路,进行日志记录,性能监控并将一次分布式请求的调用情况集中展示。比如各个服务节点上的耗时、请求具体到达哪台机器上、每个服务节点的请求状态等等。

新—代Spring Cloud Sleuth: Micrometer

官网重要提示

新一代Sleuth:sleuth被micrometer替代

官网:https://spring.io/projects/spring-cloud-sleuth#overview

github:https://github.com/spring-cloud/spring-cloud-sleuth

说明:

老项目还能用Sleuth开发吗?可以

版本注意:

zipkin那?

Spring Cloud Sleuth(micrometer)提供了一套完整的分布式链路追踪(Distributed Tracing) 解决方案且兼容支持了zipkin展现。

Sleuth负责收集数据

zipkin负责展示数据

小总结

小总结将一次分布式请求还原成调用链路,进行日志记录和性能监控,并将一次分布式请求的调用情况集中web展示。

行业内比较成熟的其它分布式链路追踪技术解决方案

技术说明
CatCat由大众点评开源,基于Java开发的实时应用监控平台,包括实时应用监控,业务监控。集成方案是通过代码埋点的方式来实现监控,比如:拦截器,过滤器等。对代码的侵入性很大,集成成本较高。风险较大。
ZipKin由Twitter公司开源,开放源代码分布式的跟踪系统,用于收集服务的定时数据,以解决微服务架构中的延迟问题,包括:数据的收集、存储、查找和展现。结合spring-cloud-sleuth使用较为简单,集成方便,但是功能较简单。
PinpointPinpoint是一款开源的基于字节码注入的调用链分析,以及应用监控分析工具。特点是支持多种插件。UI功能强大,接入端无代码侵入。
SkywaIkingSkyWalking是国人开源的基于字节码注入的调用链分析,以及应用监控分析工具。特点是支持多种插件。UI功能较强,接入端无代码侵入。

分布式链路追踪原理

假定3个微服务调用的链路:Service1调用Service2,Service2调用Service3和Service4。

上一步完整的调用链路:

        那么一条链路追踪会在每个服务调用的时候加上Trace ID 和 Span ID

        链路通过TraceId唯一标识,

        Span标识发起的请求信息,各span通过parent id 关联起来 (Span:表示调用链路来源,通俗的理解span就是一次请求信息)。

彻底把链路追踪整明白:

        一条链路通过Trace Id唯一标识,Span标识发起的请求信息,各span通过parent id 关联起来

1

第一个节点:Span ID = A,Parent ID = null,Service 1 接收到请求。

2

第二个节点:Span ID = B,Parent ID= A,Service 1 发送请求到 Service 2 返回响应给Service 1 的过程。

3

第三个节点:Span ID = C,Parent ID= B,Service 2 的 中间解决过程。

4

第四个节点:Span ID = D,Parent ID= C,Service 2 发送请求到 Service 3 返回响应给Service 2 的过程。

5

第五个节点:Span ID = E,Parent ID= D,Service 3 的中间解决过程。

6

第六个节点:Span ID = F,Parent ID= C,Service 3 发送请求到 Service 4 返回响应给 Service 3 的过程。

7

第七个节点:Span ID = G,Parent ID= F,Service 4 的中间解决过程。

8

通过 Parent ID 就可找到父节点,整个链路即可以进行跟踪追溯了。

 Zipkin

官网:

https://zipkin.io/

是什么

Zipkin是一种分布式链路跟踪系统图形化的工具,Zipkin 是 Twitter 开源的分布式跟踪系统,能够收集微服务运行过程中的实时调用链路信息,并能够将这些调用链路信息展示到Web图形化界面上供开发人员分析,开发人员能够从ZipKin中分析出调用链路中的性能瓶颈,识别出存在问题的应用程序,进而定位问题和解决问题。

Zipkin为什么出现? 单有Sleuth(Micrometer)行不行?

说明:

        当没有配置 Sleuth 链路追踪的时候,INFO 信息里面是 [passjava-question,,,],后面跟着三个空字符串。

        当配置了 Sleuth 链路追踪的时候,追踪到的信息是 [passjava-question,504a5360ca906016,e55ff064b3941956,false] ,第一个是 Trace ID,第二个是 Span ID。只有日志没有图,观看不方便,不美观,so,引入图形化Zipkin链路监控让你好看,O(∩_∩)O

下载+安装+运行一套带走

下载主页

https://zipkin.io/pages/quickstart.html

支持3种安装方式:Java,Docke r或 从源代码运行。

下载地址

运行jar

java -jar zipkin-server-3.3.0-exec.jar

运行控制台

http://localhost:9411/zipkin/

Micrometer+ZipKin搭建链路监控案例步骤

Micrometer+ZipKin两者各自的分工:Micrometer:数据采样;ZipKin:图形展示。

总体父工程POM

引l入的jar包分别是什么意思:

        由于Micrometer Tracing是一个门面工具自身并没有实现完整的链路追踪系统,具体的链路追踪另外需要引入的是第三方链路追踪系统的依赖:

1
micrometer-tracing-bom
导入链路追踪版本中心,体系化说明
2
micrometer-tracing
指标追踪
3
micrometer-tracing-bridge-brave
一个Micrometer模块,用于与分布式跟踪工具 Brave 集成,以收集应用程序的分布式跟踪数据。Brave是一个开源的分布式跟踪工具,它可以帮助用户在分布式系统中跟踪请求的流转,它使用一种称为"跟踪上下文"的机制,将请求的跟踪信息存储在请求的头部,然后将请求传递给下一个服务。在整个请求链中,Brave会将每个服务处理请求的时间和其他信息存储到跟踪数据中,以便用户可以了解整个请求的路径和性能。
4
micrometer-observation
一个基于度量库 Micrometer的观测模块,用于收集应用程序的度量数据。
5
feign-micrometer
一个Feign HTTP客户端的Micrometer模块,用于收集客户端请求的度量数据。
6
zipkin-reporter-brave
一个用于将 Brave 跟踪数据报告到Zipkin 跟踪系统的库。

        补充包:spring-boot-starter-actuator   SpringBoot框架的一个模块用于监视和管理应用程序。

        <micrometer-tracing.version>1.2.0</micrometer-tracing.version>
        <micrometer-observation.version>1.12.0</micrometer-observation.version>
        <feign-micrometer.version>12.5</feign-micrometer.version>
        <zipkin-reporter-brave.version>2.17.0</zipkin-reporter-brave.version>
            <!--micrometer-tracing指标追踪  2-->
            <dependency>
                <groupId>io.micrometer</groupId>
                <artifactId>micrometer-tracing</artifactId>
                <version>${micrometer-tracing.version}</version>
            </dependency>
            <!--micrometer-tracing-bridge-brave适配zipkin的桥接包 3-->
            <dependency>
                <groupId>io.micrometer</groupId>
                <artifactId>micrometer-tracing-bridge-brave</artifactId>
                <version>${micrometer-tracing.version}</version>
            </dependency>
            <!--micrometer-observation 4-->
            <dependency>
                <groupId>io.micrometer</groupId>
                <artifactId>micrometer-observation</artifactId>
                <version>${micrometer-observation.version}</version>
            </dependency>
            <!--feign-micrometer 5-->
            <dependency>
                <groupId>io.github.openfeign</groupId>
                <artifactId>feign-micrometer</artifactId>
                <version>${feign-micrometer.version}</version>
            </dependency>
            <!--zipkin-reporter-brave 6-->
            <dependency>
                <groupId>io.zipkin.reporter2</groupId>
                <artifactId>zipkin-reporter-brave</artifactId>
                <version>${zipkin-reporter-brave.version}</version>
            </dependency>

服务提供者8001

cloud-provider-payment8001

POM

        <!--micrometer-tracing指标追踪  1-->
        <dependency>
            <groupId>io.micrometer</groupId>
            <artifactId>micrometer-tracing</artifactId>
        </dependency>
        <!--micrometer-tracing-bridge-brave适配zipkin的桥接包 2-->
        <dependency>
            <groupId>io.micrometer</groupId>
            <artifactId>micrometer-tracing-bridge-brave</artifactId>
        </dependency>
        <!--micrometer-observation 3-->
        <dependency>
            <groupId>io.micrometer</groupId>
            <artifactId>micrometer-observation</artifactId>
        </dependency>
        <!--feign-micrometer 4-->
        <dependency>
            <groupId>io.github.openfeign</groupId>
            <artifactId>feign-micrometer</artifactId>
        </dependency>
        <!--zipkin-reporter-brave 5-->
        <dependency>
            <groupId>io.zipkin.reporter2</groupId>
            <artifactId>zipkin-reporter-brave</artifactId>
        </dependency>

YML

# ========================zipkin===================
management:
  zipkin:
    tracing:
      endpoint: http://localhost:9411/api/v2/spans
  tracing:
    sampling:
      probability: 1.0 #采样率默认为0.1(0.1就是10次只能有一次被记录下来),值越大收集越及时。

新建业务类PayMicrometerController

import cn.hutool.core.util.IdUtil;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/payMicrometer")
public class PayMicrometerController {
    /**
     * Micrometer(Sleuth)进行链路监控的例子
     *
     * @param id
     * @return
     */
    @GetMapping(value = "/{id}")
    public String myMicrometer(@PathVariable("id") Integer id) {
        return "Hello, 欢迎到来myMicrometer inputId:  " + id + " \t    服务返回:" + IdUtil.simpleUUID();
    }
}

Api接口PayFeignApi

import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;

@FeignClient(value = "cloud-payment-service", contextId = "cloud-payment-service-payMicrome", path = "payMicrometer")
public interface PayMicrometerApi {
    /**
     * Micrometer(Sleuth)进行链路监控的例子
     *
     * @param id
     * @return
     */
    @GetMapping(value = "/{id}")
    public String myMicrometer(@PathVariable("id") Integer id);
}

服务调用者80

cloud-consumer-feign-order80

POM

    <!--micrometer-tracing指标追踪  1-->
    <dependency>
        <groupId>io.micrometer</groupId>
        <artifactId>micrometer-tracing</artifactId>
    </dependency>
    <!--micrometer-tracing-bridge-brave适配zipkin的桥接包 2-->
    <dependency>
        <groupId>io.micrometer</groupId>
        <artifactId>micrometer-tracing-bridge-brave</artifactId>
    </dependency>
    <!--micrometer-observation 3-->
    <dependency>
        <groupId>io.micrometer</groupId>
        <artifactId>micrometer-observation</artifactId>
    </dependency>
    <!--feign-micrometer 4-->
    <dependency>
        <groupId>io.github.openfeign</groupId>
        <artifactId>feign-micrometer</artifactId>
    </dependency>
    <!--zipkin-reporter-brave 5-->
    <dependency>
        <groupId>io.zipkin.reporter2</groupId>
        <artifactId>zipkin-reporter-brave</artifactId>
    </dependency>

YML

# ========================zipkin===================
management:
  zipkin:
    tracing:
      endpoint: http://localhost:9411/api/v2/spans
  tracing:
    sampling:
      probability: 1.0 #采样率默认为0.1(0.1就是10次只能有一次被记录下来),值越大收集越及时。

新建业务类OrderMicrometerController

import com.yq.springcloud.apis.PayMicrometerApi;
import jakarta.annotation.Resource;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/orderMicrometer")
public class OrderMicrometerController {
    @Resource
    private PayMicrometerApi payMicrometerApi;

    @GetMapping(value = "/{id}")
    public String myMicrometer(@PathVariable("id") Integer id) {
        return payMicrometerApi.myMicrometer(id);
    }
}

测试

本次案例,默认已经成功启动Consul,Zipkin

依次启动8001/80两个微服务并注册进入Consul。

测试地址:http://localhost/orderMicrometer/1

打开浏览器访问:http://localhost:9411/zipkin/

        会出现以下界:

        点击【SHOW】按钮查看:

        查看依赖关:

  • 15
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值