当前位置: 首页 > news >正文

Spring Cloud Sleuth 分布式链路追踪入门

您好,我是今夜写代码,今天学习下分布式链路组件Spring Cloud Sleuth

本文内容

  • 介绍了分布式链路的思想

  • Sleuth 和 Zipkin 简单集成Demo,并不涉及 Sleuth原理。

为什么要用链路追踪?

微服务架构下,一个复杂的电商应用,完成下单可能依赖商品、库存、结算、风控等一系列服务,并且依赖的服务又依赖一堆服务,其中任何一个环节出错都可能导致服务调用失败。 一旦服务调用失败,对于问题排查的成本是非常高的。

究竟哪个环节出错了?请求日志在哪一个服务节点上? 在没有调用链路追踪情况下,相信这绝对是一大难题。

早在2010年一篇由谷歌发表的 《Dapper, a Large-Scale Distributed Systems Tracing Infrastructure 》横空出世, 这篇论文详细介绍了谷歌的分布式系统追踪基础设施 Dapper, 当时这篇论文在国内应该是思想超前的,大学还在教JSP、Servlet。 如今链路追踪在大型分布式应用中,起到很重要的一席之地。

如何自己实现简单的链路追踪?

我们可以按照下面流程实现一个简单的链路追踪,当然不包含链路上报和检索功能。

以常见的 Dubbo 和 Spring MVC 请求举例,实现将请求Trace Id传递下去,并且满足如下特征

  • 对业务代码无入侵

  • 业务代码可以通过API方式操作Trace Id

图片

Dubbo

Dubbo attachment和过滤器等等不熟悉的同学可以查看之前文章Dubbo学习合集。

我们可以通过Dubbo的attachment 实现Trace Id 透传,实现对业务代码无入侵。 同时为了业务代码获取方便,我们将TraceId 放入ThreadLocal中,这样业务代码可以通过ThreadLocal获取,而不必依赖Dubbo 的 RpcContext 。

  String traceId  = RpcContext.getContext().getAttachment("traceId");if(traceId == null){traceId = UUID.randomUUID().toString().replace("-","");RpcContext.getContext().setAttachment("traceId",traceId);}TraceUtil.setTraceId(traceId);
/*** @ClassName TraceUtil* @Description* @Author codetonight 今夜写代码 https://blog.csdn.net/happycao123* @Date 2024/12/14 16:06*/
public class TraceUtil {private static final ThreadLocal<String> threadLocal = new ThreadLocal<>();public static String getTraceId(){return threadLocal.get();}public static void setTraceId(String traceId){threadLocal.set(traceId);}public static void remove(){threadLocal.remove();}}

Spring MVC

Spring MVC 有自己的拦截器,我们也可以直接使用 servlet-api 中Filter 。同样的,我们将Trace Id 放入 ThreadLocal ,这样后面业务就可以通过ThreadLocal 操作Trace Id。

/*** @ClassName TraceIdFilter* @Description* @Author codetonight 今夜写代码 https://blog.csdn.net/happycao123* @Date 2024/12/14 15:52*/
public class TraceIdFilter implements Filter {@Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {HttpServletRequest request = (HttpServletRequest) servletRequest;String traceId = request.getHeader("traceId");if(traceId == null) {traceId = UUID.randomUUID().toString().replace("-","");}TraceUtil.setTraceId(traceId);try{filterChain.doFilter(servletRequest,servletResponse);}finally {TraceUtil.remove();}}
}

上面实现比较粗糙,信息也不够全,还存在异步方法链路无法透传问题,当然更重要的缺乏链路查询的支持。

Spring Cloud Sleuth

Spring Cloud Sleuth 是一个分布式追踪的组件,我们无需再重复造轮子。

相关概念

  • Trace ID: 整个调用链全局唯一的Id,无论经过多少个服务,整个调用链中 TraceId都相同

  • Span ID: 标识一次具体的操作或服务调用,同样全局唯一。

  • Parent ID: 记录当前服务调用发起方的 Span Id。

一个复杂的微服务调用,可能出现服务的层层嵌套,通过Parent ID ,可以梳理整个调用链的上下游关系。

如图服务A 调用服务B ,服务B 又调用了服务C ,TraceId 对于整个调用链是不变的。 各种的服务都有自己的Span ID ,Parent ID记录了其直接调用方服务对应的Span ID 。

图片

Zipkin

Sleuth可以实现服务调用的链路透传, 如果需要实现链路检索功能,可以使用Zipkin,Zipkin核心功能日志收集和链路检索,Zipkin 具有可视化页面。

Zipkin 安装

如果您使用的是 Java 17或者更高版本,可以通过编译源码方式生成  zipkin-server-*exec.jar

java -jar ./zipkin-server/target/zipkin-server-*exec.jar
Docker 安装方式

docker 方式一个命令即可,启动成功输入 http://{ip}:9411/,即可进入Web 页面

docker run -d -p 9411:9411 openzipkin/zipkin

图片

Spring Cloud Sleuth 简单Demo

Server 作为SpringBoot 启动类,同时提供了/hello http 接口。

Client 作为SpringBoot 启动类,提供/callServer接口,其内部通过restTemplate调用 Server/hello接口。

/*** @ClassName Server* @Description* @Author codetonight 今夜写代码 https://blog.csdn.net/happycao123* @Date 2024/12/15 19:00*/
@EnableAutoConfiguration
@RestController
@Slf4j
public class Server {private  final Tracer tracer;public Server(Tracer tracer) {this.tracer = tracer;}@RequestMapping("/hello")public String hello() {log.info("Server hello is called ");
//        Span currentSpan = tracer.currentSpan();
//        if (currentSpan != null) {
//            currentSpan.tag("custom-tag", "value");
//            currentSpan.annotate("Custom Event");
//        }return new Date().toString();}public static void main(String[] args) {SpringApplication.run(Server.class,"--spring.application.name=server","--server.port=9000");}
}
/*** @ClassName Client* @Description* @Author codetonight 今夜写代码 https://blog.csdn.net/happycao123* @Date 2024/12/15 19:04*/
@EnableAutoConfiguration
@RestController
@Slf4j
public class Client {@AutowiredRestTemplate restTemplate;String backendBaseUrl = "http://localhost:9000";@RequestMapping("/callServer") public String callServer() {log.info("callServer {}",new Date());return restTemplate.getForObject(backendBaseUrl + "/hello", String.class);}@BeanRestTemplate restTemplate() {return new RestTemplate();}public static void main(String[] args) {SpringApplication.run(Client.class,"--spring.application.name=client","--server.port=8081");}
}
logging.level.org.springframework.web=DEBUG
spring.sleuth.traceId128=true
spring.sleuth.sampler.probability=1.0
# Adds trace and span IDs to logs (when a trace is in progress)
logging.pattern.level=[%X{traceId}/%X{spanId}] %-5p [%t] %C{2} - %m%nspring.application.name=sleuth-servicespring.zipkin.base-url=http://localhost:9411

效果图

zipkin 控制台可以看到相关日志,我们自己打印的日志并没有TraceId 相关信息

图片

图片

业务日志增加TraceId 信息

很自然想到的方式通过API方式获取Trace ID相关信息,但这种相对比繁琐,业务代码有一定入侵,其实我们可以配置logback-spring.xml 控制日志格式,配置后再看看效果,我们自己的业务日志也包含Trace ID 等信息了。

API 获取链路信息简单例子
        Span currentSpan = tracer.currentSpan();System.out.println(currentSpan.context().traceIdString());System.out.println(currentSpan.context().spanIdString());
logback-spring.xml
<configuration><appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"><encoder><pattern>%d{yyyy-MM-dd HH:mm:ss} %-5level [%thread] %logger{36} - traceId=%X{traceId:-}, spanId=%X{spanId:-} - %msg%n</pattern></encoder></appender><root level="info"><appender-ref ref="STDOUT" /></root>
</configuration>

图片

总结

本文主要介绍了分布式链路追踪主要思想,以及Spring Cloud Slueth + Zipkin集成实现分布式链路追踪,当然本文只是入门级教程,不涉及Slueth原理相关,文中给的例子仅仅只是Demo,实际项目中,启动类与Controller 类职责要严格区分,不能混在一起,更多Demo 可以查看官网。

相关文章:

Spring Cloud Sleuth 分布式链路追踪入门

您好&#xff0c;我是今夜写代码,今天学习下分布式链路组件Spring Cloud Sleuth。 本文内容 介绍了分布式链路的思想 Sleuth 和 Zipkin 简单集成Demo,并不涉及 Sleuth原理。 为什么要用链路追踪&#xff1f; 微服务架构下&#xff0c;一个复杂的电商应用&#xff0c;完成下…...

无人机航测系统技术特点!

一、无人机航测系统的设计逻辑 无人机航测系统的设计逻辑主要围绕实现高效、准确、安全的航空摄影测量展开。其设计目标是通过无人机搭载相机和传感器&#xff0c;利用先进的飞行控制系统和数据处理技术&#xff0c;实现对地表信息的全方位、高精度获取。 需求分析&#xff1…...

uniapp使用腾讯地图接口的时候提示此key每秒请求量已达到上限或者提示此key每日调用量已达到上限问题解决

要在创建的key上添加配额 点击配额之后进入分配页面&#xff0c;分配完之后刷新uniapp就可以调用成功了。...

【Prompt Engineering】3.文本概括

一、引言 文本信息量大&#xff0c;LLM在文本概括任务上展现出强大能力。本章介绍如何通过编程方式调用API接口实现文本概括功能。 首先&#xff0c;我们需要引入 zhipuAI 包&#xff0c;加载 API 密钥&#xff0c;定义 getCompletion 函数。 from zhipuai import ZhipuAIke…...

5G 模组 初始化状态检测

5G 模组 上电检测 5G 模组 上电检测 #终端上电后&#xff0c;待模组正常启动&#xff0c;再进入 控制台。 #vim /etc/profile##新增 until [ -c /dev/ttyUSB1 ] doecho -e "Wait module[5G] up ... "sleep 5 done ##新增The End....

常用的前端框架介绍

在前端开发中&#xff0c;有几个常用的框架技术&#xff0c;它们各自具有独特的特点和优势。 1. React&#xff1a; • 组件化开发&#xff1a;React 鼓励将 UI 拆分成可复用的组件&#xff0c;每个组件负责渲染 UI 的一部分。 • 虚拟 DOM&#xff1a;React 使用虚拟 DOM 来提…...

python飞机大战游戏.py

python飞机大战游戏.py import pygame import random# 游戏窗口大小 WINDOW_WIDTH 600 WINDOW_HEIGHT 800# 颜色定义 BLACK (0, 0, 0) WHITE (255, 255, 255)# 初始化Pygame pygame.init()# 创建游戏窗口 window pygame.display.set_mode((WINDOW_WIDTH, WINDOW_HEIGHT))…...

PPO: 一种通过近端策略优化提高模型性能的方法

PPO: 一种通过近端策略优化提高模型性能的方法 PPO&#xff08;Proximal Policy Optimization&#xff09;是一种强化学习中的策略优化算法&#xff0c;主要用于训练智能体以改善在环境中表现的能力。PPO通过以下几个关键点来提高模型性能&#xff1a; 近端优化&#xff1a;PP…...

Docker创建一个mongodb实例,并用springboot连接 mongodb进行读写文件

一、通过Docker 进行运行一个 mongodb实例 1、拉取镜像 docker pull mongo:5.0.5 2、创建 mongodb容器实例 docker run -d --name mongodb2 \-e MONGO_INITDB_ROOT_USERNAMEsalaryMongo \-e MONGO_INITDB_ROOT_PASSWORD123456 \-p 27017:27017 \mongo:5.0.5 3、进入容器&am…...

[IT项目管理]九.项目质量管理

九&#xff0e;项目质量管理 9.1项目质量管理的重要性 对于很多IT项目的差劲&#xff0c;大多数人只可以忍受。项目质量管理是IT项目管理的重要组成部分&#xff0c;对于提高项目成功率、降低项目成本、提升客户满意度至关重要。尽管很多人对IT项目的质量问题感到无奈&#x…...

Unity中的委托和事件(UnityAction、UnityEvent)

委托和事件 &#x1f392;什么是委托&#xff0c;委托的关键字是Delegate&#xff0c;委托是一种函数的容器&#xff0c;运行将函数做为变量来进行传递 通过Delegate关键字我们声明了一个无参无返回的委托&#xff0c;通过这个委托我们可以存储无参无返回的函数 public deleg…...

图像生成工具WebUI

介绍 Stable Diffusion WebUI&#xff08;AUTOMATIC1111&#xff0c;简称A1111&#xff09;是一个为高级用户设计的图形用户界面&#xff08;GUI&#xff09;&#xff0c;它提供了丰富的功能和灵活性&#xff0c;以满足复杂和高级的图像生成需求。如今各种人工智能满天飞&…...

Python面试常见问题及答案12

问题&#xff1a; 请解释Python中的GIL&#xff08;全局解释器锁&#xff09;是什么&#xff1f; ○ 答案&#xff1a; GIL是Python解释器中的一种机制&#xff0c;用于确保任何时候只有一个线程在执行Python字节码。这在多线程场景下可能影响性能优化&#xff0c;但对于单线程…...

javalock(六)CyclicBarrier

注意&#xff1a;CyclicBarrier不是AQS的派生类&#xff0c;而是CyclicBarrier内部使用了ReentrantLock.Condition 和CountDownLatch一样&#xff0c;都是计数减为0就可以成功获取锁 和CountDownLatch不同的是&#xff1a; 1&#xff1a;CountDownLatch的await和countdown操作…...

React 19有哪些新特性?

写在前面 2024.12.5&#xff0c;React 团队在 react.dev/blog 上发表了帖子 react.dev/blog/2024/1… React 19 正式进入了 stable 状态 React 团队介绍了一些新的特性和 Breaking Changes&#xff0c;并提供了升级指南&#xff0c; React 19: 新更新、新特性和新Hooks Reac…...

大数据治理:构建数据驱动的智慧教学体系

随着大数据技术在教育领域的逐渐渗透&#xff0c;大数据治理在教学中的应用日益广泛&#xff0c;它为提升教学质量、优化教学资源配置以及实现个性化教学提供了有力支持。 一、大数据治理在教学数据管理中的应用 在教学过程中&#xff0c;会产生海量的数据&#xff0c;如学生的…...

梳理你的思路(从OOP到架构设计)_浅尝架构师的滋味03

目录 1、分与合&#xff1a; 强龙与地头蛇的分工 分工 & 合作 分工的时间点 客人来之前做「分」&#xff0c;客人来之后做「合」 2、结语 肯德基餐厅 火锅店 汽车 从分工到外包模式 1、分与合&#xff1a; 强龙与地头蛇的分工 EIT造形用来表达架构师的先「分」与买…...

ChatGPT与领域特定语言的集成

用ChatGPT做软件测试 领域特定语言&#xff08;Domain-Specific Language&#xff0c;DSL&#xff09;是一种编程语言&#xff0c;专门设计用于满足特定领域或问题领域的需求。它是一种定制的语言&#xff0c;通常包括特定领域的专业术语以及相应的语法规则。DSL的设计旨在让领…...

sql server msdb数据库备份恢复

备份 BACKUP DATABASE [msdb] TO DISK ND:\liyuanshuai\test\sqlserver_bakfile\msdb20241219.bak WITH NOFORMAT, NOINIT, NAME Nlys-完整 数据库 备份, SKIP, NOREWIND, NOUNLOAD, COMPRESSION, STATS 10 GO然后删除2个测试的job&#xff0c;停止 SQL Server 代理…...

MyBatis(二)

一、MyBatis 和 JDBC 有什么区别&#xff1f; JDBC 是 Java 访问数据库的基础 API&#xff0c;它需要大量的样板代码。比如&#xff0c;使用 JDBC 进行查询时&#xff0c;需要加载驱动、建立连接、创建语句、执行查询、处理结果集和关闭资源等操作。代码比较繁琐且容易出错。M…...

Docker:Dockerfile(补充四)

这里写目录标题 1. Dockerfile常见指令1.1 DockerFile例子 2. 一些其他命令 1. Dockerfile常见指令 简单的dockerFile文件 FROM openjdk:17LABEL authorleifengyangCOPY app.jar /app.jarEXPOSE 8080ENTRYPOINT ["java","-jar","/app.jar"]# 使…...

Hexo博客生成标签和分类页

个人博客地址&#xff1a;Hexo博客生成标签和分类页 | 一张假钞的真实世界。 标签页 默认情况下&#xff0c;Hexo站点创建后&#xff0c;需手动生成标签页。如不生成&#xff0c;在点击“标签”菜单时会出现以下错误&#xff1a; Cannot GET /tags/ 执行以下命令创建标签页…...

Linux基础 -- 使用Linux Shell通过TCP发送消息

使用Linux Shell通过TCP发送消息 本文档介绍如何使用Linux Shell命令&#xff0c;通过TCP协议向服务器发送消息&#xff0c;示例中的目标服务器地址为 192.168.1.32&#xff0c;端口为 15000。 示例代码 使用 printf 和 netcat&#xff08;简称 nc&#xff09;工具实现&…...

联表查询相关语法

1.查询sql语句的执行顺序 sql:语法 select distinct * from 左表名 (left/inner/right)join 右表名 on 连接条件 where 筛选条件 group by 分组的列表(按什么字段分组) having 分组条件 order by 排序的字段 limit 分页 以上为语法结构&#xff0c;顺序不能乱执行顺序&#x…...

upload-labs(1-19关)通关攻略

Pass-01 本关思路&#xff1a;删除前端js校验 进入第一关环境 桌面新建一个php文件&#xff0c;命名为1.php <?php eval($_POST[a]);?> 我们上传此文件&#xff0c;发现不允许上传&#xff0c;且页面没有变化&#xff0c;说明前端进行了拦截 这时我们打开 F12 &…...

C语言小练习-求数组的最大子数组

#include <stdio.h>/***暴力求解最大子数组&#xff0c;使用两重循环&#xff0c;把所有情况全部遍历一遍。*/ int subArr1(int *arr,int size) {int sum 0, max arr[0];int i,j;for(i 0;i < size; i){for(j i; j < size; j){sum arr[j];if(sum > max){max…...

初识C语言之二维数组(中)

一.二维数组练习 ①题目描述:打印多个字符从两端移动&#xff0c;向中间汇聚。 eg. ################ H###############! He##############!! Hel#############!!! Hell############!!!! Hello##########t!!!! ................................................. He…...

Ubuntu下迁移Conda环境

Ubuntu下快速迁移Conda环境到其他电脑 安装conda-pack pip install conda-packOr conda install conda-pack压缩conda环境 解压到目标电脑或者目标文件下 conda pack -n your_envs_name -o your_envs_name.tar.gz解压conda环境 mkdir your_new_envs_name tar -zxvf your_e…...

数据可视化-1. 折线图

目录 1. 折线图适用场景分析 1. 1 时间序列数据展示 1.2 趋势分析 1.3 多变量比较 1.4 数据异常检测 1.5 简洁易读的数据可视化 1.6 特定领域的应用 2. 折线图局限性 3. 折线图代码实现 3.1 Python 源代码 3.2 折线图效果&#xff08;网页显示&#xff09; 1. 折线图…...

MATLAB绘图基础12:地理信息可视化

参考书&#xff1a;《 M A T L A B {\rm MATLAB} MATLAB与学术图表绘制》(关东升)。 12.地理信息可视化 12.1 地理散点图 地理散点图用于可视化地理坐标点分布的图形&#xff0c;适用于在地图上显示离散地理坐标点&#xff0c;每个点可以代表不同的实体、地点或其他类型的观测…...

C语言与C++

文件概念 在C语言中&#xff0c;文件是一个重要的概念&#xff0c;用于组织和存储数据。文件主要分为两类&#xff1a; 程序文件 &#xff1a;包含源代码、目标文件和可执行文件。 数据文件 &#xff1a;存储程序运行时读写的各类数据。 文件名通常由三部分组成&#xff1a;…...

C# 中的闭包

文章目录 前言一、闭包的基本概念二、匿名函数中的闭包1、定义和使用匿名函数2、匿名函数捕获外部变量3、闭包的生命周期 三、Lambda 表达式中的闭包1、定义和使用 Lambda 表达式2、Lambda 表达式捕获外部变量3、闭包的作用域 四、闭包的应用场景1、事件处理2、异步编程3、迭代…...

基于DockerCompose搭建Redis主从哨兵模式

linux目录结构 内网配置 哨兵配置文件如下&#xff0c;创建3个哨兵配置文件 # sentinel26379.conf sentinel26380.conf sentinel26381.conf 内容如下 protected-mode no sentinel monitor mymaster redis-master 6379 2 sentinel down-after-milliseconds mymaster 60000 s…...

UIP协议栈 TCP通信客户端 服务端,UDP单播 广播通信 example

文章目录 1. TCP通信 客户端&#xff08;关键配置&#xff09;2. TCP 服务端配置3. UDP 点播通信4. UDP 广播通信5. UIP_UDP_APPCALL 里边的处理example6. TCP数据处理 &#xff0c;UIP_APPCALL调用的函数 UIP_APPCALL TCP的数据都在这个宏定义的函数里进行数据处理的 UDP 数据…...

LeetCode:226.翻转二叉树

跟着carl学算法&#xff0c;本系列博客仅做个人记录&#xff0c;建议大家都去看carl本人的博客&#xff0c;写的真的很好的&#xff01; 代码随想录 LeetCode&#xff1a;226.翻转二叉树 给你一棵二叉树的根节点 root &#xff0c;翻转这棵二叉树&#xff0c;并返回其根节点。 …...

Visual Studio 使用 GitHub Copilot 扩展

&#x1f380;&#x1f380;&#x1f380;【AI辅助编程系列】&#x1f380;&#x1f380;&#x1f380; Visual Studio 使用 GitHub Copilot 与 IntelliCode 辅助编码Visual Studio 安装和管理 GitHub CopilotVisual Studio 使用 GitHub Copilot 扩展Visual Studio 使用 GitHu…...

Unity实现Root Motion动画的Navigation自动导航

Root motion动画可以将角色的根节点&#xff08;通常是角色的骨盆或脚部&#xff09;的运动直接应用到游戏对象上&#xff0c;从而实现角色的自然移动和旋转&#xff0c;避免出现脚底打滑的现象。采用Root motion动画的游戏对象&#xff0c;通常是重载了onAnimatorMove函数&…...

vulnhub靶场【DriftingBlues】之9 final

前言 靶机&#xff1a;DriftingBlues-6&#xff0c;IP地址192.168.1.66 攻击&#xff1a;kali&#xff0c;IP地址192.168.1.16 都采用虚拟机&#xff0c;网卡为桥接模式 主机发现 使用arp-scan -l或netdiscover -r 192.168.1.1/24 信息收集 使用nmap扫描端口 网站探测 访…...

Python连接和操作Elasticsearch详细指南

Python连接和操作Elasticsearch详细指南 一、服务器端配置1. 修改 Elasticsearch 配置文件2. 开放防火墙端口 二、本地 Python 连接 Elasticsearch1. 连接 Elasticsearch2. 索引操作3. 文档操作4. 搜索内容5. 聚合查询6. 批量操作 三、注意事项四、故障排除结论 Elasticsearch …...

JMeter 使用详解

JMeter 使用详解 Apache JMeter 是一款开源的性能测试工具&#xff0c;可用于对静态和动态资源&#xff08;如 Web 应用、数据库、REST API 等&#xff09;进行负载测试和性能测试。以下是 JMeter 的详细使用指南&#xff1a; 1. JMeter 安装 下载 JMeter&#xff1a; 从 Apac…...

[SZ901]程序固化工具速度对比

SZ901高速下载器提供程序固化工具&#xff0c;能够快速将bin文件烧写到FLASH中。 相对传统方式有以下优点 1&#xff0c;固化时间是传统方式的1/2 到1/5&#xff0c;flash&#xff0c;程序越大&#xff0c;&#xff0c;效果越明显 2&#xff0c;操作简单&#xff0c;自动脚本…...

类OCSP靶场-Kioptrix系列-Kioptrix Level 4

一、前情提要 二、实战打靶 1. 信息收集 1.1. 主机发现 1.2. 端口扫描 1.3.目录遍历 1.4. 敏感信息 2.漏洞发现 2.1.登录框万能密码 2.2.系统用户密码-ssh链接 2.3.mysql-udf提权 一、前情提要 kali黑客-利用searchsploit搜索exp一键化攻击-CSDN博客 一篇文章带你理…...

C++ ——— 类的 6 个默认成员函数之 取地址函数 以及 const取地址操作符重载函数

目录 前言 取地址函数 const 取地址操作符重载函数 前言 在前几章学习了类的 6 个默认成员函数中的 4 个函数&#xff0c;也是最重要的 4 个 C ——— 类的 6 个默认成员函数之 构造函数-CSDN博客 C ——— 类的 6 个默认成员函数之 析构函数_结构体构析函数-CSDN博客 C…...

【C语言】头文件”“和<>的详解

前言 作者在刚开始学C语言的时候&#xff0c;都是用的< >去引用头文件&#xff0c;但在学习STM32的时候发现&#xff0c;程序中大量使用" "去引用双引号。 那么二者有什么区别呢? 无论使用哪种方式&#xff0c;头文件的目的都是为了引用你需要的文件供你编程使…...

sql server 字符集和排序

英文&#xff1a; Latin1_General_CI_AS 中文&#xff1a;Chinese_PRC_CI_AS 影响字符存储&#xff0c;解释用户存在单字节字符类型&#xff08;char&#xff0c;varchar等&#xff09;里面的数据 字符排序规则&#xff08;是否区分大小写等&#xff09; 中国的用户一定要注意…...

【linux】shell(39)-定时任务

在 Linux 和 Unix 系统中&#xff0c;定时任务是通过 cron 服务 和 crontab 工具 实现的&#xff0c;它允许用户在指定的时间自动执行命令或脚本。本教程将深入介绍 crontab 的工作原理、配置、常见用法和注意事项&#xff0c;帮助你高效地管理自动化任务。 1. cron 和 crontab…...

C# 基本信息介绍

总目录 前言 对 C# 做一个基本信息介绍&#xff0c;让我们对 C# 有个基本的认识。 在进行本文的阅读之前&#xff0c;可以瞧瞧 编程基础知识简述 简单的入个门儿。 一、C# 1. C# 概述 C#是由微软公司发布的一种由C和C衍生出来的面向对象的编程语言。 2. C# 详细介绍 C#&am…...

告别机器人味:如何让ChatGPT写出有灵魂的内容

目录 ChatGPT的一些AI味道小问题 1.提供编辑指南 2.提供样本 3.思维链大纲 4.融入自己的想法 5.去除重复增加多样性 6.删除废话 ChatGPT的一些AI味道小问题 大多数宝子们再使用ChatGPT进行写作时&#xff0c;发现我们的老朋友ChatGPT在各类写作上还有点“机器人味”太重…...

ECharts柱状图-柱图38,附视频讲解与代码下载

引言&#xff1a; 在数据可视化的世界里&#xff0c;ECharts凭借其丰富的图表类型和强大的配置能力&#xff0c;成为了众多开发者的首选。今天&#xff0c;我将带大家一起实现一个柱状图图表&#xff0c;通过该图表我们可以直观地展示和分析数据。此外&#xff0c;我还将提供…...

SAP ALV选择列排序时弹出定义排序顺序窗口问题

需求场景 使用REUSE_ALV_GRID_DISPLAY_LVC生成ALV&#xff0c;发现一个问题&#xff1a;使用it_events的时候选择列排序时会弹出定义排序顺序窗口&#xff0c;如下图所示。&#xff08;正常选择某一列再使用排序功能时会直接排序&#xff0c;不用再选择列&#xff09; CLASS l…...