【PmHub后端篇】Skywalking:性能监控与分布式追踪的利器
在微服务架构日益普及的当下,对系统的性能监控和分布式追踪显得尤为重要。本文将详细介绍在 PmHub 项目中,如何使用 Skywalking 实现对系统的性能监控和分布式追踪,以及在这过程中的一些关键技术点和实践经验。
1 分布式链路追踪概述
在微服务系统中,一个请求可能会经过多个服务的调用,形成复杂的调用链路。例如,A 服务调用 B 服务,B 服务又调用 C 服务等。链路中的任何一环出现高延时或错误,都可能导致整个请求的失败。
目前,比较流行的分布式链路追踪技术有 Sleuth、Skywalking 以及 ZipKin 等。其中,Sleuth 的核心已迁移,部分功能有变动。
以下是一些行业内比较成熟的其他分布式链路追踪技术解决方案。
技术 | 说明 |
---|---|
Cat | 由大众点评开源,基于Java开发的实时应用监控平台,包括实时应用监控,业务监控 。集成方案是通过代码埋点的方式来实现监控,比如:拦截器,过滤器等。对代码的侵入性很大,集成成本较高,风险较大。 |
ZipKin | 由Twitter公司开源,开放源代码分布式的跟踪系统,用于收集服务的定时数据,以解决微服务架构中的延迟问题,包括:数据的收集、存储、查找和展现。结合spring - cloud - sleuth使用较为简单,集成方便,但是功能较简单。 |
Pinpoint | Pinpoint是一款开源的基于字节码注入的调用链分析,以及应用监控分析工具。特点是支持多种插件,UI功能强大,接入端无代码侵入。 |
Skywalking | SkyWalking是国人开源的基于字节码注入的调用链分析,以及应用监控分析工具。特点是支持多种插件,UI功能较强,接入端无代码侵入。 |
2 分布式链路追踪原理
以三个微服务调用链路为例,假设 Service 1 调用 Service 2,Service 2 调用 Service 3 和 Service 4 。
在链路追踪中,每个服务调用时会加上 Trace ID 和 Span ID 。链路通过 TraceId 唯一标识,Span 标识发起的请求信息,各 span 通过 parent id 关联起来。
链路追踪是在分布式系统中,用于跟踪请求在各个服务之间流转过程的技术,以下结合图中信息说明其原理:
基本标识
- Trace ID:用于唯一标识一条完整的请求链路,贯穿整个请求过程。图中多个服务的请求和响应中都带有相同的
Trace Id = X
,表明它们属于同一条链路。 - Span ID:标识链路中每一个独立的操作单元,不同的
Span Id
对应不同服务或同一服务内不同步骤的操作 。例如Span Id = A
、Span Id = B
等。
关键时间点
- CS(Client Sent):客户端发送请求的时间。代表请求从客户端发出的时刻。
- SR(Server Received):服务端接收到请求的时间。
SR - CS
可计算出网络将请求从客户端传输到服务端的时间 。 - SS(Server Sent):服务端发送响应的时间。
SS - SR
反映了服务端处理业务逻辑所花费的时间。 - CR(Client Received):客户端接收到响应数据的时间。
CR - CS
体现了整个远程调用(包括网络传输和服务端处理 )所耗费的时间,CR - SS
则是网络将响应从服务端传输回客户端的时间。
链路流转示例
- 请求发起:在
SERVICE 1
处,请求开始,此时可能还未分配Trace ID
和Span ID
(图中显示No Trace Id
、No Span Id
) ,后续会生成并携带在请求中。 - 服务间传递:请求从
SERVICE 1
流向SERVICE 2
,SERVICE 2
接收到请求时记录SR
时间,处理完业务逻辑后记录SS
时间并发送响应。同时,SERVICE 2
可能会继续向SERVICE 3
、SERVICE 4
发起请求,这些子请求也都带有相同的Trace ID
,并分配新的Span ID
来标识自身操作。 - 响应返回:各个服务处理完请求后,响应沿着链路反向传递,最终回到客户端,客户端记录
CR
时间,完成一次完整的链路追踪。
通过记录这些时间点和标识,链路追踪能够清晰展现请求在分布式系统中各个服务间的流转路径、每个服务的处理耗时以及网络传输耗时等信息,方便开发人员定位性能瓶颈和排查问题。
3 Skywalking 介绍
Skywalking 是一款优秀的国产开源框架,由个人吴晟(华为开发者)于 2015 年开源,并在 2017 年加入 Apache 孵化器。它支持 dubbo、SpringCloud、SpringBoot 集成,代码无侵入,通信方式采用 GRPC,性能较好。其功能丰富,包括告警、JVM 监控、全局调用统计等,社区也比较活跃。
- 官网地址:https://skywalking.apache.org/
- 开源地址:https://github.com/apache/skywalking
为什么选择 Skywalking?
Skywalking 相比于 zipkin 等工具,具有字节码增强技术实现的代码无侵入优势,功能更加丰富,报表统计和 UI 界面更加人性化。
4 Skywalking 架构
Skywalking 的架构主要分为服务端和客户端。服务端独立运行,客户端即微服务,引入 jar 包并进行相关配置即可。
- Agent:负责收集日志数据,并传递给 OAP 服务器。
- OAP:接收 Agent 发送的 Tracing 和 Metric 数据信息,进行分析后存储到外部存储器,并提供查询功能。
- UI:提供 web 控制台,可查看链路、各种指标和性能等信息。
- Storage:负责数据的存储,支持多种存储类型。
简言之,Agent负责收集日志传输数据,通过GRPC的方式传递给OAP进行分析并且存储到数据库中,最终通过UI界面将分析的统计报表、服务依赖、拓扑关系图展示出来。
5 服务端搭建
Skywalking 的下载地址为 https://skywalking.apache.org/downloads/ 。
由于 PmHub 使用的是 jdk8,而 SkyWalking 需要 11 以上,为避免版本不兼容问题,建议使用低版本的 SkyWalking,如 8.3.0 。
下载完成后,需要对相关配置文件进行修改:
-
config/application.yml:将注册中心改为 Nacos ,配置相关参数如集群、命名空间等。
-
webapp/webapp.yml(或 application.yml):修改 UI 服务的端口,将默认的 8080 改为 8888 ,避免端口冲突。
- 启动:双击
startup.bat
脚本,运行服务端。
启动服务端后,可通过浏览器访问 http://localhost:8888/ 。
注意:启动服务端前,要先启动nacos,否则无法访问首页。
6 项目实战
6.1 客户端搭建
Skywalking 采用字节码增强技术,对微服务无代码侵入。在微服务的启动参数中指定 skywalking 提供的 agent 路径和相关配置,如:
-javaagent:/Users/canghe/tools/skywalking/apache-skywalking-apm-bin/agent/skywalking-agent.jar
-Dskywalking.agent.service_name=pmhub-gateway
-Dskywalking.collector.backend_service=127.0.0.1:11800
-javaagent
指定 agent 中 skywalking-agent.jar 的路径;-Dskywalking.agent.service_name
指定服务名称;-Dskywalking.collector.backend_service
指定 oap 服务绑定的地址。如果是本地,由于oap服务默认的端口是11800,因此只需要配置为127.0.0.1:11800
。
2024版IDEA添加VM步骤如下:
需注意,agent 的 jar 包路径不能包含中文和空格,否则运行不成功。
6.2 日志监控
-
日志模块位置及默认情况:在skywalking的UI端有日志模块,用于收集客户端的日志,默认情况下该模块没有数据。
-
编辑agent日志级别:SkyWalking 的日志配置文件通常位于 agent/config/agent.config 中。为防止控制台打印过多 info 日志,需找到该文件并打开,找到配置项“LOGGING.LEVEL”,设置适当的日志级别,如ERROR 或 WARN 来减少日志输出量。
-
添加依赖:由于每个微服务都要用到相关配置,建议将依赖放在公共模块下,其他微服务引入即可。具体依赖如下:
- 获取链路TraceId的依赖:
<dependency><groupId>org.apache.skywalking</groupId><artifactId>apm-toolkit-trace</artifactId><version>8.8.0</version>
</dependency>
- 自定义功能(如自定义tag)的依赖:
<dependency><groupId>org.apache.skywalking</groupId><artifactId>apm-toolkit-opentracing</artifactId><version>8.8.0</version>
</dependency>
- skywalking日志记录logback插件的依赖:
<dependency><groupId>org.apache.skywalking</groupId><artifactId>apm-toolkit-logback-1.x</artifactId><groupId>8.8.0</groupId>
</dependency>
- 在logback.xml添加日志采集:
<?xml version = "1.0" encoding = "UTF-8"?>
<configuration scan = "true" scanPeriod = " 5 seconds"><!-- skywalking日志上报 --><appender name = "grpc-log" class = "org.apache.skywalking.apm.toolkit.log.logback.v1.x.log.GRPCLogClientAppender"><encoder class = "ch.qos.logback.core.encoder.LayoutWrappingEncoder"><layout class = "org.apache.skywalking.apm.toolkit.log.logback.v1.x.mdc.TraceIdMDCPatternLogbackLayout"><Pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%X{tid}] [%thread] %-5level %logger{36} - %msg %n</Pattern></layout></encoder></appender><root level = "INFO"><appender-ref ref= "grpc-log" /></root>
</configuration>
- 配置后的效果:配置好上述内容后,日志就可以在skywalking的UI中查看,还可体验链路追踪、性能剖析等功能,也可配置自定义监控告警,并链接钉钉和邮件 。
7 总结
在微服务架构下,Skywalking可实现性能监控和分布式追踪。介绍了分布式链路追踪原理,Skywalking的架构、搭建(服务端和客户端)、日志监控等内容,还对比了其他技术,利用Skywalking可提升系统性能与可维护性。
8 参考链接
- PmHub的性能监控和分布式追踪整合Skywalking
- 项目仓库(GitHub)
- 项目仓库(码云):(国内访问速度更快)
相关文章:
【PmHub后端篇】Skywalking:性能监控与分布式追踪的利器
在微服务架构日益普及的当下,对系统的性能监控和分布式追踪显得尤为重要。本文将详细介绍在 PmHub 项目中,如何使用 Skywalking 实现对系统的性能监控和分布式追踪,以及在这过程中的一些关键技术点和实践经验。 1 分布式链路追踪概述 在微服…...
ChromeDriver 技术生态与应用场景深度解析
ChromeDriver 技术生态与应用场景深度解析 随着 Web 自动化测试、运维和数据采集需求的不断增长,ChromeDriver 及其相关技术栈在各行业中扮演着举足轻重的角色。本文将从技术选型、语言适配、典型场景、技术延伸等维度,结合最新行业趋势与实践经验&…...
链表面试题6之回文结构
经过前几道题的铺垫,那么我们也是来到了链表的第六关。这也是一道非常经典的题目。 目录 逆置法 数组法 那么对于这道题目,我们要判断回文结构,实际上就是判断链表对不对称。这种类型的题目我们好像在哪里见过,对了,…...
ASP.NET Core Identity框架使用指南
文章目录 前言一、核心功能二、核心组件三、使用1)创建项目2)安装必要 NuGet包3)配置数据库连接字符串4)用户与角色实体定义4)配置数据库上下文5) 注册服务6)数据库迁移与初始化7)用…...
Hugging Face推出了一款免费AI代理工具,它能像人类一样使用电脑
Hugging Face推出了一款免费AI代理工具,它能像人类一样使用电脑。 这款工具名为Open Computer Agent(开放计算机代理),可模拟真实的电脑操作。 无需安装,在浏览器中即可运行。 以下是一些信息: - Open C…...
一.Gitee基本操作
一.初始化 1.git init初始化仓库 git init 用于在当前目录下初始化一个本地 Git 仓库,让这个目录开始被 Git 跟踪和管理。 生成 .git 元数据目录,从而可以开始进行提交、回退、分支管理等操作。 2.git config user.name/user.email配置本地仓库 # 设置…...
24、DeepSeek-V3论文笔记
DeepSeek-V3论文笔记 **一、概述****二、核心架构与创新技术**0.汇总:1. **基础架构**2. **创新策略** 1.DeepSeekMoE无辅助损失负载均衡DeepSeekMoE基础架构无辅助损失负载均衡互补序列级辅助损失 2.多令牌预测(MTP)1.概念2、原理2.1BPD2.2M…...
神经网络初步学习——感知机
一、前言 神经网络,顾名思义,它与我们大脑生物学里面讲到的神经元有关联。前辈们在研究早期人工智能的时候,就开始过我们的“交叉融合”,他们思考能不能把我们的人工智能的学习模式改造成我们人脑中神经元之间的学习方式——于是乎…...
在Text-to-SQL任务中应用过程奖励模型
论文标题 Reward-SQL: Boosting Text-to-SQL via Stepwise Reasoning and Process-Supervised Rewards 论文地址 https://arxiv.org/pdf/2505.04671 代码地址 https://github.com/ruc-datalab/RewardSQL 作者背景 中国人民大学,香港科技大学广州,阿…...
Python的安装使用
一、下载Python安装包 下载python安装包,可以直接访问官网地址:https://www.python.org/downloads/ 通过页面咱们直接下载最新版本的python安装包即可,python3.13.3。在页面的下方也可下载安装之前的版本,目前咱们按最新版本安装…...
mapreduce-wordcount程序2
WordCount案例分析 给定一个路径,统计这个路径下所有的文件中的每一个单词的出现次数。 其中,需要我们去实现代码的部分是:map函数和reduce函数。它们各自的作用是: map函数的入参是kv结构,k是偏移量,v是一…...
Java 内存模型(JMM)与内存屏障:原理、实践与性能权衡
Java 内存模型(JMM)与内存屏障:原理、实践与性能权衡 在多线程高并发时代,Java 内存模型(JMM) 及其背后的内存屏障机制,是保障并发程序正确性与性能的基石。本文将系统梳理 JMM 的核心原理、内…...
1.6 偏导数
(铺垫)全导数与偏导数看似相似,实则对应不同维度的变化观察。理解它们的差异需要从"变量自由度"切入: (核心差异解剖) 维度偏导数全导数变量关系其他变量被强制锁定所有变量都通过中间变量关联…...
网络爬虫学习之正则表达式
开篇 本文整理自《python3 网络爬虫开发实战》的学习笔记。 笔记整理 match match是一种常用的匹配方法,向它传入要匹配的字符串以及正则表达式,就可以检测这个正则表达式是否和字符串相匹配。 match会尝试从字符串的起始位置开始匹配正则表达式&#x…...
Pytorch常用统计和矩阵运算
文章目录 常用统计函数torch.prod()求积torch.sum()求和torch.mean()求均值torch.max()求最值torch.var() 方差torch.std()标准差 常见矩阵运算矩阵乘法点积 (torch.dot)批量矩阵乘法 (torch.bmm)奇异值分解 (SVD)特征分解 (torch.eig)矩阵求逆 (torch.inverse)伪逆 (torch.pin…...
PyTorch Lightning实战 - 训练 MNIST 数据集
MNIST with PyTorch Lightning 利用 PyTorch Lightning 训练 MNIST 数据。验证梯度范数、学习率、优化器对训练的影响。 pip show lightning Version: 2.5.1.post0Fast dev run DATASET_DIR"/repos/datasets" python mnist_pl.py --output_grad_norm --fast_dev_run…...
内存泄漏系列专题分析之十一:高通相机CamX ION/dmabuf内存管理机制Camx ImageBuffer原理
【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了:内存泄漏系列专题分析之八:高通相机CamX内存泄漏&内存占用分析--通用ION(dmabuf)内存拆解 这一篇我们开始讲: 内存泄漏系列专题分析之十一:高通相机CamX ION/dmabuf内存管理机制Camx ImageBuf…...
MySQL-逻辑架构
MySQL服务器逻辑架构图 主要分层结构 1.连接层 功能:处理连接、安全认证、线程管理等 核心模块:连接器:支持不同语言(JDBC)与MySQL交互;线程连接池:管理线程连接,减少线程频繁创建…...
架构思维:通用架构模式_系统监控的设计
文章目录 引言什么是监控三大常见监控类型1. 次数监控2. 性能监控3. 可用率监控 落地监控1. 服务入口2. 服务内部3. 服务依赖 监控时间间隔的取舍小结 引言 架构思维:通用架构模式_从设计到代码构建稳如磐石的系统 架构思维:通用架构模式_稳如老狗的SDK…...
架构、构架、结构、框架之间有什么区别?|系统设计|系统建模
在技术与知识中,我们总是频繁地遇到一些高度抽象、看似类似、却又各自承载着不同思想重量的词汇。“架构”、“构架”、“结构”、“框架”即是其中最为常见又最为令人困惑的一组术语。它们既是工程师们日常工作的核心语言,也是学者们在探索系统、组织、…...
系统架构设计(五):构件
定义 构件(Component)是指一个具有明确边界和独立部署能力的模块化单元,能够封装实现细节,并通过接口与其他构件协作完成系统功能。 主要特性 特性说明可复用性构件可以在不同系统中被重复使用。可部署性构件可以独立部署&…...
【系统架构师】2025论文《基于架构的软件设计方法》【最新】
😊你好,我是小航,一个正在变秃、变强的文艺倾年。 🔔本文分享【系统架构师】2025论文《系统可靠性设计》,期待与你一同探索、学习、进步,一起卷起来叭! 目录 项目介绍背景介绍系统模块技术栈基于…...
MultiTTS 1.7.6 | 最强离线语音引擎,提供多音色无障碍朗读功能,附带语音包
MultiTTS是一款免费且支持离线使用的文本转语音(TTS)工具,旨在为用户提供丰富的语音包选项,实现多音色无障碍朗读功能。这款应用程序特别适合用于阅读软件中的离线听书体验,提供了多样化的语音选择,使得听书…...
Costmap代价地图
以下为ROS navigation导航工具包的move_base框架图。其中有两个关于代价地图的模块(红框所框),全局代价地图global_costmap和局部代价地图local_costmap,这两个代价地图实际上是调用的同一个功能包代码,通过配置不同的参数实例化为两个代价地…...
用生活例子通俗理解 Python OOP 四大特性
让我们用最生活化的方式,结合Python代码,来理解面向对象编程的四大特性。 1. 封装:像使用自动售货机 生活比喻: 你只需要投币、按按钮,就能拿到饮料 不需要知道机器内部如何计算找零、如何运送饮料 如果直接打开机…...
大规模容器集群怎么规划
规划大规模容器集群需要综合考虑多个方面,以下是一些关键的规划要点: 业务需求分析 应用类型和特点:明确容器集群上运行的应用类型,如 Web 应用、数据库、大数据处理等。不同类型的应用对资源的需求和性能要求各不相同。例如&am…...
机器学习第七讲:概率统计 → 预测可能性,下雨概率70%就是典型应用
机器学习第七讲:概率统计 → 预测可能性,下雨概率70%就是典型应用 资料取自《零基础学机器学习》。 查看总目录:学习大纲 关于DeepSeek本地部署指南可以看下我之前写的文章:DeepSeek R1本地与线上满血版部署:超详细手…...
蓝桥杯13届 卡牌
问题描述 这天, 小明在整理他的卡牌。 他一共有 n 种卡牌, 第 i 种卡牌上印有正整数数 i(i∈[1,n]), 且第 i 种卡牌 现有 ai 张。 而如果有 n 张卡牌, 其中每种卡牌各一张, 那么这 n 张卡牌可以被称为一 套牌。小明为了凑出尽可能多套牌, 拿出了 m 张空白牌, 他可以在上面…...
《Vue.js》阅读之响应式数据与副作用函数
Vue.js 《Vue.js设计与实现》(霍春阳) 适合:从零手写Vue3响应式系统,大厂面试源码题直接覆盖。重点章节:第4章(响应式)、第5章(渲染器)、第8章(编译器&…...
线下消费经济“举步维艰”,开源AI智能名片链动2+1+S2B2C小程序线上“狂飙突进”!
开源AI智能名片链动21模式S2B2C商城小程序:驱动消费经济迭代的数字化引擎 摘要:本文以中国消费经济四阶段演进为框架,分析开源AI智能名片链动21模式S2B2C商城小程序如何重构商业生态。研究显示,该系统通过AI算法驱动的精准需求匹…...
简述DNS域名服务器
DNS简述 在互联网中,识别一个主机通常有两种方式——主机名和IP地址。从人类角度来看,人类肯定更喜欢这些便于记忆的主机名标识方式,而对于路由器来说,路由器则更喜欢定长的,有结构层次的IP地址。所以DNS域名服务器就…...
小结: Port Security,DHCP Snooping,IPSG,DAI,
以下是华为和思科在 IP Source Guard、Dynamic ARP Inspection、DHCP Snooping、Port Security 四个安全功能的配置指令对比: 1. Port Security(端口安全) 思科(Cisco) # 进入接口模式 interface GigabitEthernet0/1…...
2025年阿里云ACP人工智能高级工程师认证模拟试题(附答案解析)
这篇文章的内容是阿里云ACP人工智能高级工程师认证考试的模拟试题。 所有模拟试题由AI自动生成,主要为了练习和巩固知识,并非所谓的 “题库”,考试中如果出现同样试题那真是纯属巧合。 1、在PAl-Studio实验运行完毕后,可以右键单…...
SwitchyOmega_Chromium 代理插件下载与配置
下载地址: 【免费】SwitchyOmega-Chromium.ran资源-CSDN文库 下载 SwitchyOmega_Chromium.ran 文件。 解压缩文件 解压第一层后,解压第二层代理插件SwitchyOmega_Chromium。 打开 Chromium 浏览器。 导入插件: 在浏览器地址栏输入 chrome://extensio…...
【Nova UI】十四、打造组件库之按钮组件(下):按钮组组件的构建之旅
序言 在之前的探索中,我们成功雕琢出了功能完备且样式精美的 Vue 按钮组件,它在前端界面上绽放着独特的光彩✨。然而,前端开发的创新之路永无止境。如今,为了满足更丰富的交互需求,我们将目光聚焦在按钮组组件的实现上…...
SQL注入
sql注入核心语句 information_schema 虚拟数据库(物理上不存在),能提供方皓文数据库元数据的方式,元数据是关于数据的数据,如数据库名、表名、列的数据类型、访问权限等 只能访问 information_schema下面的表: schemata表…...
Java面试高阶篇:Spring Boot+Quarkus+Redis高并发架构设计与性能优化实战
Java面试高阶篇:Spring BootQuarkusRedis高并发架构设计与性能优化实战 面试官(严肃): Q1: 你项目中如何实现高并发下的缓存优化? 候选人(水货): 我们用了Redis做缓存,…...
【CF】Day57——Codeforces Round 955 (Div. 2, with prizes from NEAR!) BCD
B. Collatz Conjecture 题目: 思路: 简单模拟 很简单的模拟,我们只需要快速的找到下一个离 x 最近的 y 的倍数即可(要大于 x) 这里我们可以这样写 add y - (x % y),这样就知道如果 x 要变成 y 的倍数还要…...
Matlab 列车纵向滑模二阶自抗扰算法和PID对比
1、内容简介 Matlab 223-列车纵向滑模二阶自抗扰算法和PID对比 可以交流、咨询、答疑 2、内容说明 略 列车模型 在运行过程中,已知列车受到牵引力或者制动力,基本阻力和附加阻力的作用,规定与列车运行方向相同的力为正,与运行…...
Swift实战:如何优雅地从二叉搜索树中挑出最接近的K个值
文章目录 摘要描述题解答案题解代码分析示例测试及结果时间复杂度空间复杂度总结未来展望 摘要 在日常开发中,我们经常会遇到“在一堆数据中找出最接近某个值”的需求。尤其在搜索引擎、推荐系统或者地理坐标匹配中,这种“最近匹配”的问题非常常见。Le…...
深度策略梯度算法PPO
一、策略梯度核心思想和原理 从时序差分算法Q学习到深度Q网络,这些算法都侧重于学习和优化价值函数,属于基于价值的强化学习算法(Value-based)。 1. 基于策略方法的主要思想(Policy-based) 基于价值类方…...
QuickList
Redis在3.2版本引入数据结构,是一个双端链表,每个节点都是一个ZipList。 引入的原因:ZipList申请内存空间是连续的,如果内存占用较多,申请内存效率很低 思想:属于分片存储的思想 Redis配置项:…...
DVWA在线靶场-SQL注入部分
目录 1.SQL注入 1.1 low 1.2 Medium 1.3 high 1.4 impossible 1. SQL盲注 1.1 low 2.2 medium 2.3 high 2.4 impossible 1.SQL注入 显注:前端页面可以回显用户信息,比如 联合注入、报错注入。 盲注:前端页面不能回显用户信息,比…...
IDEA+git将分支合并到主分支、IDEA合并分支
文章目录 一、合并分支二、可能遇到的问题2.1、代码冲突 开发过程中我们可能在开发分支(dev)中进行开发,等上线后将代码合并到主分支(master)中,本文讲解如何在IDEA中将dev分支的代码合并到master分支中。 一、合并分支 功能说明:将dev分支的…...
【Linux笔记】——进程信号的产生
🔥个人主页🔥:孤寂大仙V 🌈收录专栏🌈:Linux 🌹往期回顾🌹:【Linux笔记】进程间通信——system v 共享内存 🔖流水不争,争的是滔滔不 一、进程信号…...
Java后端文件类型检测(防伪造)
在 Spring Boot 项目中,为了防止用户伪造 Content-Type(例如将 .txt 文件改为 image/jpeg 上传),可以通过检查文件的 Magic Number(文件头签名)来验证文件的真实类型。以下是 详细实现步骤 和 完整代码示例…...
知名人工智能AI培训公开课内训课程培训师培训老师专家咨询顾问唐兴通AI在金融零售制造业医药服务业创新实践应用
AI赋能未来工作:引爆效率与价值创造的实战营 AI驱动的工作革命:从效率提升到价值共创 培训时长: 本课程不仅是AI工具的操作指南,更是面向未来的工作方式升级罗盘。旨在帮助学员系统掌握AI(特别是生成式AI/大语言模型…...
VUE3基础样式调整学习经验
首先创建一个vue项目最好要把不属于自己的样式都删除掉,以面出现css难以调整的情况: 1.assets目录下的main.css、base.css等样式全部删除 2.app.vue下的样式也全部删除 3.使用element plus一定要加入样式包: import element-plus/dist/in…...
AI与IoT携手,精准农业未来已来
AIoT:农业领域的变革先锋 在科技飞速发展的当下,人工智能(AI)与物联网(IoT)的融合 ——AIoT,正逐渐成为推动各行业变革的关键力量,农业领域也不例外。AIoT 技术通过将 AI 的智能分析能力与 IoT 的设备互联能力相结合,为农业生产带来了前所未有的精准度和智能化水平。 …...
物联网驱动的共享充电站系统:智能充电的实现原理与技术解析!
随着新能源汽车的快速普及,共享充电站系统作为其核心基础设施,正通过物联网技术的深度赋能,实现从“传统充电”到“智能充电”的跨越式升级。本文将从系统架构、核心技术、优化策略及实际案例等角度,解析物联网如何驱动共享充电站…...