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

【商城实战(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 应用

  1. 打包 Spring Boot 应用:在项目根目录下,使用 Maven 命令进行打包。在命令行中执行:
mvn clean package

打包完成后,在target目录下会生成一个可执行的 JAR 文件,如demo-0.0.1-SNAPSHOT.jar 。

  1. 上传 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
  1. 启动 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 集群环境测试

  1. 使用压力测试工具:选择一款压力测试工具,如 JMeter。JMeter 是一款开源的性能测试工具,功能强大,支持多种协议的测试。
  2. 配置 JMeter 测试计划
  • 打开 JMeter,新建一个测试计划。
  • 添加线程组,设置线程数(模拟并发用户数)、Ramp - Up 时间(线程启动的时间间隔)、循环次数等参数。例如,设置线程数为 100,Ramp - Up 时间为 10 秒,循环次数为 10,表示在 10 秒内启动 100 个线程,每个线程循环执行 10 次请求。
  • 添加 HTTP 请求默认值,设置服务器地址为 Nginx 服务器的地址和端口(如http://localhost)。
  • 添加 HTTP 请求,设置请求路径为商城系统的接口路径,如/product/list。
  • 添加监听器,如聚合报告,用于查看测试结果统计信息。
  1. 执行测试:点击 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 动态调整实现思路

为了实现根据服务器负载情况动态调整负载均衡算法,可以按照以下思路进行:

  1. 服务器负载监控:利用工具如 Prometheus 和 Grafana,实时监控服务器的 CPU 使用率、内存使用率、并发连接数等指标。以监控 CPU 使用率为例,在服务器上安装 Prometheus 的 Node Exporter,它会收集服务器的各种指标数据。配置 Prometheus 服务器,使其能够抓取 Node Exporter 暴露的数据。然后在 Grafana 中配置数据源为 Prometheus,创建仪表盘来展示 CPU 使用率等指标的实时数据。
  2. 动态调整脚本:编写脚本(如 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()
  1. 重新加载 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 有效地将前端请求分发到后端服务器集群,避免了单个服务器的过载,提高了系统的整体吞吐量;后端服务器集群通过多台服务器协同工作,增强了系统的并发处理能力,能够应对大量用户的访问和业务请求 。动态调整负载均衡算法使得系统能够根据服务器的实时负载情况,灵活地分配请求,进一步优化了系统性能。

在未来,随着商城业务的不断发展和用户量的持续增长,可以进一步优化和扩展负载均衡与集群技术:

  1. 引入更高级的负载均衡技术:例如基于流量预测的负载均衡算法,结合大数据分析和机器学习技术,对商城的流量进行精准预测,提前调整负载均衡策略,以应对流量高峰,如电商大促活动等场景。
  2. 容器化和云原生技术的应用:将后端服务器应用进行容器化部署,使用 Kubernetes 等容器编排工具进行集群管理,实现更高效的资源管理、自动化部署和弹性伸缩,提高系统的运维效率和灵活性。
  3. 优化服务器性能监控:进一步完善服务器性能监控体系,不仅监控 CPU、内存等基本指标,还可以深入监控应用程序的性能指标,如接口响应时间、数据库查询效率等,以便更全面地了解系统负载情况,为负载均衡算法的动态调整提供更准确的数据支持。
  4. 考虑多数据中心的负载均衡:随着业务的全球化拓展,可能需要在多个数据中心之间进行负载均衡,确保不同地区的用户都能获得良好的访问体验,这需要考虑数据中心之间的网络延迟、带宽等因素,实现跨数据中心的高效负载均衡。

通过不断地优化和扩展负载均衡与集群技术,商城系统将能够更好地适应业务发展的需求,为用户提供更加稳定、高效的服务。

相关文章:

【商城实战(94)】构建高并发的负载均衡与集群架构

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

鸿蒙开发:了解Canvas绘制

前言 本文基于Api13 系统的组件无法满足我们的需求&#xff0c;这种情况下就不得不自己自定义组件&#xff0c;除了自定义组合组件&#xff0c;拓展组件&#xff0c;还有一种方式&#xff0c;那就是完全的自绘制组件&#xff0c;这种情况&#xff0c;常见的场景有&#xff0c;比…...

Ubuntu和Windows实现文件互传

1.开启Ubuntu下的FTP服务&#xff1a; &#xff08;1&#xff09;终端输入&#xff1a; sudo apt-get install vsftpd&#xff08;2&#xff09;安装完成后&#xff1a; 终端输入&#xff1a; /etc 是 Linux 系统的全局配置文件目录&#xff0c;存储系统和应用程序的配置信息…...

dav_pg8_vacuum

一、VACUUM基础概念 1.1 VACUUM的作用 在PostgreSQL中&#xff0c;当数据被更新或删除时&#xff0c;系统并不会立即释放物理空间&#xff0c;而是将其标记为 “可重用”。 随着时间推移&#xff0c;表中的死元组&#xff08;已删除或已被新版本覆盖的数据&#xff09;会越来越…...

革新汽车安全通信技术,美格智能全系车载通信模组支持NG-eCall

根据QYR&#xff08;恒州博智&#xff09;的统计及预测&#xff0c;2024年全球汽车无线紧急呼叫&#xff08;eCall&#xff09;设备市场销售额达到了25.17亿美元&#xff0c;预计2031年将达到44.97亿美元&#xff0c;年复合增长率&#xff08;CAGR 2025-2031&#xff09;为8.8%…...

Ubuntu桌面环境下网络设置选项缺失问题解决

一、问题现象 在Ubuntu桌面环境中&#xff0c;网络设置界面中仅显示VPN设置&#xff0c;未显示常规网络配置选项&#xff0c;导致无法通过图形界面修改网络配置。但通过命令行工具可正常设置网络。 二、解决方案 &#xff08;一&#xff09;检查网络设备状态 nmcli d 发现…...

GitHub绑定本地计算机以及仓库创建跟推送指南

GitHub绑定到本地计算机 要在本地计算机上连接到你的GitHub账户&#xff0c;可以通过以下步骤实现&#xff1a; 1. 检查和安装Git 确保你的计算机上已经安装了Git。如果还没有安装&#xff0c;可以从Git官网下载并安装。 2. 配置Git 打开终端&#xff08;macOS或Linux&…...

【数据结构】导航

【数据结构】-CSDN博客 【数据结构】next数组、nextval数组-CSDN博客...

Java内存中的Heap(堆)的作用

Java内存中的Heap&#xff08;堆&#xff09;的作用 在 Java 的内存模型中&#xff0c;Heap&#xff08;堆&#xff09; 是 JVM&#xff08;Java Virtual Machine&#xff09;管理的运行时数据区域之一&#xff0c;主要用于存储程序运行过程中动态分配的对象和数据。它是 Java…...

Python控制结构详解

前言 一、控制结构概述 二、顺序结构 三、选择结构&#xff08;分支结构&#xff09; 1. 单分支 if 2. 双分支 if-else 3. 多分支 if-elif-else 4.实际应用: 四、循环结构 1. for循环 2. while循环 3. 循环控制语句 五、异常处理&#xff08;try-except&#xff09…...

2023第十四届蓝桥杯大赛软件赛国赛C/C++ 大学 B 组(真题题解)(C++/Java题解)

本来想刷省赛题呢&#xff0c;结果一不小心刷成国赛了 真是个小迷糊〒▽〒 但&#xff0c;又如何( •̀ ω •́ )✧ 记录刷题的过程、感悟、题解。 希望能帮到&#xff0c;那些与我一同前行的&#xff0c;来自远方的朋友&#x1f609; 大纲&#xff1a; 一、子2023-&#xff…...

JVM介绍

JVM类加载器 栈指令重排序 类的JVM内存分配 堆内存GC模型...

HTML输出流

HTML 输出流 JavaScript 中**「直接写入 HTML 输出流」**的核心是通过 document.write() 方法向浏览器渲染过程中的数据流动态插入内容。以下是详细解释&#xff1a; 一、HTML 输出流的概念 1. 动态渲染过程 HTML 文档的加载是自上而下逐行解析的。当浏览器遇到 <script&…...

Kafka 的高可用性

Kafka 的高可用性主要通过副本机制、ISR&#xff08;In-Sync Replicas&#xff09;列表和控制器 Broker 来实现。这些机制共同确保了 Kafka 集群在部分节点故障时仍然可以正常运行&#xff0c;数据不会丢失&#xff0c;并且服务不会中断。 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环境搭建 版本对应&#xff1a;https://www.rabbitmq.com/docs/which-erlang 解压到指定目录 tar -xv…...

RISC-V AIA学习3---APLIC 第二部分(APLIC 中断域的内存映射控制区域)

每个中断域都有一个专用的内存映射控制区域&#xff0c;用来处理该中断域的中断。 控制区域的大小是 4KB 的倍数&#xff0c;对齐到 4KB 边界。最小的有效控制区域是 16KB。 1. 控制区域的基本结构&#xff1a;部门文件柜 每个中断域就像公司的一个部门&#xff0c;有自己的 …...

顶刊【遥感目标检测】【TGRS】FFCA-YOLO遥感图像小目标检测

FFCA-YOLO for Small Object Detection in Remote Sensing Images FFCA-YOLO遥感图像小目标检测 0.论文摘要 摘要——特征表征不足、背景干扰等问题使得遥感图像中的小目标检测任务极具挑战性。尤其在算法需部署于星载设备进行实时处理时&#xff0c;需在有限计算资源下对精度…...

【人工智能】从 Llama 到 DeepSeek:开源大模型的演进与技术对比

《Python OpenCV从菜鸟到高手》带你进入图像处理与计算机视觉的大门! 解锁Python编程的无限可能:《奇妙的Python》带你漫游代码世界 随着人工智能的迅猛发展,开源大语言模型(LLM)在自然语言处理领域扮演着越来越重要的角色。本文从 Meta 的 Llama 系列开始,追溯开源大模…...

【PCB工艺】时序图(Timing Diagram)

时序图&#xff08;Timing Diagram&#xff09;是描述数字电路信号随时间变化的图示&#xff0c;广泛用于分析和设计时序逻辑电路&#xff0c;如锁存器&#xff08;Latch&#xff09;、触发器&#xff08;Flip-Flop&#xff09;、计数器、状态机等。这篇文章从时序图的原理、构…...

MATLAB 中,并行池(Parallel Pool)自动关闭的情况

在 MATLAB 中&#xff0c;并行池&#xff08;Parallel Pool&#xff09;的行为可以通过设置进行控制&#xff0c;但默认情况下&#xff0c;并行池不会自动关闭&#xff0c;除非满足某些条件或显式调用关闭命令。以下是关于并行池自动关闭机制的详细说明&#xff1a; 自动关闭的…...

[网安工具] SQL 注入自动探测工具 —— SQLMAP 使用手册

&#x1f31f;想了解其它网安工具&#xff1f;看看这个&#xff1a;[网安工具] 网安工具库 —— 工具管理手册 https://github.com/sqlmapproject/sqlmaphttps://github.com/sqlmapproject/sqlmap用法 | sqlmap 用户手册https://sqlmap.highlight.ink/usage 0x01&#xff1a;S…...

Python数据结构与算法-基础预热篇

目录 语言基础 1.内置函数 1.1math库 1.2collections 1.2.1Counter&#xff1a;计数器 1.2.2deque双端对列 1.2.3defaultdict有默认值的字典 1.3heapq堆&#xff08;完全二叉树&#xff09; 1.4functool 1.5itertools 1.5.1无限迭代器 1.5.2有限迭代器 1.5.3排列组合迭代器 2.序…...

构建可扩展、可靠的网络抓取、监控和自动化应用程序的终极指南

大家好&#xff0c;这里是架构资源栈&#xff01;点击上方关注&#xff0c;添加“星标”&#xff0c;一起学习大厂前沿架构&#xff01; 无论您是企业主、营销人员还是软件开发人员&#xff0c;您都很有可能在某个时候使用过 Web 自动化工具。每个人都希望更聪明地工作&#xf…...

【蓝桥杯】重点冲刺

【最高优先级】必考核心算法(占分60%以上) 动态规划(DP) 🌟🌟🌟 背包问题:01背包、完全背包(必须掌握空间优化的一维写法) 线性DP:最长上升子序列(LIS)、最长公共子序列(LCS) 路径问题:网格路径计数(含障碍物)、最小路径和 经典模型:打家劫舍、股票买卖问…...

质量工程师的2025:从“找bug“到“造质量“的职业进化

想象一下&#xff0c;2025年的某天&#xff1a;阅读原文 早晨&#xff0c;AI测试助手已经自动运行了夜间回归测试&#xff0c;并将可疑问题标记出来 你喝着咖啡&#xff0c;通过质量数据看板分析系统健康度 下午的会议上&#xff0c;你正用业务语言向产品经理解释&#xff1a…...

2025年CNG 汽车加气站操作工题目分享

CNG 汽车加气站操作工题目分享&#xff1a; 单选题 1、CNG 加气站中&#xff0c;加气机的加气软管应&#xff08; &#xff09;进行检查。 A. 每天 B. 每周 C. 每月 D. 每季度 答案&#xff1a;A 解析&#xff1a;加气软管是加气操作中频繁使用的部件&#xff0c;每天检…...

【QT5 多线程示例】线程池

线程池 【C并发编程】&#xff08;九&#xff09;线程池 QThreadPool 和 QRunnable 是 Qt 提供的线程池管理机制。QRunnable 是一个任务抽象类&#xff1b;定义任务逻辑需要继承QRunnable 并实现 run() 方法。QThreadPool 负责管理线程&#xff0c;并将 QRunnable 任务分配到…...

飞致云荣获“Alibaba Cloud Linux最佳AI镜像服务商”称号

2025年3月24日&#xff0c;阿里云云市场联合龙蜥社区发布“2024年度Alibaba Cloud Linux最佳AI镜像服务商”评选结果。 经过主办方的严格考量&#xff0c;飞致云&#xff08;即杭州飞致云信息科技有限公司&#xff09;凭借旗下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-视觉&#xff08;-惯性&#xff09;SLAM_ III 系统概述IV 具有顺序状态更新的误差状态迭代卡尔曼滤波…...

kubesphere 终端shell连不上的问题

使用nginx代理kubesphere控制台会出现容器的终端shell连不上的问题 下面是一个样例配置可以解决这个问题&#xff1a; 注意修改为你的ip地址&#xff1a; upstream k8s { ip_hash; server masterip1:30880; server masterip2:30880; server masterip3:30880; } nginx.conf #…...

无人机,雷达定点飞行时,位置发散,位置很飘,原因分析

参考&#xff1a; 无人车传感器 IMU与GPS数据融合进行定位机制_gps imu 组合定位原始数-CSDN博客 我的无人机使用雷达定位&#xff0c;位置模式很飘 雷达的更新频率也是10HZ&#xff0c; 而px飞控的频率是100HZ&#xff0c;没有对两者之间的频率差异做出处理 所以才导致无人…...

外星人入侵(python设计小游戏)

这个游戏简而言之就是操作一个飞机对前方的飞船进行射击&#xff0c;和一款很久之前的游戏很像&#xff0c;这里是超级低配版那个游戏&#xff0c;先来看看效果图&#xff1a; 由于设计的是全屏的&#xff0c;所以电脑不能截图。。。。 下面的就是你操控的飞船&#xff0c;上面…...

Stereolabs ZED Box Mini:NVIDIA Orin™驱动,双GMSL2输入,智能机器视觉AI新选择”

Stereolabs近日推出了ZED Box Mini&#xff0c;这是一款专为视觉AI设计的紧凑型迷你电脑&#xff08;ECU&#xff09;。该产品搭载了NVIDIA Orin™系列处理器&#xff0c;具备强大的AI视觉处理能力&#xff0c;适用于机器人、智能基础设施和工业应用等多种场景。ZED Box Mini以…...

IP协议的介绍

网络层的主要功能是在复杂的网络环境中确定一个合适的路径.网络层的协议主要是IP协议.IP协议头格式如下: 1.4位版本号:指定IP协议的版本,常用的是IPV4,对于IPV4来说,这里的值就是4. 2.4位头部长度,单位也是4个字节,4bit表示的最大数字是15,因此IP头部的最大长度就是60字节 3.…...

【入门初级篇】布局类组件的使用(2)

【入门初级篇】布局类组件的使用&#xff08;2&#xff09; 视频要点 &#xff08;1&#xff09;2分栏场景介绍与实操演示 &#xff08;2&#xff09;3分栏场景介绍与实操演示 点击访问myBuilder产品运营平台 CSDN站内资源下载myBuilder 交流请加微信&#xff1a;MyBuilder8…...

高并发金融系统,“可观测-可追溯-可回滚“的闭环审计体系

一句话总结 在高并发金融系统中&#xff0c;审计方案设计需平衡"观测粒度"与"系统损耗"&#xff0c;通过双AOP实现非侵入式采集&#xff0c;三表机制保障操作原子性&#xff0c;最终形成"可观测-可追溯-可回滚"的闭环体系。 业务痛点与需求 在…...

(九)Spring Webflux

底层基于Netty实现的Web容器与请求/响应处理机制 参照&#xff1a;Spring WebFlux :: Spring Frameworkhttps://docs.spring.io/spring-framework/reference/6.0/web/webflux.html 一、组件对比 API功能 Servlet-阻塞式Web WebFlux-响应式Web 前端控制器 DispatcherServl…...

如何在Webpack中配置别名路径?

如何在Webpack中配置别名路径&#xff1f; 文章目录 如何在Webpack中配置别名路径&#xff1f;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来生成各种宏&#xff0c;从而生成我们需要各种数据和图表&#xff0c;这样可以大大减少我们手工的操作。 1、Office的版本 采用的是微软的office2016&#xff0c;如下图&#xff1a; 2、新建一个Word文档 3、开启开发工具 这样菜单中的“开发工具…...

利用GitHub Pages快速部署前端框架静态网页

文章目录 前言GitHub Pages 来部署前端框架&#xff08;Vue 3 Vite&#xff09;项目1、配置 GitHub Pages 部署2、将项目推送到 GitHub3、部署到 GitHub Pages4、访问部署页面5、修改代码后的更新部署顺序 前言 可以先参考&#xff1a; 使用 GitHub Pages 快速部署静态网页: …...

前端性能优化思路_场景题

20 万人同时在直播间打赏&#xff0c;前端优化需要考虑高并发、性能优化、流畅体验等问题&#xff0c;涉及 WebSocket 处理、消息去抖、虚拟列表优化、动画优化、CDN 加速 等多个方面。 WebSocket 高并发优化 &#xff08;1&#xff09;使用 WebSocket 替代轮询 轮询&#xf…...

45 55跳跃游戏解题记录

先是55跳跃游戏&#xff0c;暴力解法会怎样&#xff1f;会超出时间限制&#xff0c;而且有很多细节要注意&#xff1a; func canJump(nums []int) bool {// 处理空数组情况&#xff0c;当nums只剩一个元素时&#xff0c;nums[i:]导致越界。if len(nums) 0 {return false}// 如…...

一个简单的用C#实现的分布式雪花ID算法

雪花ID是一个依赖时间戳根据算法生成的一个Int64的数字ID&#xff0c;一般用来做主键或者订单号等。以下是一个用C#写的雪花ID的简单实现方法 using System; using System.Collections.Concurrent; using System.Diagnostics;public class SnowflakeIdGenerator {// 配置常量p…...

16个气象数据可视化网站整理分享

好的&#xff01;以下是关于“16个气象数据可视化网站整理分享”的软文&#xff1a; 16个气象数据可视化网站整理分享 气象数据可视化已成为现代气象研究、决策支持以及公众天气服务的重要组成部分。从天气预报到气候变化监测&#xff0c;全球许多气象数据可视化平台为专业人士…...

一周学会Flask3 Python Web开发-SQLAlchemy数据迁移migrate

锋哥原创的Flask3 Python Web开发 Flask3视频教程&#xff1a; 2025版 Flask3 Python web开发 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili 模型类(表)不是一成不变的&#xff0c;当你添加了新的模型类&#xff0c;或是在模型类中添加了新的字段&#xff0c;甚至是修改…...

[原创](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 工作流&#xff0c; 语义检索有基本认知理解不足小伙伴帮忙指正 &#x1f603;,生活加油 我看远山&#xff0c;远山悲悯 持续分享技术干货…...

中间件框架漏洞攻略

中间件&#xff08;英语&#xff1a;Middleware&#xff09;是提供系统软件和应⽤软件之间连接的软件&#xff0c;以便于软件各部件之间的沟通。 中间件处在操作系统和更⾼⼀级应⽤程序之间。他充当的功能是&#xff1a;将应⽤程序运⾏环境与操作系统隔离&#xff0c;从⽽实…...

在 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下载安装使用

&#x1f91f;致敬读者 &#x1f7e9;感谢阅读&#x1f7e6;笑口常开&#x1f7ea;生日快乐⬛早点睡觉 &#x1f4d8;博主相关 &#x1f7e7;博主信息&#x1f7e8;博客首页&#x1f7eb;专栏推荐&#x1f7e5;活动信息 文章目录 Another Redis Desktop Manager下载安装使用…...