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

本文涉及的产品
任务调度 XXL-JOB 版免费试用,400 元额度,开发版规格
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
云原生网关 MSE Higress,422元/月
简介: 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_慕课手记

相关文章
|
2月前
|
Java 开发者 微服务
从单体到微服务:如何借助 Spring Cloud 实现架构转型
**Spring Cloud** 是一套基于 Spring 框架的**微服务架构解决方案**,它提供了一系列的工具和组件,帮助开发者快速构建分布式系统,尤其是微服务架构。
294 69
从单体到微服务:如何借助 Spring Cloud 实现架构转型
|
16天前
|
存储 NoSQL Java
使用Java和Spring Data构建数据访问层
本文介绍了如何使用 Java 和 Spring Data 构建数据访问层的完整过程。通过创建实体类、存储库接口、服务类和控制器类,实现了对数据库的基本操作。这种方法不仅简化了数据访问层的开发,还提高了代码的可维护性和可读性。通过合理使用 Spring Data 提供的功能,可以大幅提升开发效率。
60 21
|
1月前
|
搜索推荐 NoSQL Java
微服务架构设计与实践:用Spring Cloud实现抖音的推荐系统
本文基于Spring Cloud实现了一个简化的抖音推荐系统,涵盖用户行为管理、视频资源管理、个性化推荐和实时数据处理四大核心功能。通过Eureka进行服务注册与发现,使用Feign实现服务间调用,并借助Redis缓存用户画像,Kafka传递用户行为数据。文章详细介绍了项目搭建、服务创建及配置过程,包括用户服务、视频服务、推荐服务和数据处理服务的开发步骤。最后,通过业务测试验证了系统的功能,并引入Resilience4j实现服务降级,确保系统在部分服务故障时仍能正常运行。此示例旨在帮助读者理解微服务架构的设计思路与实践方法。
94 16
|
8天前
|
传感器 监控 安全
智慧工地云平台的技术架构解析:微服务+Spring Cloud如何支撑海量数据?
慧工地解决方案依托AI、物联网和BIM技术,实现对施工现场的全方位、立体化管理。通过规范施工、减少安全隐患、节省人力、降低运营成本,提升工地管理的安全性、效率和精益度。该方案适用于大型建筑、基础设施、房地产开发等场景,具备微服务架构、大数据与AI分析、物联网设备联网、多端协同等创新点,推动建筑行业向数字化、智能化转型。未来将融合5G、区块链等技术,助力智慧城市建设。
|
1月前
|
监控 JavaScript 数据可视化
建筑施工一体化信息管理平台源码,支持微服务架构,采用Java、Spring Cloud、Vue等技术开发。
智慧工地云平台是专为建筑施工领域打造的一体化信息管理平台,利用大数据、云计算、物联网等技术,实现施工区域各系统数据汇总与可视化管理。平台涵盖人员、设备、物料、环境等关键因素的实时监控与数据分析,提供远程指挥、决策支持等功能,提升工作效率,促进产业信息化发展。系统由PC端、APP移动端及项目、监管、数据屏三大平台组成,支持微服务架构,采用Java、Spring Cloud、Vue等技术开发。
|
2月前
|
Java 关系型数据库 Nacos
微服务SpringCloud链路追踪之Micrometer+Zipkin
SpringCloud+Openfeign远程调用,并用Mircrometer+Zipkin进行链路追踪
314 20
|
2月前
|
运维 监控 Java
为何内存不够用?微服务改造启动多个Spring Boot的陷阱与解决方案
本文记录并复盘了生产环境中Spring Boot应用内存占用过高的问题及解决过程。系统上线初期运行正常,但随着业务量上升,多个Spring Boot应用共占用了64G内存中的大部分,导致应用假死。通过jps和jmap工具排查发现,原因是运维人员未设置JVM参数,导致默认配置下每个应用占用近12G内存。最终通过调整JVM参数、优化堆内存大小等措施解决了问题。建议在生产环境中合理设置JVM参数,避免资源浪费和性能问题。
128 3
|
3月前
|
弹性计算 持续交付 API
构建高效后端服务:微服务架构的深度解析与实践
在当今快速发展的软件行业中,构建高效、可扩展且易于维护的后端服务是每个技术团队的追求。本文将深入探讨微服务架构的核心概念、设计原则及其在实际项目中的应用,通过具体案例分析,展示如何利用微服务架构解决传统单体应用面临的挑战,提升系统的灵活性和响应速度。我们将从微服务的拆分策略、通信机制、服务发现、配置管理、以及持续集成/持续部署(CI/CD)等方面进行全面剖析,旨在为读者提供一套实用的微服务实施指南。
|
2月前
|
负载均衡 Java 开发者
深入探索Spring Cloud与Spring Boot:构建微服务架构的实践经验
深入探索Spring Cloud与Spring Boot:构建微服务架构的实践经验
206 5
|
2月前
|
监控 安全 持续交付
构建高效微服务架构:策略与实践####
在数字化转型的浪潮中,微服务架构凭借其高度解耦、灵活扩展和易于维护的特点,成为现代企业应用开发的首选。本文深入探讨了构建高效微服务架构的关键策略与实战经验,从服务拆分的艺术到通信机制的选择,再到容器化部署与持续集成/持续部署(CI/CD)的实践,旨在为开发者提供一套全面的微服务设计与实现指南。通过具体案例分析,揭示如何避免常见陷阱,优化系统性能,确保系统的高可用性与可扩展性,助力企业在复杂多变的市场环境中保持竞争力。 ####
60 2