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

【商城实战(24)】商城性能大揭秘:压力测试与性能监控实战

【商城实战】专栏重磅来袭!这是一份专为开发者与电商从业者打造的超详细指南。从项目基础搭建,运用 uniapp、Element Plus、SpringBoot 搭建商城框架,到用户、商品、订单等核心模块开发,再到性能优化、安全加固、多端适配,乃至运营推广策略,102 章内容层层递进。无论是想深入钻研技术细节,还是探寻商城运营之道,本专栏都能提供从 0 到 1 的系统讲解,助力你打造独具竞争力的电商平台,开启电商实战之旅。

目录

  • 一、压力测试工具选择与计划制定
    • 1.1 JMeter 工具介绍
    • 1.2 制定压力测试计划
    • 1.3 源码实现
  • 二、执行压力测试与性能指标收集
    • 2.1 模拟高并发场景
    • 2.2 收集系统性能指标
    • 2.3 源码实现
  • 三、搭建性能监控系统
    • 3.1 Prometheus + Grafana 介绍
    • 3.2 搭建过程
    • 3.3 关联监控指标端点
    • 3.4 源码实现
  • 四、总结与展望


一、压力测试工具选择与计划制定

1.1 JMeter 工具介绍

JMeter 是一款由 Apache 软件基金会开发的基于 Java 的开源测试工具,最初主要用于 Web 应用程序测试,如今其应用范围已大幅拓展,可对各类网络服务进行全面性能测试,堪称虚拟的 “压力制造机”。

它具备诸多显著优势。在协议支持方面,JMeter 功能强大,能处理 HTTP、HTTPS、FTP、SMTP、POP3 等常见网络协议,以及 JDBC(用于数据库测试)、JMS(Java 消息服务)等企业级应用相关协议,这使得它能适应各种通信协议的软件系统测试需求。

从测试场景设置来看,JMeter 十分灵活。通过线程组,可轻松定义模拟用户数量、启动方式(同时启动或逐步启动)以及操作循环次数;逻辑控制器则允许根据不同条件和逻辑组织测试步骤,比如设置循环执行某些操作,或依据特定条件决定是否执行某个请求,借此能够模拟出极为真实的用户行为和业务场景。

测试结果分析环节,JMeter 同样表现出色。它提供多种监听器,聚合报告可展示每个请求的平均响应时间、最小响应时间、最大响应时间、吞吐量以及错误率等关键指标;图形结果监听器以图表形式展示响应时间随时间的变化趋势,让我们能直观地洞察系统性能的波动情况,助力快速定位系统性能瓶颈,找出问题所在。此外,对于不太熟悉脚本编写的测试人员,JMeter 的录制与回放功能也非常实用,通过代理服务器可录制浏览器中的用户操作,并自动转换为测试脚本,在此基础上还能进一步优化完善,极大提高了测试脚本的编写效率。

1.2 制定压力测试计划

  • 测试目标:明确本次压力测试旨在评估商城系统在高并发场景下的性能表现,重点关注系统的响应时间、吞吐量、错误率等指标,以确定系统是否能够满足预期的业务负载需求,找出系统可能存在的性能瓶颈。
  • 测试范围:涵盖商城的核心业务接口,如商品查询、用户登录、添加购物车、下单等功能接口,确保这些关键业务在高并发情况下的稳定性和可靠性。
  • 场景设计
    • 场景一:商品查询:模拟大量用户同时查询商品列表,逐渐增加并发用户数,观察系统性能变化。
    • 场景二:用户登录:设置不同的并发用户数,模拟用户集中登录的场景,测试登录功能的响应速度和系统承载能力。
    • 场景三:下单操作:模拟多个用户同时下单,检查订单生成的准确性和系统的处理能力,关注库存扣减等相关业务逻辑是否正确执行。
  • 数据准备:准备大量的测试数据,包括商品信息、用户信息、订单数据等,确保数据的真实性和有效性。例如,商品数据应涵盖不同类别、价格区间的商品;用户信息包含各种角色和权限的用户;订单数据包含不同状态和金额的订单。
  • 预期结果:根据系统设计和业务需求,设定合理的性能指标预期值。例如,商品查询接口的平均响应时间应小于 500 毫秒,吞吐量达到每秒处理 1000 个请求以上,错误率控制在 1% 以内;用户登录接口的平均响应时间小于 300 毫秒,下单操作的成功率达到 99% 以上等。以商品查询场景为例,设置并发用户数从 100 逐步增加到 1000,每增加 100 个用户进行一轮测试,持续时间为 10 分钟,记录每轮测试的性能指标。

1.3 源码实现

在 Spring Boot 后端,以商品查询接口为例,代码示例如下:

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.example.demo.entity.Product;
import com.example.demo.service.ProductService;
import java.util.List;@RestController
public class ProductController {private final ProductService productService;public ProductController(ProductService productService) {this.productService = productService;}@GetMapping("/products")public List<Product> getProducts(@RequestParam(required = false) String category,@RequestParam(defaultValue = "0") int page,@RequestParam(defaultValue = "10") int size) {QueryWrapper<Product> queryWrapper = new QueryWrapper<>();if (category != null) {queryWrapper.eq("category", category);}queryWrapper.last("LIMIT " + page * size + ", " + size);return productService.list(queryWrapper);}
}

在 Element Plus 前端,使用 axios 发送请求,代码示例如下:

<template><div><el-button @click="fetchProducts">查询商品</el-button><el-table :data="products"><el-table-column prop="id" label="商品ID"></el-table-column><el-table-column prop="name" label="商品名称"></el-table-column><el-table-column prop="price" label="商品价格"></el-table-column></el-table></div>
</template><script setup>
import axios from 'axios';
import { ref } from 'vue';const products = ref([]);const fetchProducts = async () => {try {const response = await axios.get('/products', {params: {category: 'electronics',page: 0,size: 10}});products.value = response.data;} catch (error) {console.error('查询商品失败:', error);}
};
</script>

在 uniapp 前端,使用 uni.request 发送请求,代码示例如下:

<template><view><button @click="fetchProducts">查询商品</button><view v-for="product in products" :key="product.id"><text>{{ product.name }} - {{ product.price }}</text></view></view>
</template><script>
export default {data() {return {products: []};},methods: {async fetchProducts() {try {const response = await uni.request({url: '/products',method: 'GET',data: {category: 'electronics',page: 0,size: 10}});this.products = response.data;} catch (error) {console.error('查询商品失败:', error);}}}
};
</script>

二、执行压力测试与性能指标收集

2.1 模拟高并发场景

在 JMeter 中,通过配置线程组来模拟高并发场景。线程组是 JMeter 中定义虚拟用户的核心组件,通过设置线程组的相关参数,可以精确控制并发用户数、用户加载方式以及请求的循环次数等。

打开 JMeter,在测试计划中添加一个线程组。在设置线程组参数时,“线程数” 用于设定并发用户的数量,比如设置为 200,表示模拟 200 个用户同时访问系统;“Ramp-Up Period (in seconds)” 表示在指定的时间内逐步启动所有线程,若设置为 10 秒,JMeter 会在 10 秒内均匀地启动这 200 个线程,这样可以避免瞬间对服务器产生过大的压力;“循环次数” 决定每个线程发送请求的重复次数,若设置为 5,每个线程会对目标接口发送 5 次请求 ,总请求数则为线程数乘以循环次数,即 200×5 = 1000 次。此外,若勾选 “永远”,线程会一直循环发送请求,直到手动停止测试。

同时,我们还可以通过调度器来进一步控制测试的执行时间和启动延迟。“持续时间(秒)” 设定整个测试场景的运行时长,比如设置为 60 秒,测试将在启动后持续运行 60 秒;“启动延迟(秒)” 则指定从点击开始测试到真正启动线程之间的等待时间,例如设置为 5 秒,点击开始后,JMeter 会等待 5 秒再启动线程组中的线程。通过这些参数的合理配置,我们可以模拟出各种真实的高并发场景,如瞬间高并发、持续稳定并发等情况,从而全面测试商城系统在不同负载下的性能表现。

2.2 收集系统性能指标

在商城系统压力测试过程中,需要重点收集响应时间、吞吐量、错误率等关键性能指标。响应时间直接影响用户体验,指从客户端发送请求到接收到服务器响应所耗费的时间,一般包括网络传输时间、服务器处理时间等。在 JMeter 中,平均响应时间(Average)是所有请求响应时间的平均值,能反映系统在整体负载下的响应速度;中位数(Median)表示 50% 的请求响应时间小于该值,可用于衡量响应时间的集中趋势;90% Line 表示 90% 的请求响应时间小于该值,常用于评估系统在高负载下大部分用户的响应体验。

吞吐量体现了系统的处理能力,即单位时间内系统处理的请求数量,通常以 TPS(Transactions Per Second,每秒事务数)或 RPS(Requests Per Second,每秒请求数)为单位。较高的吞吐量意味着系统能够处理更多的并发请求,性能表现更优。错误率是指测试过程中出现错误的请求数量占总请求数量的百分比,错误可能包括网络超时、服务器内部错误、业务逻辑错误等。错误率过高表明系统在当前负载下存在稳定性问题,需要深入排查和优化。

在 JMeter 中,通过添加 “聚合报告” 监听器来收集这些性能指标。聚合报告以表格形式展示每个请求的各项性能数据,包括 Label(请求名称,对应 JMeter 中 HTTP Request 等元件的 Name 属性)、Samples(请求样本数,即总共发出的请求数量)、Average(平均响应时间)、Median(中位数响应时间)、90% Line(90% 百分位响应时间)、Min(最小响应时间)、Max(最大响应时间)、Error%(错误率)、Throughput(吞吐量)以及接收和发送的字节数(KB/Sec)等。通过分析这些指标数据,我们可以直观地了解系统在高并发场景下的性能状况,定位性能瓶颈所在。

2.3 源码实现

在 Spring Boot 后端,为了更好地处理高并发请求并记录性能指标,可以借助 Spring AOP(面向切面编程)和一些日志框架来实现。以商品查询接口为例,通过 AOP 可以在方法执行前后记录时间戳,从而计算出方法的执行时间,即响应时间。同时,可以使用计数器来统计请求次数,进而计算吞吐量。

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;@Aspect
@Component
public class PerformanceAspect {private static final Logger logger = LoggerFactory.getLogger(PerformanceAspect.class);private static final ThreadLocal<Long> startTime = new ThreadLocal<>();private static long requestCount = 0;@Around("execution(* com.example.demo.controller.ProductController.getProducts(..))")public Object measurePerformance(ProceedingJoinPoint joinPoint) throws Throwable {startTime.set(System.currentTimeMillis());try {return joinPoint.proceed();} finally {long endTime = System.currentTimeMillis();long executionTime = endTime - startTime.get();requestCount++;double throughput = requestCount * 1000.0 / executionTime;logger.info("商品查询接口响应时间: {} ms, 吞吐量: {} requests/second", executionTime, throughput);startTime.remove();}}
}

在前端,无论是 Element Plus 还是 uniapp,都可以通过封装请求函数来模拟高并发请求。以 Element Plus 为例,利用 axios 库结合 Promise.all 方法,可并发发送多个请求。

<template><div><el-button @click="sendConcurrentRequests">发送并发请求</el-button></div>
</template><script setup>
import axios from 'axios';
import { ref } from 'vue';const sendConcurrentRequests = async () => {const requestCount = 10;const requests = Array.from({ length: requestCount }, () =>axios.get('/products', {params: {category: 'electronics',page: 0,size: 10}}));try {const responses = await Promise.all(requests);console.log('并发请求成功:', responses);} catch (error) {console.error('并发请求失败:', error);}
};
</script>

在 uniapp 中,使用 uni.request 结合 Promise.all 也能实现类似的功能:

<template><view><button @click="sendConcurrentRequests">发送并发请求</button></view>
</template><script>
export default {methods: {async sendConcurrentRequests() {const requestCount = 10;const requests = Array.from({ length: requestCount }, () =>uni.request({url: '/products',method: 'GET',data: {category: 'electronics',page: 0,size: 10}}));try {const responses = await Promise.all(requests.map(req => new Promise((resolve, reject) => {req.then(res => resolve(res)).catch(err => reject(err));})));console.log('并发请求成功:', responses);} catch (error) {console.error('并发请求失败:', error);}}}
};
</script>

通过上述代码,在前端可以方便地模拟高并发请求,而后端则能有效地记录和统计相关性能指标,为后续的性能分析和优化提供数据支持。

三、搭建性能监控系统

3.1 Prometheus + Grafana 介绍

Prometheus 是一款开源的系统监控和警报工具,其核心在于通过 HTTP 协议周期性地抓取被监控组件的状态数据,即采用 Pull(拉取)模式从 Exporter 获取监控指标 。这些指标以时间序列的形式存储,每个时间序列都由一个唯一的标识符(包含指标名称和一组标签)和一系列的时间戳及对应的值组成,从而构建起多维度的数据模型。Prometheus 提供了强大的 PromQL 查询语言,能够对这些时间序列数据进行灵活的查询、聚合和分析,例如计算一段时间内的平均值、最大值、最小值,或者进行比率计算等,为性能分析提供了有力支持。同时,Prometheus 还具备联邦集群能力,可从其他 Prometheus Server 实例中获取数据,实现分布式监控。

Grafana 则是一款采用 Go 语言编写的开源数据可视化和监控分析平台,主要用于大规模指标数据的可视化展现。它支持从多种数据源(如 Prometheus、InfluxDB、Elasticsearch 等)获取数据,并提供了丰富多样的可视化图表类型,包括线图、柱状图、饼图、表格、地图等。用户可以根据实际需求自由组合和定制这些图表,创建出直观、美观且富有洞察力的仪表盘,将复杂的监控数据以清晰易懂的方式呈现出来,方便运维人员和开发人员实时了解系统的运行状态,及时发现潜在问题。此外,Grafana 还具备灵活的告警功能,可根据用户设置的阈值和规则自动发送通知和警报,确保在系统出现异常时能够及时响应和处理。

将 Prometheus 与 Grafana 结合使用,Prometheus 负责数据的采集、存储和查询,Grafana 专注于数据的可视化展示和告警,两者优势互补,能够为商城系统搭建一套完整、高效的性能监控解决方案,帮助我们全面掌握系统性能状况,保障系统的稳定运行。

3.2 搭建过程

  1. 安装 Prometheus:从 Prometheus 官方网站(https://prometheus.io/download/ )下载适合系统的安装包,例如在 Linux 系统中下载prometheus-*.linux-amd64.tar.gz压缩包。解压安装包到指定目录,如/usr/local/prometheus。修改配置文件prometheus.yml,配置监控任务,例如添加对商城服务的监控任务,指定监控目标的地址和端口。启动 Prometheus,在命令行中进入 Prometheus 安装目录,执行nohup ./prometheus --config.file=prometheus.yml &命令,使其在后台运行。此时,Prometheus 会按照配置文件中的设置,定期从指定的监控目标拉取指标数据,并存储在本地的时间序列数据库中。
  2. 安装 Grafana:在 Linux 系统中,可以通过 yum 或 apt 等包管理器进行安装。例如,使用 yum 安装时,先添加 Grafana 的官方 yum 源,编辑/etc/yum.repos.d/grafana.repo文件,添加如下内容:
[grafana]
name=grafana
baseurl=https://packages.grafana.com/oss/rpm
repo_gpgcheck=1
enabled=1
gpgcheck=1
gpgkey=https://packages.grafana.com/gpg.key
sslverify=1
sslcacert=/etc/pki/tls/certs/ca-bundle.crt

然后执行yum install grafana -y命令进行安装。安装完成后,启动 Grafana 服务,执行systemctl start grafana-server命令,并设置开机自启systemctl enable grafana-server。通过浏览器访问http://localhost:3000(默认端口为 3000),使用默认用户名admin和密码admin登录 Grafana。登录后,系统会提示修改初始密码,设置新密码后即可进入 Grafana 主界面。

  1. Spring Boot 集成 Micrometer 暴露指标端点:在 Spring Boot 项目的pom.xml文件中添加 Micrometer 和 Prometheus 的依赖:
<dependencies><!-- Micrometer Prometheus 依赖 --><dependency><groupId>io.micrometer</groupId><artifactId>micrometer-registry-prometheus</artifactId></dependency><!-- Spring Boot Actuator 依赖 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId></dependency>
</dependencies>

在application.yml配置文件中进行相关配置,开启指标端点的暴露:

management:endpoints:web:exposure:include: "*"metrics:export:prometheus:enabled: trueendpoint:prometheus:enabled: true

这样配置后,Spring Boot 应用会自动集成 Micrometer,并通过/actuator/prometheus端点暴露 Prometheus 格式的指标数据,供 Prometheus 抓取。

3.3 关联监控指标端点

  1. 修改 Prometheus 配置文件:在 Prometheus 的prometheus.yml配置文件中,添加商城服务的监控任务。假设商城服务运行在localhost:8080,添加如下配置:
scrape_configs:- job_name:'mall_service'metrics_path: '/actuator/prometheus'static_configs:- targets: ['localhost:8080']

修改完成后,保存配置文件并重启 Prometheus 服务,使其加载新的配置。Prometheus 会按照配置,定期从localhost:8080/actuator/prometheus端点拉取商城服务的指标数据。

  1. 在 Grafana 中添加 Prometheus 数据源:登录 Grafana,点击左侧菜单栏中的齿轮图标(Configuration),选择 “Data Sources”。在数据源页面,点击 “Add data source” 按钮,选择 “Prometheus”。在配置页面中,填写 Prometheus 的访问地址,例如http://localhost:9090(根据实际情况填写),其他选项保持默认,点击 “Save & test” 按钮。如果配置正确,会显示 “Data source is working” 提示,表示 Grafana 已成功连接到 Prometheus 数据源。
  2. 导入模板展示指标:Grafana 提供了丰富的仪表盘模板,可以在 Grafana 官方网站(https://grafana.com/grafana/dashboards )上搜索并下载适合商城监控的模板。下载模板后,在 Grafana 主界面点击 “+” 号,选择 “Import”,上传下载的模板文件,或者直接输入模板 ID 进行导入。导入时,选择之前添加的 Prometheus 数据源,点击 “Import” 按钮,即可在 Grafana 中展示商城服务的各项监控指标,如响应时间、吞吐量、错误率等,以直观的图表形式呈现系统性能状态。

3.4 源码实现

  1. Spring Boot 配置文件:在application.yml文件中,除了上述开启指标端点暴露的配置外,还可以进行一些自定义配置,例如添加自定义标签:
management:endpoints:web:exposure:include: "*"metrics:export:prometheus:enabled: truetags:application: mall - serviceendpoint:prometheus:enabled: true
  1. 相关依赖:在pom.xml文件中,确保依赖的版本正确且完整,如下所示:
<dependencies><!-- Micrometer Prometheus 依赖 --><dependency><groupId>io.micrometer</groupId><artifactId>micrometer-registry-prometheus</artifactId><version>1.10.6</version></dependency><!-- Spring Boot Actuator 依赖 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId><version>2.7.8</version></dependency>
</dependencies>
  1. 自定义指标:在 Spring Boot 应用中,可以使用 Micrometer 提供的注解来创建自定义指标。例如,在一个服务类中添加一个计数器,统计某个业务方法的调用次数:
import io.micrometer.core.annotation.Counted;
import org.springframework.stereotype.Service;@Service
public class OrderService {@Counted(value = "order_service_invocation_count", description = "Number of times the order service method is invoked")public void processOrder() {// 业务逻辑}
}

通过上述配置和代码实现,商城系统的性能监控体系得以搭建完成,Prometheus 能够准确地采集系统指标数据,Grafana 则将这些数据以直观的可视化方式展示出来,为系统的性能优化和问题排查提供有力支持。

四、总结与展望

压力测试与性能监控在商城系统的全生命周期中占据着无可替代的关键地位。通过压力测试,我们能够精准地评估商城系统在高并发场景下的性能表现,提前洞察系统可能存在的性能瓶颈,为系统优化提供有力的数据支撑,从而确保系统在面对实际业务高峰时,能够稳定、高效地运行,避免因性能问题导致的用户流失和业务损失。性能监控则像是商城系统的 “实时健康监测仪”,借助 Prometheus 和 Grafana 等工具,我们能够对系统的各项性能指标进行实时、全面的监控,及时发现系统运行过程中的异常情况,做到早发现、早处理,保障系统的稳定运行。

展望未来,随着商城业务的不断拓展和用户量的持续增长,我们仍需在多个方面持续发力,进一步优化系统性能。在架构优化层面,可探索微服务架构的深度应用,将商城系统拆分为多个独立的服务模块,实现服务的独立部署、扩展和升级,提高系统的灵活性和可维护性;同时,引入分布式缓存和消息队列技术,降低数据库的访问压力,提升系统的响应速度和吞吐量。在技术应用方面,人工智能和机器学习技术的发展为性能优化开辟了新的道路,例如利用机器学习算法对历史性能数据进行分析,预测系统性能趋势,提前进行性能优化;在智能运维领域,借助人工智能实现故障的自动诊断和修复,提高运维效率。此外,随着 5G 技术的普及和物联网设备的广泛应用,商城系统将面临更多的接入设备和更高的并发请求,如何应对这些新的挑战,实现系统的无缝扩展和性能的持续提升,将是未来研究和探索的重要方向。我们相信,通过不断地优化和创新,商城系统将能够为用户提供更加优质、稳定的服务,在激烈的市场竞争中脱颖而出。

相关文章:

【商城实战(24)】商城性能大揭秘:压力测试与性能监控实战

【商城实战】专栏重磅来袭&#xff01;这是一份专为开发者与电商从业者打造的超详细指南。从项目基础搭建&#xff0c;运用 uniapp、Element Plus、SpringBoot 搭建商城框架&#xff0c;到用户、商品、订单等核心模块开发&#xff0c;再到性能优化、安全加固、多端适配&#xf…...

Linly-Talker:开源数字人框架的技术解析与影响

一、引言&#xff1a;AI 数字人的发展趋势 近年来&#xff0c;数字人&#xff08;Digital Human&#xff09; 技术迅速发展&#xff0c;从最早的 2D 虚拟主播&#xff0c;到如今能够进行实时交互的 3D 智能助手&#xff0c;AI 在多模态交互领域的应用愈发广泛。各大互联网公司…...

【Nexus】Maven 私服搭建以及上传自己的Jar包

Nexus 安装 docker run -d -uroot --name nexus3 --restartalways -p 8081:8081 -v /data/nexus-data/blobs:/nexus-data/blobs -v /etc/localtime:/etc/localtime sonatype/nexus3这里也提供一下docker-composer的方法 .env 文件 VERSIONlatest CONTAINER_NAMECONTAINER_N…...

wlwrap 与 rlwrap 的区别对比:图形显示协议的演变

在 Linux 系统中&#xff0c;许多工具和程序依赖于命令行界面&#xff08;CLI&#xff09;来进行交互&#xff0c;尤其是对于那些没有图形用户界面的应用程序。在这种情况下&#xff0c;命令行编辑、历史记录和自动补全等功能是提升工作效率和用户体验的关键。rlwrap 和 wlwrap…...

矩阵交换行(信息学奥赛一本通-1119)

【题目描述】 给定一个55的矩阵(数学上&#xff0c;一个rc的矩阵是一个由r行c列元素排列成的矩形阵列)&#xff0c;将第n行和第m行交换&#xff0c;输出交换后的结果。 【输入】 输入共6行&#xff0c;前5行为矩阵的每一行元素,元素与元素之间以一个空格分开。 第6行包含两个整…...

CP210x 驱动秘籍:打通 Windows 11 端口的任督二脉

前言 江湖上&#xff0c;众多电脑侠客在安装 Windows 11 时&#xff0c;遭遇“端口失踪案”。原来&#xff0c;这是缺少 CP210x 驱动的“内功心法”。今日&#xff0c;贫道便传授一套独门秘籍&#xff0c;助你打通端口“任督二脉”&#xff0c;让数据流畅如江湖中轻功高手。 …...

IDEA集成git,项目的克隆,远程仓库中文件的添加删除

目录 一、克隆项目 二、使用IDEA完成文件的上传和删除 1.配置git 2.上传 3.删除&#xff08;通过git bash&#xff09; 一、克隆项目 点击克隆&#xff0c;复制url &#xff0c;如下 打开你想要克隆到哪里&#xff0c;右击&#xff0c;选择 open Git Bash here 这一步之后…...

分治构造格雷码

题目描述 格雷码是一种二进制编码方式&#xff0c;其特性是任意两个相邻的码只有一位二进制位不同。给定一个整数 n&#xff0c;表示格雷码的位数&#xff0c;请生成所有 n 位格雷码&#xff0c;并按照格雷码的标准顺序输出。 输入格式 输出样例输入包含一个整数 n&#xff0c…...

区跨链知识和概念

1、以太坊 Geth 源码解析 Geth&#xff08;Go Ethereum&#xff09;是以太坊官方提供的 Go 语言实现的客户端&#xff0c;广泛用于以太坊全节点运行、挖矿、DApp 开发等。理解 Geth 的源码有助于掌握以太坊区块链底层逻辑&#xff0c;如区块同步、EVM 执行、P2P 交互等。 2、…...

C# net deepseek RAG AI开发 全流程 介绍

deepseek本地部署教程及net开发对接 步骤详解&#xff1a;安装教程及net开发对接全流程介绍 DeepSeekRAG 中的 RAG&#xff0c;全称是 Retrieval-Augmented Generation&#xff08;检索增强生成&#xff09;&#xff0c;是一种结合外部知识库检索与大模型生成能力的技术架构。其…...

REST 请求返回 Invalid Credentials

REST 请求返回 “Invalid Credentials”&#xff08;无效凭据&#xff09;&#xff0c;通常表示身份验证失败。可能的原因和解决方案如下&#xff1a; 可能的原因 & 解决方案 用户名或密码错误 确保使用正确的用户名和密码。如果 API 需要 Base64 编码的 Authorization 头…...

方案推介:206页WORD版ERP系统软件投标书整体解决方案

&#xff08;推介资料包含于绑定资源内&#xff09; 该文档是一份 ERP 系统软件投标书&#xff0c;围绕ERP 系统展开&#xff0c;全面阐述了其为机械加工企业提供的整体解决方案、应用价值、行业成功案例及标准功能&#xff0c;旨在助力企业实现信息化管理升级 。 ERP 软件系统…...

WebSocket生命周期和vue中使用

ing。。。晚点更新 进入页面&#xff0c;生命周期挂载后&#xff0c;window监听ws连接online 正常情况&#xff0c;心跳包检测避免断开 非正常情况&#xff0c;ws.onclose断开&#xff0c; 判断1000状态吗&#xff0c;触发重连函数。 定时器&#xff0c;重连&#xff0c;判断…...

RabbitMQ消息持久化与Lazy模式对比分析

RabbitMQ消息持久化与Lazy模式对比分析 在RabbitMQ中&#xff0c;消息持久化与Lazy模式是两种不同的机制&#xff0c;分别针对消息可靠性、存储优化等不同维度设计。以下从六个层面进行深度对比&#xff1a; 一、核心目标与作用对象差异 维度消息持久化&#xff08;delivery_…...

Springboot中的异常处理

ControllerAdvice虽然只是在处理Controller注解的类&#xff0c;在Service层抛出的异常如果没有在Service层被处理的话&#xff0c;会向上抛出到到Controller层&#xff0c;再被异常处理器捕获 1. 全局异常处理 ControllerAdvice&#xff1a;全局处理器&#xff0c;处理有Con…...

深入解析Go语言Channel:源码剖析与并发读写机制

文章目录 Channel的内部结构Channel的创建过程有缓冲Channel的并发读写机制同时读写的可能性发送操作的实现接收操作的实现 并发读写的核心机制解析互斥锁保护环形缓冲区等待队列直接传递优化Goroutine调度 实例分析&#xff1a;有缓冲Channel的并发读写性能优化与最佳实践缓冲…...

C++中虚析构函数的作用是什么?为什么基类需要虚析构函数?

C中虚析构函数的作用是什么&#xff1f;为什么基类需要虚析构函数&#xff1f; 在C中&#xff0c;虚析构函数&#xff08;virtual destructor&#xff09;的作用是确保在通过基类指针或引用删除派生类对象时&#xff0c;能够正确调用派生类的析构函数&#xff0c;从而避免资源…...

ClickHouse合并任务与查询延迟专项测试

ClickHouse合并任务与查询延迟专项测试 1. 测试目的 验证周期性高延迟&#xff08;~900ms&#xff09;是否由后台合并任务&#xff08;Merge&#xff09;引起。 2. 测试环境 组件配置ClickHouse版本24.8.3.13服务器硬件8核CPU / 32GB内存 / NVMe SSD测试表log_test 3. 测试…...

3.14学习总结

今天完成了几道关于二叉树的算法题 关于二叉树的最小最大深度和数据流中的第k大元素&#xff0c;用到优先队列&#xff0c;学习了有关java的基础知识&#xff0c;学习了双指针法。...

OpenHarmony自定义子系统、部件与模块

如图所示&#xff0c;OpenHarmony系统源码中&#xff0c;大体上按照不同种类的功能分成多个子系统&#xff0c;然后一个子系统内部进一步在同类功能上的差异性划分成一个或多个部件&#xff0c;也就是说一个部件表示一个具体功能的源码集合。最后一个部件的源码再划分成一个或多…...

PPT 相关资料介绍

文章目录 一、iSlide 工具二、免费 PPT 模板下载三、Kimi 一键生成 PPT 一、iSlide 工具 iSlide 官网 二、免费 PPT 模板下载 7个完全免费的PPT模板下载网站 优品PPT 第一PPT 三、Kimi 一键生成 PPT ☆...

C# 发送邮件 报错:此请求已被阻止,因为当用在 GET 请求中时,会将敏感信息透漏给第三方网站。

C# 发送邮件 报错&#xff1a;此请求已被阻止&#xff0c;因为当用在 GET 请求中时&#xff0c;会将敏感信息透漏给第三方网站。 报错信息分析 当你遇到如下报错时&#xff1a; 此请求已被阻止&#xff0c;因为当用在 GET 请求中时&#xff0c;会将敏感信息透漏给第三方网站。…...

大数据-spark3.5安装部署之standalone模式

真实工作中还是要将应用提交到集群中去执行&#xff0c;Standalone模式就是使用Spark自身节点运行的集群模式&#xff0c;体现了经典的master-slave模式。集群共三台机器&#xff0c;具体如下 u22server4spark&#xff1a; master worker u22server4spark2&#xff1a; worke…...

接口自动化入门 —— Jmeter实现在接口工具中关联接口处理方案

1. JMeter 接口关联处理的核心概念 接口关联是指在多个接口请求之间共享数据&#xff0c;例如将一个接口的返回值作为另一个接口的输入参数。常见的场景包括&#xff1a; 使用登录接口返回的 Token 作为后续接口的认证信息。 将一个接口返回的 ID 作为另一个接口的请求参数。…...

WebForms HTML:深入理解与高效运用

WebForms HTML&#xff1a;深入理解与高效运用 引言 随着互联网技术的飞速发展&#xff0c;WebForms HTML作为Web开发中的一种重要技术&#xff0c;已经成为了许多开发者日常工作中不可或缺的一部分。本文将深入探讨WebForms HTML的原理、应用场景以及高效运用技巧&#xff0…...

VSCode 搭建C++编程环境 2025新版图文安装教程(100%搭建成功,VSCode安装+C++环境搭建+运行测试+背景图设置)

名人说&#xff1a;博观而约取&#xff0c;厚积而薄发。——苏轼《稼说送张琥》 创作者&#xff1a;Code_流苏(CSDN)&#xff08;一个喜欢古诗词和编程的Coder&#x1f60a;&#xff09; 目录 一、VScode下载及安装二、安装 MinGW-w64 工具链三、Windows环境变量配置四、检查 M…...

【Linux 内核 | 操作系统 | 内核编译】内核编译中与锁调试相关的设置有哪一些?内核 Debug 选项中 LockDep 和其他锁调试选项详解

​问题描述&#xff1a; 我在看内核锁调试的信息时&#xff0c;看到了一些内核编译参数相关的设置&#xff0c;开启这些信息可以帮助我们在测试环境中调试锁的竞争情况&#xff0c;可以详细的打印出来一些线程持有锁&#xff0c;一些线程争抢锁的信息。 以下是我的配置&#…...

LinuX---Shell---变量

系统预定义变量 常用系统变量 PATH、HOME、PWD、SHELL、USER等 获取变量的值 语法&#xff1a;$变量名 $和变量名之间不能有空格。 案例实操 查看系统变量的值 fengubuntu:~$ echo $PATH /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/u…...

深入理解Spring MVC:构建灵活的Web应用

大家好&#xff01;今天我们来聊聊Spring框架中的一个重要模块——Spring MVC。Spring MVC是一个基于MVC&#xff08;Model-View-Controller&#xff09;架构的Web框架&#xff0c;它提供了强大的功能来处理HTTP请求、生成动态内容以及管理Web应用程序的流程。无论是构建RESTfu…...

详解SQL数据查询功能

数据查询 一、 单表查询1. 选择表中的若干列2. 选择表中的若干元组3. ORDER BY 子句4. 聚合函数5. GROUP BY 子句6. LIMIT 子句综合示例&#xff1a; 二、 多表查询1. 等值连接查询 (Equi-Join)2. 非等值连接查询 (Non-Equi Join)3. 自然连接查询 (Natural Join)4. 复合条件连接…...

ArcGIS Pro 车牌分区数据处理与地图制作全攻略

在大数据时代&#xff0c;地理信息系统&#xff08;GIS&#xff09;技术在各个领域都有着广泛的应用&#xff0c;而 ArcGIS Pro 作为一款功能强大的 GIS 软件&#xff0c;为数据处理和地图制作提供了丰富的工具和便捷的操作流程。 车牌数据作为一种重要的地理空间数据&#xf…...

Git 本地常见快捷操作

Git 本地常见快捷操作 &#x1f4cc; 1. 基本操作 操作命令初始化 Git 仓库git init查看 Git 状态git status添加所有文件到暂存区git add .添加指定文件git add <file>提交更改git commit -m "提交信息"修改最后一次提交信息git commit --amend -m "新…...

大视频背景暗黑风格的wordpress企业主题免费下载

整体风格是黑色的&#xff0c;首页首屏大视频背景&#xff0c;动态效果非常好。向下滚动时&#xff0c;滚动的特效也不错。 原文 https://www.bixugao.com/wp/26.html...

Apache Tomcat漏洞,对其进行升级

我们付出一些成本&#xff0c;时间的或者其他&#xff0c;最终总能收获一些什么。 升级背景&#xff1a; 近日&#xff0c;新华三盾山实验室监测到 Apache 官方修复了一个远程代码执行漏洞 (CVE-2025-24813) &#xff0c;其CVSS3 漏洞评分为 7.5 。 影响范围 9.0.0.M1 ≤…...

fs的proxy_media模式失效

概述 freeswitch是一款简单好用的VOIP开源软交换平台。 在fs的使用过程中&#xff0c;某些场景只需要对rtp媒体做透传&#xff0c;又不需要任何处理。 在fs1.6的版本中&#xff0c;我们可以使用proxy_media来代理媒体的转发&#xff0c;媒体的协商由AB路端对端处理&#xff…...

Spring Boot与Apache Ignite集成:构建高性能分布式缓存和计算平台

1. 前言 1.1 什么是Apache Ignite Apache Ignite是一个高性能的分布式内存计算平台,支持内存缓存、分布式计算、流处理和机器学习等功能。它提供了低延迟的数据访问和强大的计算能力,适用于需要高性能和可扩展性的应用。 1.2 为什么选择Apache Ignite 高性能:Ignite利用内…...

深度学习优化-Gradient Checkpointing

数学原理参考&#xff1a; 梯度检查点技术&#xff08;Gradient Checkpointing&#xff09;详细介绍&#xff1a;中英双语-CSDN博客 视频讲解参考&#xff1a; 用梯度检查点来节省显存 gradient checkpointing_哔哩哔哩_bilibili Gradient Checkpointing&#xff08;梯度检查…...

Linux内核实时机制19 - RT调度器3 - 实时任务出入队

Linux内核实时机制19 - RT调度器3 - 实时任务出入队 1、enqueue_task_rt和dequeue_task_rt都会调用dequeue_rt_stack接口&#xff0c; 当请求的rt_se对应的是任务组时&#xff0c;会从顶部到请求的rt_se将调度实体出列。 2、任务添加到rt运行队列时&#xff0c; 如果存在多个…...

CRM企业客户关系管理系统产品原型方案

客户关系管理系统&#xff08;CRM&#xff09;是企业产品应用中的典范&#xff0c;旨在通过信息技术和互联网技术提升企业核心竞争力&#xff0c;优化企业与顾客在销售、营销和服务方面的互动。本作品提供了一套通用型的CRM系统原型模板&#xff0c;涵盖数据管理、审批流程、统…...

HashMap ,HashTable , ConcurrentHashMap 面试

双列集合 HashMap 线程不安全的 HashMap 允许键和值为 null。不过要留意&#xff0c;HashMap 并非线程安全的&#xff0c;在多线程环境下使用可能会出现问题。 数组链表红黑树 jdk1.8 双列集合 存储keyvalue 底层数组的形式存在,初始值 为16 也可以在new HashMap…...

PyTorch 系列教程:探索自然语言处理应用

本文旨在介绍如何使用PyTorch进行自然语言处理&#xff08;NLP&#xff09;的基础知识&#xff0c;包括必要的库、概念以及实际代码示例。通过阅读本文&#xff0c;您将能够开始您的NLP之旅。 1. 理解PyTorch PyTorch是一个开源的机器学习库&#xff0c;基于Torch库&#xff0…...

【操作系统安全】任务2:用户与用户组

目录 一、用户与用户组介绍 1.1 用户 1.2 用户组 1.3 用户与用户组的关系 二、用户与用户组管理 2.1 用户管理 2.1.1 创建用户 2.1.2 设置用户密码 2.1.3 删除用户 2.2 用户组管理 2.2.1 创建用户组 2.2.2 删除用户组 2.2.3 将用户添加到用户组 三、影子账户创建…...

DeepSeek技术解析:MoE架构实现与代码实战

以下是一篇结合DeepSeek技术解析与代码示例的技术文章&#xff0c;重点展示其核心算法实现与落地应用&#xff1a; DeepSeek技术解析&#xff1a;MoE架构实现与代码实战 作为中国AI领域的创新代表&#xff0c;DeepSeek在混合专家模型&#xff08;Mixture of Experts, MoE&…...

LLM对齐方法作用:主要解决大型语言模型(LLMs)输出与人类价值观、需求和安全规范不一致的问题

LLM对齐方法作用:主要解决大型语言模型(LLMs)输出与人类价值观、需求和安全规范不一致的问题 对齐方法(Alignment Methods) 主要解决大型语言模型(LLMs)输出与人类价值观、需求和安全规范不一致的问题。其核心目标是让模型生成的内容更符合人类预期,同时确保伦理合规性…...

【SpringMVC】常用注解:@RequestBody

1.作用 用于获取请求实体内容&#xff0c;直接使用得到的是keyvalue&keyvalue的数据。获取请求实体内容不适用get请求。 2.属性 required 描述是否有请求体&#xff0c;默认值为true。当取值为true时&#xff0c;get 请求方式会报错。如果取值为false&#xff0c;get请…...

brpc中的doublyBufferedData解析

double buffer解析&#xff08;附brpc改进版&#xff09; 双buffer是一个工程中常见的解决读写问题的结构。指的是读只读buff&#xff0c;写操作发生在写buff上。当写buff写完之后switch两个buff&#xff0c;然后写进程擦除原来的读数据&#xff0c;更新为最新的数据。 我们有…...

基于Android的记事本APP设计与实现:从需求分析到功能实现(超级简单记事本,附源码+文档报告)

基于Android的记事本APP设计与实现&#xff1a;从需求分析到功能实现 &#xff08;以前大学课堂作业&#xff0c;抄在这里当个回忆吧&#xff09; 引言 随着社会的不断进步&#xff0c;信息化建设不断发展&#xff0c;电子文字输入在生活、学习、工作中占有越来越重要的作用…...

Linux 部署 Spring Boot 项目, Web项目(2025版)

Linux 部署 Spring Boot 项目&#xff0c;Web项目&#xff08;2025版&#xff09; 一、简洁版1.1 Linux 环境配置1.2 将Spring Boot 项目部署到 Linux 中 二、详细版2.1 Linux 环境配置2.2 Spring Boot 项目搭建2.3 mysql 配置2.4 测试项目2.5 将Spring Boot 项目部署到 Linux …...

泛目录技术:智能缓存提升网站速度与稳定性

泛目录技术&#xff1a;智能缓存提升网站速度与稳定性 在现代网站运营中&#xff0c;速度和稳定性是用户体验和SEO优化的关键因素。2025奥顺互联推出的泛目录技术&#xff0c;通过智能缓存机制&#xff0c;为网站提供了卓越的性能提升和稳定性保障。本文将深入探讨该技术的特点…...

CNN SSP, ASPP, PPM 分割任务经典尺度聚合模块

SSP&#xff1a;Spatial Pyramid Pooling 让任意大小图像最终输出的特征维度始终固定&#xff0c;便于接全链接层。 4x4, 2x2,1x1区域的maxpooling&#xff0c;让任意大小图像最终输出最终特征维度始终为 &#xff08;1641)*256 ASSP:Atrous Spatial Pyramid Pooling 不进行…...