Spring Boot组成的分布式系统中实现日志跟踪
Spring Boot组成的分布式系统中实现日志跟踪
首发2024-07-25 08:54·潘多编程
在分布式系统中,日志跟踪是一项非常重要的功能,它帮助开发者了解请求在整个系统中的流转过程,这对于调试、监控和故障排查至关重要。Spring Boot应用通常作为微服务架构的一部分,因此需要一种机制来确保日志的一致性和可追踪性。本文将介绍如何在基于Spring Boot的分布式系统中实现日志跟踪。
1. 引言
在分布式系统中,一个请求可能会经过多个服务节点。为了更好地理解请求的完整流程,我们需要能够追踪请求在各个服务间的传播路径。日志跟踪可以帮助我们做到这一点,它通常涉及到为每个请求分配一个唯一的标识符(通常是trace ID),并在日志中记录该标识符,以便后续分析。
2. 日志跟踪原理
在分布式系统中,日志跟踪主要包括以下几个概念:
- Trace ID:唯一标识一次完整的请求流程。
- Span ID:标识一次请求中的单个服务调用。
- Parent ID:标识一个Span的父Span,用于表示服务调用的层级关系。
3. 实现方案
3.1 使用Spring Cloud Sleuth
Spring Cloud Sleuth 是一个常用的日志跟踪库,它可以轻松地集成到Spring Boot应用中,以实现日志跟踪。
添加依赖
在pom.xml中添加Sleuth依赖:
Xml
深色版本
1<dependency>
2 <groupId>org.springframework.cloud</groupId>
3 <artifactId>spring-cloud-starter-sleuth</artifactId>
4</dependency>
配置Sleuth
默认情况下,Sleuth会自动启用日志跟踪。可以通过配置文件进一步定制:
Yaml
深色版本
1spring:
2 cloud:
3 sleuth:
4 web:
5 client:
6 enabled: true # 启用客户端跟踪
7 exporter:
8 logging:
9 enabled: true # 启用日志输出
3.2 集成Zipkin
Zipkin 是一个流行的分布式追踪系统,可以与Sleuth一起使用,提供更强大的追踪数据可视化。
添加Zipkin依赖
在pom.xml中添加Zipkin依赖:
Xml
深色版本
1<dependency>
2 <groupId>org.springframework.cloud</groupId>
3 <artifactId>spring-cloud-starter-zipkin</artifactId>
4</dependency>
配置Zipkin
配置Zipkin服务器的地址:
Yaml
深色版本
1spring:
2 cloud:
3 sleuth:
4 web:
5 client:
6 enabled: true
7 exporter:
8 zipkin:
9 enabled: true
10 zipkin:
11 base-url: http://zipkin-server:9411
部署Zipkin Server
Zipkin Server可以使用Docker容器轻松部署:
Sh
深色版本
1docker run -d --name zipkin-server -p 9411:9411 openzipkin/zipkin
4. 自定义日志输出
除了使用Sleuth和Zipkin之外,我们还可以自定义日志输出格式,以便更容易地识别请求的追踪信息。
使用MDC (Mapped Diagnostic Context)
MDC 是Logback或Log4j提供的一个功能,用于在日志中记录额外的信息。我们可以通过@Slf4j注解和MDC.put方法来设置MDC变量。
Java
深色版本
1import org.slf4j.MDC;
2
3@Service
4public class MyService {
5
6 private static final Logger logger = LoggerFactory.getLogger(MyService.class);
7
8 public void processRequest(String traceId) {
9 MDC.put("traceId", traceId);
10 logger.info("Processing request");
11 // ...
12 MDC.remove("traceId"); // 移除MDC变量
13 }
14}
自定义日志模式
在logback.xml或log4j.properties中定义日志模式,以包含MDC中的traceId:
Xml
深色版本
1<!-- logback.xml -->
2<configuration>
3 <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
4 <encoder>
5 <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %X{traceId} - %msg%n</pattern>
6 </encoder>
7 </appender>
8 <root level="info">
9 <appender-ref ref="STDOUT" />
10 </root>
11</configuration>
5. 示例
假设我们有两个Spring Boot应用:service-a和service-b,其中service-a调用service-b。
service-a
Java
深色版本
1@RestController
2public class ServiceAController {
3
4 private final ServiceBClient serviceBClient;
5
6 public ServiceAController(ServiceBClient serviceBClient) {
7 this.serviceBClient = serviceBClient;
8 }
9
10 @GetMapping("/invoke-service-b")
11 public String invokeServiceB(@RequestHeader("traceId") String traceId) {
12 MDC.put("traceId", traceId);
13 String response = serviceBClient.invoke();
14 MDC.remove("traceId");
15 return response;
16 }
17}
service-b
Java
深色版本
1@RestController
2public class ServiceBController {
3
4 @GetMapping("/invoke")
5 public String invoke(@RequestHeader("traceId") String traceId) {
6 MDC.put("traceId", traceId);
7 logger.info("Received request in service-b");
8 MDC.remove("traceId");
9 return "Response from service-b";
10 }
11}
6. 总结
通过使用Spring Cloud Sleuth和Zipkin,我们可以轻松地为Spring Boot应用实现日志跟踪。这种方式不仅简化了日志跟踪的实现,还提供了强大的可视化工具,帮助我们更好地理解和调试分布式系统。此外,通过自定义日志输出格式和使用MDC,我们可以进一步定制日志以适应特定的需求。
通过上述步骤,你可以在基于Spring Boot的分布式系统中实现有效的日志跟踪功能,从而提高系统的可维护性和可观察性。
相关文章:
Spring Boot组成的分布式系统中实现日志跟踪
Spring Boot组成的分布式系统中实现日志跟踪 首发2024-07-25 08:54潘多编程 在分布式系统中,日志跟踪是一项非常重要的功能,它帮助开发者了解请求在整个系统中的流转过程,这对于调试、监控和故障排查至关重要。Spring Boot应用通常作为微服…...
GPT-4o Mini 模型的性能与成本优势全解析
GPT-4o Mini 模型的性能与成本优势全解析 📈 🌟 GPT-4o Mini 模型的性能与成本优势全解析 📈摘要引言正文内容GPT-4o Mini 模型简介 🚀性能测试与对比 📊应用场景 🌐自然语言处理对话系统内容生成 ✍️ &am…...
web前端 - HTML 基础知识大揭秘
HTML 大揭秘 什么是 HTML HTML(Hyper Text Markup Language),中文译为超文本标记语言。其中,我们需要注意两个关键词。一个是 超文本,一个是 标记。所谓超文本,就是将不同空间的文字信息通过超链接的方式…...
HTML meta
<meta>标签用于提供html文档的元信息(metadata)。这些信息不会显示在页面上,但会被浏览器或搜索引擎用来识别页面的编码方式、关键字、描述、作者信息、刷新时间等。 基本语法 <meta name"属性名" content"属性值&q…...
【学习笔记】子集DP
背景 有一类问题和子集有关。 给你一个集合 S S S,令 T T T 为 S S S 的超集,也就是 S S S 所有子集的集合,求 T T T 中所有元素的和。 暴力1 先预处理子集的元素和 A i A_i Ai,再枚举子集。 for(int s0; s<(1<…...
苦学Opencv的第十四天:人脸检测和人脸识别
Python OpenCV入门到精通学习日记:人脸检测和人脸识别 前言 经过了十三天的不懈努力,我们终于也是来到了人脸检测和人脸识别啦!相信大家也很激动吧。接下来我们开始吧! 人脸识别是基于人的脸部特征信息进行身份识别的一种生物识…...
PyTorch学习(1)
PyTorch学习(1) CIFAR-10数据集-图像分类 数据集来源是官方提供的: torchvision.datasets.CIFAR10()共有十类物品,需要用CNN实现图像分类问题。 代码如下:(CIFAR_10_Classifier_Self_1.py) import torch import t…...
三思而后行:计算机行业的决策智慧
在计算机行业,"三思而后行"这一原则显得尤为重要。在这个快速发展、技术不断更新换代的领域,每一个决策都可能对项目的成功与否产生深远的影响。以下是一篇关于在计算机行业中三思重要性的文章。 三思而后行:计算机行业的决策智慧 …...
Linux--Socket编程UDP
前文:Socket套接字编程 UDP协议特点 无连接:UDP在发送数据之前不需要建立连接,减少了开销和发送数据之前的时延。尽最大努力交付:UDP不保证可靠交付,主机不需要维持复杂的连接状态表。面向报文:UDP对应用层…...
《javaEE篇》--单例模式详解
目录 单例模式 饿汉模式 懒汉模式 懒汉模式(优化) 指令重排序 总结 单例模式 单例模式属于一种设计模式,设计模式就好比是一种固定代码套路类似于棋谱,是由前人总结并且记录下来我们可以直接使用的代码设计思路。 单例模式就是,在有…...
Java核心 - Lambda表达式详解与应用示例
作者:逍遥Sean 简介:一个主修Java的Web网站\游戏服务器后端开发者 主页:https://blog.csdn.net/Ureliable 觉得博主文章不错的话,可以三连支持一下~ 如有疑问和建议,请私信或评论留言! 前言 Lambda表达式是…...
算法通关:006_1二分查找
二分查找 查找一个数组里面是否存在num主要代码运行结果 详细写法自动生成数组和num,利用对数器查看二分代码是否正确 查找一个数组里面是否存在num 主要代码 /*** Author: ggdpzhk* CreateTime: 2024-07-27*/ public class cg {//二分查找public static boolean …...
总结一些vue3小知识3
总结一些vue3小知识1:http://t.csdnimg.cn/C5vER 总结一些vue3小知识2:http://t.csdnimg.cn/sscid 1.限制时间选择器只能选择后面的日期 说明:disabled-date属性是一个用来判断该日期是否被禁用的函数,接受一个 Date 对象作为参…...
JAVAWeb实战(前端篇)
项目实战一 0.项目结构 1.创建vue3项目,并导入所需的依赖 npm install vue-router npm install axios npm install pinia npm install vue 2.定义路由,axios,pinia相关的对象 文件(.js) 2.1路由(.js) import {cre…...
axios请求大全
本文讲解axios封装方式以及针对各种后台接口的请求方式 axios的介绍和基础配置可以看这个文档: 起步 | Axios中文文档 | Axios中文网 axios的封装 axios封装的重点有三个,一是设置全局config,比如请求的基础路径,超时时间等,第二点是在每次…...
C# 简单的单元测试
文章目录 前言参考文档新建控制台项目新建测试项目添加引用添加测试方法测试结果(有错误)测试结果,通过正规的方法抛出异常 总结 前言 听说复杂的项目最好都要单元测试一下。我这里也试试单元测试这个功能。到时候调试起来也方便。 参考文档 C# 单元测试…...
Linux中Mysql5.7主从架构(一主多从)配置教程
🏡作者主页:点击! 🐧Linux基础知识(初学):点击! 🐧Linux高级管理防护和群集专栏:点击! 🔐Linux中firewalld防火墙:点击! ⏰️创作…...
BACnet物联网关BL103:Modbus协议转BACnet/MSTP
随着物联网技术在楼宇自动化与暖通控制系统中的迅猛发展,构建一种既经济高效又高度可靠的协议转换物联网关成为了不可或缺的核心硬件组件。在此背景下,我们钡铼特别推荐一款主流的BAS(楼宇自动化系统)与BACnet物联网关——BL103&a…...
Go 语言条件变量 Cond
1.Cond 的使用方法 Go 标准库提供 Cond 同步原语的目的是为等待/通知场景下的并发操作提供支持。Cond 通常用于等待某个条件的一组 goroutine,当条件变为 true 时,其中一个或者所有的 goroutine 会被唤醒执行。 Cond 与某个条件相关,这个条件需要一组 goroutine 协作达到。当这…...
PostgreSQL 中如何重置序列值:将自增 ID 设定为特定值开始
我是从excel中将数据导入,然后再通过sql插入数据,就报错。 需要设置自增ID开始值 1、确定序列名称: 首先,需要找到与的增字段相关的序列名称。假设表名是 my_table 和自增字段是 id,可以使用以下查询来获取序列名称…...
AI编码助手配置框架:六层缰绳架构实现团队规范与上下文持久化
1. 项目概述:为什么你的AI编码助手总像个“健忘的实习生”? 如果你和我一样,已经深度使用Claude Code、Cursor这类AI编码助手超过半年,那你一定经历过这种“血压升高”的时刻:明明昨天刚跟它详细解释过项目的架构规范…...
Android Studio中文界面:从英文困扰到母语开发的完整解决方案
Android Studio中文界面:从英文困扰到母语开发的完整解决方案 【免费下载链接】AndroidStudioChineseLanguagePack AndroidStudio中文插件(官方修改版本) 项目地址: https://gitcode.com/gh_mirrors/an/AndroidStudioChineseLanguagePack 你是否曾…...
深度探索JD-GUI:Java字节码逆向工程与代码解析实战剖析
深度探索JD-GUI:Java字节码逆向工程与代码解析实战剖析 【免费下载链接】jd-gui A standalone Java Decompiler GUI 项目地址: https://gitcode.com/gh_mirrors/jd/jd-gui 在Java开发与逆向工程领域,Java反编译、字节码分析、代码逆向已成为开发者…...
告别天书:用Python+NumPy手把手实现Turbo码的迭代译码(附完整代码)
告别天书:用PythonNumPy手把手实现Turbo码的迭代译码(附完整代码) 在通信系统的演进历程中,Turbo码的出现犹如一场静默的革命。1993年,当Berrou等人首次公开这项技术时,其接近香农极限的性能让整个学术界为…...
保姆级教程:手把手教你用Wireshark诊断Ubuntu apt update的‘NOSPLIT’网络认证问题
深度解析Ubuntu apt update的NOSPLIT错误:从网络抓包到安全协议的全链路诊断 当你在Ubuntu终端中满怀期待地输入apt update,却看到一串刺眼的"NOSPLIT"错误时,那种挫败感每个Linux用户都深有体会。这个看似简单的网络错误背后&…...
从DICOM到NIfTI:3D Slicer中医学图像坐标转换的完整避坑指南(附Python代码片段)
从DICOM到NIfTI:3D Slicer中医学图像坐标转换的完整避坑指南(附Python代码片段) 医学影像处理中,数据格式和坐标系的差异常常成为工程师和研究员们的"隐形杀手"。想象一下,你花了三天三夜训练的深度学习模型…...
手把手教你:在RT-Thread上用STM32驱动0.96寸OLED显示动态二维码(附完整源码)
基于RT-Thread的STM32动态二维码显示系统开发实战 在智能门锁、工业设备配网等物联网场景中,二维码作为信息载体正发挥着越来越重要的作用。本文将完整呈现如何在RT-Thread操作系统上,通过STM32驱动0.96寸OLED实现动态二维码显示功能。不同于简单的功能演…...
基于Python与yfinance构建本地化股票量化筛选器:以PKScreener为例
1. 项目概述与核心价值 最近在和一些做量化交易的朋友交流时,发现大家普遍面临一个痛点:虽然市面上有各种股票数据接口和量化平台,但真正能快速、灵活地根据自定义条件进行股票筛选,并且能本地化部署、深度定制的工具却不多。要么…...
自动化生产管理平台(Automatic)
1,自动化生产管理平台(Automatic) 1.1,重新定义Window样式 添加WindowChrome元素进行自定义定义 <Window x:Class"lzg.Automatic.MainWindow"xmlns"http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x"…...
实证论文不用愁!虎贲等考 AI 数据分析:零代码跑模型,图表 + 结论一键生成
在本科、硕士毕业论文写作中,数据分析往往是最让学生头疼的章节。不会数据清洗、不懂模型选择、跑不出稳健结果、图表不会做、文字不会写,即便前面内容写得再完整,第四章一塌糊涂,整篇论文直接被导师打回。 传统软件如 Stata、Py…...
