【商城实战(94)】构建高并发的负载均衡与集群架构
【商城实战】专栏重磅来袭!这是一份专为开发者与电商从业者打造的超详细指南。从项目基础搭建,运用 uniapp、Element Plus、SpringBoot 搭建商城框架,到用户、商品、订单等核心模块开发,再到性能优化、安全加固、多端适配,乃至运营推广策略,102 章内容层层递进。无论是想深入钻研技术细节,还是探寻商城运营之道,本专栏都能提供从 0 到 1 的系统讲解,助力你打造独具竞争力的电商平台,开启电商实战之旅。
目录
- 一、引言
- 二、配置负载均衡器(以 Nginx 为例)
- 2.1 准备后端服务器
- 2.2 安装和配置 Nginx
- 2.3 配置负载均衡
- 2.4 配置示例
- 三、搭建后端服务器集群
- 3.1 服务器环境准备
- 3.2 部署 SpringBoot 应用
- 3.3 数据库连接配置(Mybatis-plus)
- 3.4 集群环境测试
- 四、实现负载均衡算法动态调整
- 4.1 常见负载均衡算法介绍
- 4.2 Nginx 中负载均衡算法配置
- 4.3 动态调整实现思路
- 五、前端与后端交互示例
- 5.1 Uniapp(移动前端)请求示例
- 5.2 Element Plus(PC 前端)请求示例
- 5.3 SpringBoot 后端接收请求处理示例
- 六、总结与展望
一、引言
在当今电商业务迅猛发展的时代,商城系统面临着日益增长的用户访问量和业务交易量。为了确保商城系统能够稳定、高效地运行,负载均衡与集群技术的应用变得至关重要。负载均衡技术能够将用户请求均匀地分发到多个后端服务器,避免单个服务器负载过高,从而提升系统的整体性能和可用性;而集群技术则通过将多个服务器组成一个集群,共同承担业务处理任务,极大地提高了系统的并发处理能力。在本商城实战项目中,我们采用 Nginx 作为负载均衡器,结合 Spring Boot 搭建后端服务器集群,并实现负载均衡算法的动态调整,以满足商城系统高并发、高性能的需求。下面将详细介绍其配置和实现过程。
二、配置负载均衡器(以 Nginx 为例)
2.1 准备后端服务器
我们使用 Spring Boot 搭建后端服务器。假设已经创建好了 Spring Boot 项目,并添加了 MyBatis-Plus、Spring Web 等相关依赖。在application.yml文件中配置端口号,例如:
server:port: 8080 # 后端服务器1端口,可根据实际情况修改
在pom.xml文件中,相关依赖配置如下:
<dependencies><!-- Spring Boot Starter --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId></dependency><!-- Spring Boot Web Starter --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!-- MyBatis-Plus Starter --><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>最新版本号</version></dependency><!-- 数据库连接依赖,根据实际数据库选择 --><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><scope>runtime</scope></dependency>
</dependencies>
后端服务器的控制器示例代码(以商品查询接口为例):
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.example.demo.entity.Product;
import com.example.demo.service.ProductService;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import javax.annotation.Resource;
import java.util.List;@RestController
@RequestMapping("/product")
public class ProductController {@Resourceprivate ProductService productService;@GetMapping("/list")public List<Product> productList() {QueryWrapper<Product> queryWrapper = new QueryWrapper<>();return productService.list(queryWrapper);}
}
同样的方式,再创建一个后端服务器实例,修改application.yml中的端口号为8081 ,启动两个后端 Spring Boot 服务器。
2.2 安装和配置 Nginx
不同系统安装 Nginx 的方式略有不同:
- Windows 系统:从 Nginx 官网(http://nginx.org/en/download.html )下载适合 Windows 系统的 Nginx 版本,一般是一个压缩包文件(如 nginx-1.XX.X.zip)。解压压缩包到指定目录,例如C:\nginx。
- Linux 系统(以 Ubuntu 为例):打开终端,执行以下命令更新软件包列表并安装 Nginx:
sudo apt-get update
sudo apt-get install nginx
- macOS 系统:采用 Homebrew 安装方式,在终端执行:
brew install nginx
安装完成后,Nginx 的配置文件一般位于conf目录下,主配置文件是nginx.conf。其基本结构如下:
# 全局配置
user nginx;
worker_processes auto;# 事件模块配置
events {worker_connections 1024;
}# HTTP模块配置
http {include mime.types;default_type application/octet-stream;# 日志格式定义log_format main '$remote_addr - $remote_user [$time_local] "$request" ''$status $body_bytes_sent "$http_referer" ''"$http_user_agent" "$http_x_forwarded_for"';access_log logs/access.log main;sendfile on;tcp_nopush on;tcp_nodelay on;keepalive_timeout 65;# 负载均衡配置upstream backend_servers {# 这里配置后端服务器列表}# 服务器配置server {listen 80;server_name localhost;location / {proxy_pass http://backend_servers;proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;proxy_set_header X-Forwarded-Proto $scheme;}}
}
2.3 配置负载均衡
在 Nginx 的配置文件中,找到upstream块,定义后端服务器组。例如:
upstream backend_servers {server 127.0.0.1:8080; # 后端服务器1地址和端口server 127.0.0.1:8081; # 后端服务器2地址和端口
}
在server块中的location块,使用proxy_pass指令将请求转发到upstream定义的后端服务器组:
server {listen 80;server_name localhost;location / {proxy_pass http://backend_servers;proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;proxy_set_header X-Forwarded-Proto $scheme;}
}
2.4 配置示例
完整的 Nginx 配置文件示例如下:
# 全局配置
user nginx;
worker_processes auto;# 事件模块配置
events {worker_connections 1024;
}# HTTP模块配置
http {include mime.types;default_type application/octet-stream;# 日志格式定义log_format main '$remote_addr - $remote_user [$time_local] "$request" ''$status $body_bytes_sent "$http_referer" ''"$http_user_agent" "$http_x_forwarded_for"';access_log logs/access.log main;sendfile on;tcp_nopush on;tcp_nodelay on;keepalive_timeout 65;# 负载均衡配置upstream backend_servers {server 127.0.0.1:8080 weight=1; # 权重为1,可根据服务器性能调整server 127.0.0.1:8081 weight=1;}# 服务器配置server {listen 80;server_name localhost;location / {proxy_pass http://backend_servers;proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;proxy_set_header X-Forwarded-Proto $scheme;}}
}
上述配置中,upstream块定义了名为backend_servers的后端服务器组,包含两个后端 Spring Boot 服务器。server块监听 80 端口,当接收到请求时,通过proxy_pass将请求转发到backend_servers组中的服务器。proxy_set_header指令用于设置转发请求时的头部信息,确保后端服务器能够正确处理请求。
三、搭建后端服务器集群
3.1 服务器环境准备
- 硬件要求:根据商城系统的预估并发量和业务规模,选择合适配置的服务器。一般建议每台服务器至少具备 2 核 CPU、4GB 内存、50GB 以上的磁盘空间。如果并发量较高,可适当提升配置,如采用 4 核 CPU、8GB 内存及更大的磁盘空间。
- 操作系统:推荐使用 Linux 系统,如 CentOS 7 或 Ubuntu 18.04。Linux 系统具有稳定性高、开源、安全等优点,并且对 Java 应用的支持良好。
- JDK 安装:在每台服务器上安装 Java Development Kit(JDK),版本建议使用 JDK 11 或更高版本。以 CentOS 7 为例,安装步骤如下:
-
- 下载 JDK 安装包,可从 Oracle 官网下载对应版本的压缩包,如jdk-11.0.11_linux-x64_bin.tar.gz 。
-
- 将安装包上传至服务器,解压安装包到指定目录,例如/usr/local/jdk11:
tar -zxvf jdk-11.0.11_linux-x64_bin.tar.gz -C /usr/local/jdk11
-
- 配置环境变量,编辑/etc/profile文件,在文件末尾添加以下内容:
export JAVA_HOME=/usr/local/jdk11
export PATH=$JAVA_HOME/bin:$PATH
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
-
- 使环境变量生效:
source /etc/profile
验证 JDK 是否安装成功,执行java -version命令,若能正确输出版本信息,则安装成功。
3.2 部署 SpringBoot 应用
- 打包 Spring Boot 应用:在项目根目录下,使用 Maven 命令进行打包。在命令行中执行:
mvn clean package
打包完成后,在target目录下会生成一个可执行的 JAR 文件,如demo-0.0.1-SNAPSHOT.jar 。
- 上传 JAR 文件到服务器:使用工具如scp将打包好的 JAR 文件上传到服务器的指定目录,例如/data/apps 。假设本地 JAR 文件路径为/Users/yourname/Projects/demo/target/demo-0.0.1-SNAPSHOT.jar,服务器 IP 为192.168.1.100,上传命令如下:
scp /Users/yourname/Projects/demo/target/demo-0.0.1-SNAPSHOT.jar root@192.168.1.100:/data/apps
- 启动 Spring Boot 应用:在服务器上,进入 JAR 文件所在目录,执行启动命令:
cd /data/apps
nohup java -jar demo-0.0.1-SNAPSHOT.jar &
nohup命令用于在后台运行程序,即使终端关闭也不会影响程序运行;&符号表示将程序放入后台执行 。执行该命令后,应用将在后台启动,日志输出到nohup.out文件中。可以通过查看该文件来了解应用启动情况和运行日志:
tail -f nohup.out
3.3 数据库连接配置(Mybatis-plus)
在 Spring Boot 项目的application.yml文件中配置 MyBatis-plus 连接数据库的信息,示例如下:
spring:datasource:driver - class - name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://localhost:3306/mall_db?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8username: rootpassword: 123456
mybatis - plus:mapper - locations: classpath:/mapper/*.xml # 如果有xml映射文件,指定其位置type - aliases - package: com.example.demo.entity # 实体类所在包
上述配置中,spring.datasource部分配置了数据库连接的基本信息,包括驱动类、URL、用户名和密码;mybatis - plus部分配置了 MyBatis - plus 的相关参数,如映射文件位置和实体类别名包。
3.4 集群环境测试
- 使用压力测试工具:选择一款压力测试工具,如 JMeter。JMeter 是一款开源的性能测试工具,功能强大,支持多种协议的测试。
- 配置 JMeter 测试计划:
- 打开 JMeter,新建一个测试计划。
- 添加线程组,设置线程数(模拟并发用户数)、Ramp - Up 时间(线程启动的时间间隔)、循环次数等参数。例如,设置线程数为 100,Ramp - Up 时间为 10 秒,循环次数为 10,表示在 10 秒内启动 100 个线程,每个线程循环执行 10 次请求。
- 添加 HTTP 请求默认值,设置服务器地址为 Nginx 服务器的地址和端口(如http://localhost)。
- 添加 HTTP 请求,设置请求路径为商城系统的接口路径,如/product/list。
- 添加监听器,如聚合报告,用于查看测试结果统计信息。
- 执行测试:点击 JMeter 的启动按钮,开始执行测试。在测试过程中,可以观察 JMeter 的监听器输出,查看各项性能指标,如平均响应时间、吞吐量、错误率等。如果集群环境配置正确,随着并发请求的增加,请求应该能够被均匀地分发到各个后端服务器,系统能够稳定地处理请求,各项性能指标保持在合理范围内。如果出现错误或性能问题,需要检查服务器日志、Nginx 配置、数据库连接等,排查问题并进行相应的调整 。例如,如果发现某个服务器的负载过高,可能需要调整 Nginx 的负载均衡算法或增加后端服务器的数量;如果出现数据库连接错误,需要检查数据库配置和数据库服务器的运行状态 。通过不断地测试和优化,确保集群环境能够满足商城系统的高并发需求。
四、实现负载均衡算法动态调整
4.1 常见负载均衡算法介绍
- 轮询算法(Round Robin):原理是将请求按顺序轮流分配给后端服务器,比如有三个后端服务器 A、B、C,请求依次分配为 A→B→C→A→B→C……。其优点是实现简单,在服务器性能相近时能公平分配请求 ;缺点是无法感知服务器的实际负载差异,可能导致性能较差的服务器过载,且不支持动态调整权重。
- 加权轮询(Weighted Round Robin):在轮询基础上,为每个服务器分配权重,权重高的服务器接收更多请求。假设服务器 A 权重为 3,服务器 B 权重为 1,那么每 4 个请求中,服务器 A 会接收 3 个,服务器 B 接收 1 个。优点是能根据服务器性能差异灵活分配流量,适用于异构服务器环境;缺点是权重需预先静态配置,无法动态适应负载变化,长时间运行可能导致低权重服务器闲置。
- 最少连接数(Least Connections):优先将请求分配给当前连接数最少的服务器。当有新请求到来时,负载均衡器检查各服务器的连接数,将请求分配给连接数最少的服务器。例如,服务器 A 连接数为 5,服务器 B 连接数为 3,新请求会被分配到服务器 B。该算法的优点是能动态感知服务器负载,自动平衡流量,适合处理长连接或请求处理时间差异大的场景;缺点是需要实时监控服务器连接数,增加系统开销,不适用于短连接或请求处理时间均匀的场景。
- IP 哈希(IP Hash):根据客户端 IP 地址计算哈希值,然后根据哈希值将请求分配到相应的服务器。比如客户端 IP 为 192.168.1.100,经过哈希计算后得到一个值,该值对应到后端服务器列表中的某台服务器,后续来自该 IP 的请求都会被分配到这台服务器。其优点是可以实现会话保持,确保同一客户端的所有请求都分配到同一台后端服务器;缺点是如果某台服务器宕机,负载均衡器需要重新计算哈希值,将请求分配到其他服务器,可能会影响会话连续性,并且无法保证服务器负载的均衡分配。
4.2 Nginx 中负载均衡算法配置
在 Nginx 中配置不同的负载均衡算法,只需在upstream块中进行相应设置:
- 轮询算法:默认使用,无需额外配置。例如:
upstream backend_servers {server 127.0.0.1:8080;server 127.0.0.1:8081;
}
- 加权轮询算法:通过weight参数设置服务器权重。示例如下:
upstream backend_servers {server 127.0.0.1:8080 weight=2;server 127.0.0.1:8081 weight=1;
}
上述配置中,服务器127.0.0.1:8080的权重为 2,127.0.0.1:8081的权重为 1,意味着在请求分配时,127.0.0.1:8080接收的请求数量大约是127.0.0.1:8081的两倍。
- 最少连接数算法:使用least_conn指令。配置如下:
upstream backend_servers {least_conn;server 127.0.0.1:8080;server 127.0.0.1:8081;
}
- IP 哈希算法:通过ip_hash指令配置。示例:
upstream backend_servers {ip_hash;server 127.0.0.1:8080;server 127.0.0.1:8081;
}
4.3 动态调整实现思路
为了实现根据服务器负载情况动态调整负载均衡算法,可以按照以下思路进行:
- 服务器负载监控:利用工具如 Prometheus 和 Grafana,实时监控服务器的 CPU 使用率、内存使用率、并发连接数等指标。以监控 CPU 使用率为例,在服务器上安装 Prometheus 的 Node Exporter,它会收集服务器的各种指标数据。配置 Prometheus 服务器,使其能够抓取 Node Exporter 暴露的数据。然后在 Grafana 中配置数据源为 Prometheus,创建仪表盘来展示 CPU 使用率等指标的实时数据。
- 动态调整脚本:编写脚本(如 Python 脚本)来读取监控数据,并根据预设的规则判断是否需要调整负载均衡算法。假设设定当某台服务器的 CPU 使用率连续 5 分钟超过 80% 时,调整负载均衡算法。Python 脚本使用相关库(如requests库用于获取监控数据,paramiko库用于远程修改 Nginx 配置文件)实现该逻辑。例如:
import requests
import paramiko
import time# 获取服务器负载数据,这里以CPU使用率为例
def get_cpu_usage(server_ip):# 假设Prometheus地址为http://prometheus-server:9090url = f"http://prometheus-server:9090/api/v1/query?query=100 - (avg(irate(node_cpu_seconds_total{{mode='idle',instance='{server_ip}:9100'}}[5m])) * 100)"response = requests.get(url)data = response.json()if data["status"] == "success":result = data["data"]["result"]if result:cpu_usage = float(result[0]["value"][1])return cpu_usagereturn None# 修改Nginx配置文件,调整负载均衡算法
def modify_nginx_config(server_ip, new_algorithm):ssh = paramiko.SSHClient()ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())ssh.connect(server_ip, username='root', password='your_password')# 备份原配置文件ssh.exec_command('cp /etc/nginx/nginx.conf /etc/nginx/nginx.conf.bak')# 读取原配置文件内容sftp = ssh.open_sftp()with sftp.open('/etc/nginx/nginx.conf', 'r') as f:lines = f.readlines()# 找到upstream块,修改负载均衡算法new_lines = []upstream_start = Falsefor line in lines:if 'upstream' in line:upstream_start = Truenew_lines.append(line)new_lines.append(f' {new_algorithm};\n')elif '}' in line and upstream_start:upstream_start = Falsenew_lines.append(line)elif not upstream_start:new_lines.append(line)# 写入新的配置文件内容with sftp.open('/etc/nginx/nginx.conf', 'w') as f:f.writelines(new_lines)sftp.close()ssh.close()# 主逻辑
def main():server_ips = ['192.168.1.100', '192.168.1.101'] # 后端服务器IP列表while True:for ip in server_ips:cpu_usage = get_cpu_usage(ip)if cpu_usage:print(f"Server {ip} CPU usage: {cpu_usage}%")if cpu_usage > 80:modify_nginx_config(ip, 'least_conn')print(f"Modified Nginx config for {ip} to use least_conn algorithm")time.sleep(60) # 每隔60秒检查一次if __name__ == "__main__":main()
- 重新加载 Nginx 配置:在修改 Nginx 配置文件后,通过命令nginx -s reload使新的配置生效。可以在脚本中使用subprocess模块调用该命令,确保配置修改后 Nginx 能够及时应用新的负载均衡算法 。例如在 Python 脚本中:
import subprocesssubprocess.run(['nginx', '-s','reload'])
通过以上步骤,可以实现根据服务器负载情况动态调整 Nginx 的负载均衡算法,确保商城系统在不同负载情况下都能保持良好的性能和稳定性。
五、前端与后端交互示例
5.1 Uniapp(移动前端)请求示例
在 Uniapp 中,使用uni.request方法向负载均衡器(Nginx)发送请求。假设要请求商品列表接口,代码示例如下:
<template><view><button @click="getProductList">获取商品列表</button><view v-for="(product, index) in productList" :key="index">{{ product.name }} - {{ product.price }}</view></view>
</template><script>
export default {data() {return {productList: []};},methods: {getProductList() {uni.request({url: 'http://localhost/product/list', // Nginx地址和接口路径method: 'GET',success: (res) => {if (res.statusCode === 200) {this.productList = res.data;}},fail: (err) => {console.error('请求失败:', err);}});}}
};
</script>
上述代码中,点击按钮时调用getProductList方法,通过uni.request发送 GET 请求到http://localhost/product/list,这是 Nginx 监听的地址,Nginx 会将请求转发到后端服务器集群中的某台服务器 。请求成功后,将返回的商品数据赋值给productList并展示在页面上。
5.2 Element Plus(PC 前端)请求示例
在 Element Plus 项目中,一般使用 Axios 来发送请求。首先安装 Axios:
npm install axios
在main.js中引入并配置 Axios:
import { createApp } from 'vue';
import ElementPlus from 'element-plus';
import 'element-plus/lib/theme-chalk/index.css';
import axios from 'axios';
import App from './App.vue';const app = createApp(App);
app.config.globalProperties.$axios = axios;
app.use(ElementPlus).mount('#app');
在组件中发送请求获取商品列表的示例代码如下:
<template><el-button @click="getProductList">获取商品列表</el-button><el-table :data="productList"><el-table-column prop="name" label="商品名称"></el-table-column><el-table-column prop="price" label="商品价格"></el-table-column></el-table>
</template><script setup>
import { ref } from 'vue';const productList = ref([]);const getProductList = async () => {try {const response = await this.$axios.get('http://localhost/product/list');productList.value = response.data;} catch (error) {console.error('请求失败:', error);}
};
</script>
这里同样是向http://localhost/product/list发送请求,Axios 将请求发送到 Nginx,由 Nginx 进行负载均衡分发,获取商品列表数据并展示在 Element Plus 的表格组件中。
5.3 SpringBoot 后端接收请求处理示例
在 Spring Boot 后端,使用 Controller 层来接收前端请求并处理。以下是商品列表接口的 Controller 代码示例:
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.example.demo.entity.Product;
import com.example.demo.service.ProductService;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import javax.annotation.Resource;
import java.util.List;@RestController
@RequestMapping("/product")
public class ProductController {@Resourceprivate ProductService productService;@GetMapping("/list")public List<Product> productList() {QueryWrapper<Product> queryWrapper = new QueryWrapper<>();return productService.list(queryWrapper);}
}
当 Nginx 将前端请求转发到后端服务器时,Spring Boot 的 DispatcherServlet 会根据请求的 URL 路径找到对应的 Controller 方法进行处理。这里@GetMapping(“/list”)注解表示处理/product/list的 GET 请求,productService.list(queryWrapper)方法从数据库中查询商品列表数据并返回给前端。
六、总结与展望
通过上述负载均衡器的配置、后端服务器集群的搭建以及负载均衡算法的动态调整,商城系统在性能和可用性方面得到了显著提升。负载均衡器 Nginx 有效地将前端请求分发到后端服务器集群,避免了单个服务器的过载,提高了系统的整体吞吐量;后端服务器集群通过多台服务器协同工作,增强了系统的并发处理能力,能够应对大量用户的访问和业务请求 。动态调整负载均衡算法使得系统能够根据服务器的实时负载情况,灵活地分配请求,进一步优化了系统性能。
在未来,随着商城业务的不断发展和用户量的持续增长,可以进一步优化和扩展负载均衡与集群技术:
- 引入更高级的负载均衡技术:例如基于流量预测的负载均衡算法,结合大数据分析和机器学习技术,对商城的流量进行精准预测,提前调整负载均衡策略,以应对流量高峰,如电商大促活动等场景。
- 容器化和云原生技术的应用:将后端服务器应用进行容器化部署,使用 Kubernetes 等容器编排工具进行集群管理,实现更高效的资源管理、自动化部署和弹性伸缩,提高系统的运维效率和灵活性。
- 优化服务器性能监控:进一步完善服务器性能监控体系,不仅监控 CPU、内存等基本指标,还可以深入监控应用程序的性能指标,如接口响应时间、数据库查询效率等,以便更全面地了解系统负载情况,为负载均衡算法的动态调整提供更准确的数据支持。
- 考虑多数据中心的负载均衡:随着业务的全球化拓展,可能需要在多个数据中心之间进行负载均衡,确保不同地区的用户都能获得良好的访问体验,这需要考虑数据中心之间的网络延迟、带宽等因素,实现跨数据中心的高效负载均衡。
通过不断地优化和扩展负载均衡与集群技术,商城系统将能够更好地适应业务发展的需求,为用户提供更加稳定、高效的服务。
相关文章:
【商城实战(94)】构建高并发的负载均衡与集群架构
【商城实战】专栏重磅来袭!这是一份专为开发者与电商从业者打造的超详细指南。从项目基础搭建,运用 uniapp、Element Plus、SpringBoot 搭建商城框架,到用户、商品、订单等核心模块开发,再到性能优化、安全加固、多端适配…...
鸿蒙开发:了解Canvas绘制
前言 本文基于Api13 系统的组件无法满足我们的需求,这种情况下就不得不自己自定义组件,除了自定义组合组件,拓展组件,还有一种方式,那就是完全的自绘制组件,这种情况,常见的场景有,比…...
Ubuntu和Windows实现文件互传
1.开启Ubuntu下的FTP服务: (1)终端输入: sudo apt-get install vsftpd(2)安装完成后: 终端输入: /etc 是 Linux 系统的全局配置文件目录,存储系统和应用程序的配置信息…...
dav_pg8_vacuum
一、VACUUM基础概念 1.1 VACUUM的作用 在PostgreSQL中,当数据被更新或删除时,系统并不会立即释放物理空间,而是将其标记为 “可重用”。 随着时间推移,表中的死元组(已删除或已被新版本覆盖的数据)会越来越…...
革新汽车安全通信技术,美格智能全系车载通信模组支持NG-eCall
根据QYR(恒州博智)的统计及预测,2024年全球汽车无线紧急呼叫(eCall)设备市场销售额达到了25.17亿美元,预计2031年将达到44.97亿美元,年复合增长率(CAGR 2025-2031)为8.8%…...
Ubuntu桌面环境下网络设置选项缺失问题解决
一、问题现象 在Ubuntu桌面环境中,网络设置界面中仅显示VPN设置,未显示常规网络配置选项,导致无法通过图形界面修改网络配置。但通过命令行工具可正常设置网络。 二、解决方案 (一)检查网络设备状态 nmcli d 发现…...
GitHub绑定本地计算机以及仓库创建跟推送指南
GitHub绑定到本地计算机 要在本地计算机上连接到你的GitHub账户,可以通过以下步骤实现: 1. 检查和安装Git 确保你的计算机上已经安装了Git。如果还没有安装,可以从Git官网下载并安装。 2. 配置Git 打开终端(macOS或Linux&…...
【数据结构】导航
【数据结构】-CSDN博客 【数据结构】next数组、nextval数组-CSDN博客...
Java内存中的Heap(堆)的作用
Java内存中的Heap(堆)的作用 在 Java 的内存模型中,Heap(堆) 是 JVM(Java Virtual Machine)管理的运行时数据区域之一,主要用于存储程序运行过程中动态分配的对象和数据。它是 Java…...
Python控制结构详解
前言 一、控制结构概述 二、顺序结构 三、选择结构(分支结构) 1. 单分支 if 2. 双分支 if-else 3. 多分支 if-elif-else 4.实际应用: 四、循环结构 1. for循环 2. while循环 3. 循环控制语句 五、异常处理(try-except)…...
2023第十四届蓝桥杯大赛软件赛国赛C/C++ 大学 B 组(真题题解)(C++/Java题解)
本来想刷省赛题呢,结果一不小心刷成国赛了 真是个小迷糊〒▽〒 但,又如何( •̀ ω •́ )✧ 记录刷题的过程、感悟、题解。 希望能帮到,那些与我一同前行的,来自远方的朋友😉 大纲: 一、子2023-ÿ…...
JVM介绍
JVM类加载器 栈指令重排序 类的JVM内存分配 堆内存GC模型...
HTML输出流
HTML 输出流 JavaScript 中**「直接写入 HTML 输出流」**的核心是通过 document.write() 方法向浏览器渲染过程中的数据流动态插入内容。以下是详细解释: 一、HTML 输出流的概念 1. 动态渲染过程 HTML 文档的加载是自上而下逐行解析的。当浏览器遇到 <script&…...
Kafka 的高可用性
Kafka 的高可用性主要通过副本机制、ISR(In-Sync Replicas)列表和控制器 Broker 来实现。这些机制共同确保了 Kafka 集群在部分节点故障时仍然可以正常运行,数据不会丢失,并且服务不会中断。 1. 副本机制 Kafka 的副本机制是其高…...
Centos7,tar包方式部署rabbitmq-3.7.6
1. 环境准备 安装编译工具和依赖包 yum -y install make gcc gcc-c glibc-devel m4 perl openssl openssl-devel ncurses-devel ncurses-devel xz xmlto perl 2. Erlang环境搭建 版本对应:https://www.rabbitmq.com/docs/which-erlang 解压到指定目录 tar -xv…...
RISC-V AIA学习3---APLIC 第二部分(APLIC 中断域的内存映射控制区域)
每个中断域都有一个专用的内存映射控制区域,用来处理该中断域的中断。 控制区域的大小是 4KB 的倍数,对齐到 4KB 边界。最小的有效控制区域是 16KB。 1. 控制区域的基本结构:部门文件柜 每个中断域就像公司的一个部门,有自己的 …...
顶刊【遥感目标检测】【TGRS】FFCA-YOLO遥感图像小目标检测
FFCA-YOLO for Small Object Detection in Remote Sensing Images FFCA-YOLO遥感图像小目标检测 0.论文摘要 摘要——特征表征不足、背景干扰等问题使得遥感图像中的小目标检测任务极具挑战性。尤其在算法需部署于星载设备进行实时处理时,需在有限计算资源下对精度…...
【人工智能】从 Llama 到 DeepSeek:开源大模型的演进与技术对比
《Python OpenCV从菜鸟到高手》带你进入图像处理与计算机视觉的大门! 解锁Python编程的无限可能:《奇妙的Python》带你漫游代码世界 随着人工智能的迅猛发展,开源大语言模型(LLM)在自然语言处理领域扮演着越来越重要的角色。本文从 Meta 的 Llama 系列开始,追溯开源大模…...
【PCB工艺】时序图(Timing Diagram)
时序图(Timing Diagram)是描述数字电路信号随时间变化的图示,广泛用于分析和设计时序逻辑电路,如锁存器(Latch)、触发器(Flip-Flop)、计数器、状态机等。这篇文章从时序图的原理、构…...
MATLAB 中,并行池(Parallel Pool)自动关闭的情况
在 MATLAB 中,并行池(Parallel Pool)的行为可以通过设置进行控制,但默认情况下,并行池不会自动关闭,除非满足某些条件或显式调用关闭命令。以下是关于并行池自动关闭机制的详细说明: 自动关闭的…...
[网安工具] SQL 注入自动探测工具 —— SQLMAP 使用手册
🌟想了解其它网安工具?看看这个:[网安工具] 网安工具库 —— 工具管理手册 https://github.com/sqlmapproject/sqlmaphttps://github.com/sqlmapproject/sqlmap用法 | sqlmap 用户手册https://sqlmap.highlight.ink/usage 0x01:S…...
Python数据结构与算法-基础预热篇
目录 语言基础 1.内置函数 1.1math库 1.2collections 1.2.1Counter:计数器 1.2.2deque双端对列 1.2.3defaultdict有默认值的字典 1.3heapq堆(完全二叉树) 1.4functool 1.5itertools 1.5.1无限迭代器 1.5.2有限迭代器 1.5.3排列组合迭代器 2.序…...
构建可扩展、可靠的网络抓取、监控和自动化应用程序的终极指南
大家好,这里是架构资源栈!点击上方关注,添加“星标”,一起学习大厂前沿架构! 无论您是企业主、营销人员还是软件开发人员,您都很有可能在某个时候使用过 Web 自动化工具。每个人都希望更聪明地工作…...
【蓝桥杯】重点冲刺
【最高优先级】必考核心算法(占分60%以上) 动态规划(DP) 🌟🌟🌟 背包问题:01背包、完全背包(必须掌握空间优化的一维写法) 线性DP:最长上升子序列(LIS)、最长公共子序列(LCS) 路径问题:网格路径计数(含障碍物)、最小路径和 经典模型:打家劫舍、股票买卖问…...
质量工程师的2025:从“找bug“到“造质量“的职业进化
想象一下,2025年的某天:阅读原文 早晨,AI测试助手已经自动运行了夜间回归测试,并将可疑问题标记出来 你喝着咖啡,通过质量数据看板分析系统健康度 下午的会议上,你正用业务语言向产品经理解释:…...
2025年CNG 汽车加气站操作工题目分享
CNG 汽车加气站操作工题目分享: 单选题 1、CNG 加气站中,加气机的加气软管应( )进行检查。 A. 每天 B. 每周 C. 每月 D. 每季度 答案:A 解析:加气软管是加气操作中频繁使用的部件,每天检…...
【QT5 多线程示例】线程池
线程池 【C并发编程】(九)线程池 QThreadPool 和 QRunnable 是 Qt 提供的线程池管理机制。QRunnable 是一个任务抽象类;定义任务逻辑需要继承QRunnable 并实现 run() 方法。QThreadPool 负责管理线程,并将 QRunnable 任务分配到…...
飞致云荣获“Alibaba Cloud Linux最佳AI镜像服务商”称号
2025年3月24日,阿里云云市场联合龙蜥社区发布“2024年度Alibaba Cloud Linux最佳AI镜像服务商”评选结果。 经过主办方的严格考量,飞致云(即杭州飞致云信息科技有限公司)凭借旗下MaxKB开源知识库问答系统、1Panel开源面板、Halo开…...
FAST-LIVO2 Fast, Direct LiDAR-Inertial-Visual Odometry论文阅读
FAST-LIVO2 Fast, Direct LiDAR-Inertial-Visual Odometry论文阅读 论文下载论文翻译FAST-LIVO2: 快速、直接的LiDAR-惯性-视觉里程计摘要I 引言II 相关工作_直接方法__LiDAR-视觉(-惯性)SLAM_ III 系统概述IV 具有顺序状态更新的误差状态迭代卡尔曼滤波…...
kubesphere 终端shell连不上的问题
使用nginx代理kubesphere控制台会出现容器的终端shell连不上的问题 下面是一个样例配置可以解决这个问题: 注意修改为你的ip地址: upstream k8s { ip_hash; server masterip1:30880; server masterip2:30880; server masterip3:30880; } nginx.conf #…...
无人机,雷达定点飞行时,位置发散,位置很飘,原因分析
参考: 无人车传感器 IMU与GPS数据融合进行定位机制_gps imu 组合定位原始数-CSDN博客 我的无人机使用雷达定位,位置模式很飘 雷达的更新频率也是10HZ, 而px飞控的频率是100HZ,没有对两者之间的频率差异做出处理 所以才导致无人…...
外星人入侵(python设计小游戏)
这个游戏简而言之就是操作一个飞机对前方的飞船进行射击,和一款很久之前的游戏很像,这里是超级低配版那个游戏,先来看看效果图: 由于设计的是全屏的,所以电脑不能截图。。。。 下面的就是你操控的飞船,上面…...
Stereolabs ZED Box Mini:NVIDIA Orin™驱动,双GMSL2输入,智能机器视觉AI新选择”
Stereolabs近日推出了ZED Box Mini,这是一款专为视觉AI设计的紧凑型迷你电脑(ECU)。该产品搭载了NVIDIA Orin™系列处理器,具备强大的AI视觉处理能力,适用于机器人、智能基础设施和工业应用等多种场景。ZED Box Mini以…...
IP协议的介绍
网络层的主要功能是在复杂的网络环境中确定一个合适的路径.网络层的协议主要是IP协议.IP协议头格式如下: 1.4位版本号:指定IP协议的版本,常用的是IPV4,对于IPV4来说,这里的值就是4. 2.4位头部长度,单位也是4个字节,4bit表示的最大数字是15,因此IP头部的最大长度就是60字节 3.…...
【入门初级篇】布局类组件的使用(2)
【入门初级篇】布局类组件的使用(2) 视频要点 (1)2分栏场景介绍与实操演示 (2)3分栏场景介绍与实操演示 点击访问myBuilder产品运营平台 CSDN站内资源下载myBuilder 交流请加微信:MyBuilder8…...
高并发金融系统,“可观测-可追溯-可回滚“的闭环审计体系
一句话总结 在高并发金融系统中,审计方案设计需平衡"观测粒度"与"系统损耗",通过双AOP实现非侵入式采集,三表机制保障操作原子性,最终形成"可观测-可追溯-可回滚"的闭环体系。 业务痛点与需求 在…...
(九)Spring Webflux
底层基于Netty实现的Web容器与请求/响应处理机制 参照:Spring WebFlux :: Spring Frameworkhttps://docs.spring.io/spring-framework/reference/6.0/web/webflux.html 一、组件对比 API功能 Servlet-阻塞式Web WebFlux-响应式Web 前端控制器 DispatcherServl…...
如何在Webpack中配置别名路径?
如何在Webpack中配置别名路径? 文章目录 如何在Webpack中配置别名路径?1. 引言2. 配置别名路径的基本原理3. 如何配置别名路径3.1 基本配置3.2 结合Babel与TypeScript3.2.1 Babel配置3.2.2 TypeScript配置 3.3 适用场景与最佳实践 4. 调试与常见问题4.1 …...
office_word中使用宏以及DeepSeek
前言 Word中可以利用DeepSeek来生成各种宏,从而生成我们需要各种数据和图表,这样可以大大减少我们手工的操作。 1、Office的版本 采用的是微软的office2016,如下图: 2、新建一个Word文档 3、开启开发工具 这样菜单中的“开发工具…...
利用GitHub Pages快速部署前端框架静态网页
文章目录 前言GitHub Pages 来部署前端框架(Vue 3 Vite)项目1、配置 GitHub Pages 部署2、将项目推送到 GitHub3、部署到 GitHub Pages4、访问部署页面5、修改代码后的更新部署顺序 前言 可以先参考: 使用 GitHub Pages 快速部署静态网页: …...
前端性能优化思路_场景题
20 万人同时在直播间打赏,前端优化需要考虑高并发、性能优化、流畅体验等问题,涉及 WebSocket 处理、消息去抖、虚拟列表优化、动画优化、CDN 加速 等多个方面。 WebSocket 高并发优化 (1)使用 WebSocket 替代轮询 轮询…...
45 55跳跃游戏解题记录
先是55跳跃游戏,暴力解法会怎样?会超出时间限制,而且有很多细节要注意: func canJump(nums []int) bool {// 处理空数组情况,当nums只剩一个元素时,nums[i:]导致越界。if len(nums) 0 {return false}// 如…...
一个简单的用C#实现的分布式雪花ID算法
雪花ID是一个依赖时间戳根据算法生成的一个Int64的数字ID,一般用来做主键或者订单号等。以下是一个用C#写的雪花ID的简单实现方法 using System; using System.Collections.Concurrent; using System.Diagnostics;public class SnowflakeIdGenerator {// 配置常量p…...
16个气象数据可视化网站整理分享
好的!以下是关于“16个气象数据可视化网站整理分享”的软文: 16个气象数据可视化网站整理分享 气象数据可视化已成为现代气象研究、决策支持以及公众天气服务的重要组成部分。从天气预报到气候变化监测,全球许多气象数据可视化平台为专业人士…...
一周学会Flask3 Python Web开发-SQLAlchemy数据迁移migrate
锋哥原创的Flask3 Python Web开发 Flask3视频教程: 2025版 Flask3 Python web开发 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili 模型类(表)不是一成不变的,当你添加了新的模型类,或是在模型类中添加了新的字段,甚至是修改…...
[原创](Modern C++)现代C++的关键性概念: 如何利用多维数组的指针安全地遍历所有元素
[作者] 常用网名: 猪头三 出生日期: 1981.XX.XX 企鹅交流: 643439947 个人网站: 80x86汇编小站 编程生涯: 2001年~至今[共24年] 职业生涯: 22年 开发语言: C/C、80x86ASM、Object Pascal、Objective-C、C#、R、Python、PHP、Perl、 开发工具: Visual Studio、Delphi、XCode、C …...
本地化智能运维助手:基于 LangChain 数据增强 和 DeepSeek-R1 的K8s运维文档检索与问答系统 Demo
写在前面 博文内容为基于 LangChain 数据增强 和 Ollams 本地部署 DeepSeek-R1实现 K8s运维文档检索与问答系统 Demo通过 Demo 对 LEDVR 工作流, 语义检索有基本认知理解不足小伙伴帮忙指正 😃,生活加油 我看远山,远山悲悯 持续分享技术干货…...
中间件框架漏洞攻略
中间件(英语:Middleware)是提供系统软件和应⽤软件之间连接的软件,以便于软件各部件之间的沟通。 中间件处在操作系统和更⾼⼀级应⽤程序之间。他充当的功能是:将应⽤程序运⾏环境与操作系统隔离,从⽽实…...
在 Ubuntu 上安装 Docker 的完整指南
1. 卸载旧版本(如有) 在安装新版本前,建议先卸载旧版本: sudo apt remove docker docker-engine docker.io containerd runc 2. 安装依赖包 更新软件包索引并安装必要的依赖: sudo apt update sudo apt install -y ca-certificates curl gnupg lsb-release 3. 添加 Do…...
Another Redis Desktop Manager下载安装使用
🤟致敬读者 🟩感谢阅读🟦笑口常开🟪生日快乐⬛早点睡觉 📘博主相关 🟧博主信息🟨博客首页🟫专栏推荐🟥活动信息 文章目录 Another Redis Desktop Manager下载安装使用…...