Spring Cloud Sleuth+Zipkin构建微服务链路跟踪

本文涉及的产品
注册配置 MSE Nacos/ZooKeeper,118元/月
云原生网关 MSE Higress,422元/月
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
简介: Spring Cloud Sleuth+Zipkin构建微服务链路跟踪

正文


一、产生背景


在微服务系统中,随着业务的发展,系统会变得越来越大,那么各个服务之间的调用关系也就变得越来越复杂。一个 HTTP 请求会调用多个不同的微服务来处理返回最后的结果,在这个调用过程中,可能会因为某个服务出现网络延迟或发送错误导致请求失败,这个时候,对请求调用的监控就显得尤为重要了。Spring Cloud Sleuth+zipkin 提供了分布式服务链路监控的解决方案。


二、Sleuth&zipkin介绍


Sleuth


1、基本术语


Span:基本工作单元,发送一个远程调度任务 就会产生一个Span,Span是一个64位ID唯一标识的,Trace是用另一个64位ID唯一标识的,Span还有其他数据信息,比如摘要、时间戳事件、Span的ID、以及进度ID。例如在微服务中我们的一个服务。

root span:开始一个 Trace 的初始Span,root span的ID的值等于trace ID。

Trace:一系列Span组成的一个树状结构。请求一个微服务系统的API接口,这个API接口,需要调用多个微服务,调用每个微服务都会产生一个新的Span,所有由这个请求产生的Span组成了这个Trace。可以理解为就是微服务中的一条请求链,如订单服务→支付服务→积分服务就是一个trace,其中的每个服务都可以是一个span。

Annotation:用来及时记录一个事件的,一些核心注解用来定义一个请求的开始和结束 。这些注解包括以下:

cs - Client Sent -客户端发送一个请求,这个注解描述了这个Span的开始。

sr - Server Received -服务端获得请求并准备开始处理它,如果将其sr减去cs时间戳便可得到网络传输的时间。

ss - Server Sent (服务端发送响应)–该注解表明请求处理的完成(当请求返回客户端),如果ss的时间戳减去sr时间戳,就可以得到服务器请求的时间。

cr - Client Received (客户端接收响应)-此时Span的结束,如果cr的时间戳减去cs时间戳便可以得到整个请求所消耗的时间。


2、微服务间传递跟踪信息


当一个请求被跟踪时,在传播中会添加spanid或者traceid到请求头header。比如spanId,traceId等,但是不会传输详细信息,比如操作名称,传输数据。


在请求头信息中多了 4 个属性:


x-b3-spanid:一个工作单元(rpc 调用)的唯一标识。

x-b3-parentspanid:当前工作单元的上一个工作单元,Root Span(请求链路的第一个工作单元)的值为空。

x-b3-traceid:一条请求链条(trace) 的唯一标识。

x-b3-sampled:是否被抽样被导出(采样)的标志,1 为需要被导出,0 为不需要被导出。


Zipkin


Zipkin是Twitter的一个开源项目,我们可以使用它来收集各个服务器上请求链路的跟踪数据,并通过它提供的API接口来辅助查询跟踪数据,或者通过UI组件可视化地展示服务调用链路中各个服务节点的是否异常和处理耗时。


111.png


Reporter: 应用程序中向zipkin发送跟踪数据的组件。

Transport: Reporter发送数据给zipkin收集器的传输方式,三种主要传输方式:HTTP、Kafka 和 Scribe

Storage:zipkin将跟踪数据保存至Storage中。

API 将查询存储以向UI提供数据。

zipkin的4个组件:


Collector(收集器组件):主要负责收集外部系统跟踪信息,跟踪数据到达Zipkin收集器守护进程后,将对其进行验证、存储和索引,以便Zipkin收集器进行查找。

Storage(存储组件):主要负责收到的跟踪信息的存储,默认为存储在内存中,同时支持存储到Mysql、Cassandra以及ElasticSearch。

API(Query): 负责查询Storage中存储的数据,提供简单的JSON API获取数据,这个API主要提供给web UI使用。

Web UI(展示组件):提供简单的web界面,方便进行跟踪信息的查看以及查询,同时进行相关的分析。


工作流程


111.png


更多内容请看官网OpenZipkin · A distributed tracing system 


三、安装


下载jar包然后启动


java -jar zipkin.jar


java -jar zipkin.jar

下载地址


链接:https://pan.baidu.com/s/1ohHc_7ybNy0V41MpBRcibw

提取码:r9tm


访问地址 your ip :9411


四、整合springboot


maven依赖


         <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-sleuth</artifactId>
            <version>3.0.5</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-sleuth-zipkin -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-sleuth-zipkin</artifactId>
            <version>3.0.5</version>
        </dependency>


application.yml配置


server:
  port: 8085
spring:
  application:
    name: xiaojie-sso
  cloud:
    nacos:
      server-addr: 127.0.0.1:8848
      discovery:
        enabled: true
  zipkin:
    base-url: http://127.0.0.1:9411  #一定要加前面的http
    sender:
      type: web #以http形式发送
    service:
      name: xiaojie-sso
  sleuth:
    sampler:
      probability: 1.0 #采集所有
      rate: 10 #每秒采集数量

完整demo参考spring-boot: Springboot整合redis、消息中间件等相关代码 中zipkin模块


五、简单使用


执行查询可以查看调用的服务,然后有路径,调用服务消耗时间,报错信息等


111.png


还有支持下载具体的json数据如下面这个样子。


[{
  "traceId": "2751e7f7bb8c2a11",
  "parentId": "2751e7f7bb8c2a11",
  "id": "c06891d9b13ebd18",
  "kind": "SERVER",
  "name": "get /send/{name}",
  "timestamp": 1651306249672816,
  "duration": 27835,
  "localEndpoint": {
    "serviceName": "xiaojie-message",
    "ipv4": "192.168.1.3"
  },
  "remoteEndpoint": {
    "ipv4": "192.168.1.3",
    "port": 55399
  },
  "tags": {
    "http.method": "GET",
    "http.path": "/send/admin",
    "mvc.controller.class": "MessageServiceImpl",
    "mvc.controller.method": "send"
  },
  "shared": true
}, {
  "traceId": "2751e7f7bb8c2a11",
  "parentId": "2751e7f7bb8c2a11",
  "id": "c06891d9b13ebd18",
  "kind": "CLIENT",
  "name": "get",
  "timestamp": 1651306249618939,
  "duration": 90664,
  "localEndpoint": {
    "serviceName": "xiaojie-sso",
    "ipv4": "192.168.1.3"
  },
  "tags": {
    "http.method": "GET",
    "http.path": "/send/admin"
  }
}, {
  "traceId": "2751e7f7bb8c2a11",
  "id": "2751e7f7bb8c2a11",
  "kind": "SERVER",
  "name": "get /login",
  "timestamp": 1651306249533616,
  "duration": 197531,
  "localEndpoint": {
    "serviceName": "xiaojie-sso",
    "ipv4": "192.168.1.3"
  },
  "remoteEndpoint": {
    "ipv4": "127.0.0.1",
    "port": 57738
  },
  "tags": {
    "http.method": "GET",
    "http.path": "/login",
    "mvc.controller.class": "LoginServiceImpl",
    "mvc.controller.method": "login"
  }
}]


参考 : SpringCloud-07-sleuth+zipkin_慕课手记

相关文章
|
20天前
|
运维 Kubernetes Docker
利用Docker和Kubernetes构建微服务架构
利用Docker和Kubernetes构建微服务架构
|
27天前
|
运维 持续交付 API
从零构建微服务架构:一次深度技术探索之旅####
【10月更文挑战第28天】 本文记录了作者在从零开始构建微服务架构过程中的深刻技术感悟,通过实战案例详细剖析了微服务设计、开发、部署及运维中的关键要点与挑战。文章首先概述了微服务架构的核心理念及其对企业IT架构转型的重要性,随后深入探讨了服务拆分策略、API网关选型、服务间通信协议选择、容器化部署(Docker+Kubernetes)、以及持续集成/持续部署(CI/CD)流程的设计与优化。最后,分享了在高并发场景下的性能调优经验与故障排查心得,旨在为读者提供一套可借鉴的微服务架构实施路径。 ####
57 3
|
5天前
|
弹性计算 持续交付 API
构建高效后端服务:微服务架构的深度解析与实践
在当今快速发展的软件行业中,构建高效、可扩展且易于维护的后端服务是每个技术团队的追求。本文将深入探讨微服务架构的核心概念、设计原则及其在实际项目中的应用,通过具体案例分析,展示如何利用微服务架构解决传统单体应用面临的挑战,提升系统的灵活性和响应速度。我们将从微服务的拆分策略、通信机制、服务发现、配置管理、以及持续集成/持续部署(CI/CD)等方面进行全面剖析,旨在为读者提供一套实用的微服务实施指南。
|
3天前
|
负载均衡 Java 开发者
深入探索Spring Cloud与Spring Boot:构建微服务架构的实践经验
深入探索Spring Cloud与Spring Boot:构建微服务架构的实践经验
29 5
|
12天前
|
监控 Java 微服务
从零构建微服务架构:一次深度技术探索之旅####
本文作为一篇深度技术分享,引领读者踏上自底向上搭建微服务架构的征途,旨在通过实战经验剖析,揭示微服务转型背后的技术挑战与解决方案。不同于常规摘要仅概述内容,本文摘要将直接以故事化手法,简述作者从单体应用困境出发,逐步迈向微服务化的心路历程,涵盖关键决策点、技术选型考量及实践收获,激发读者对微服务架构设计与实现的浓厚兴趣。 ####
|
5天前
|
监控 持续交付 API
深入理解微服务架构:构建高效、可扩展的系统
深入理解微服务架构:构建高效、可扩展的系统
24 0
|
2月前
|
监控 API 持续交付
构建高效后端服务:微服务架构的深度探索
【10月更文挑战第20天】 在数字化时代,后端服务的构建对于支撑复杂的业务逻辑和海量数据处理至关重要。本文深入探讨了微服务架构的核心理念、实施策略以及面临的挑战,旨在为开发者提供一套构建高效、可扩展后端服务的方法论。通过案例分析,揭示微服务如何帮助企业应对快速变化的业务需求,同时保持系统的稳定性和灵活性。
46 9
|
2月前
|
Kubernetes 负载均衡 Docker
构建高效微服务架构:Docker与Kubernetes的完美搭档
本文介绍了Docker和Kubernetes在构建高效微服务架构中的应用,涵盖基本概念、在微服务架构中的作用及其实现方法。通过具体实例,如用户服务、商品服务和订单服务,展示了如何利用Docker和Kubernetes实现服务的打包、部署、扩展及管理,确保微服务架构的稳定性和可靠性。
89 7
|
1月前
|
Kubernetes 负载均衡 Docker
构建高效微服务架构:Docker与Kubernetes的完美搭档
【10月更文挑战第22天】随着云计算和容器技术的快速发展,微服务架构逐渐成为现代企业级应用的首选架构。微服务架构将一个大型应用程序拆分为多个小型、独立的服务,每个服务负责完成一个特定的功能。这种架构具有灵活性、可扩展性和易于维护的特点。在构建微服务架构时,Docker和Kubernetes是两个不可或缺的工具,它们可以完美搭档,为微服务架构提供高效的支持。本文将从三个方面探讨Docker和Kubernetes在构建高效微服务架构中的应用:一是Docker和Kubernetes的基本概念;二是它们在微服务架构中的作用;三是通过实例讲解如何使用Docker和Kubernetes构建微服务架构。
61 6
|
2月前
|
Kubernetes 监控 数据中心
容器化与微服务:构建高效开发环境的双剑合璧
【10月更文挑战第20天】本文探讨了容器化技术(如Docker和Kubernetes)与微服务架构的结合,如何共同构建高效、灵活的开发环境。容器化解决了环境一致性、快速部署和资源隔离的问题,而微服务架构则提升了系统的可维护性和可扩展性。通过容器编排工具、CI/CD流程和服务网格,两者的结合进一步优化了开发和运维效率。文章还分享了实施这两项技术的最佳实践和职业心得。