Spring Boot項目生產環境部署完整指南

在Spring Boot應用開發完成后,如何將其穩定、高效地部署到生產環境是每個開發者都需要掌握的關鍵技能。本文將詳細介紹Spring Boot項目的多種部署方案,從傳統部署到現代化容器部署,選擇最適合的部署策略。

1. 部署前的準備工作

1.1 項目打包優化

在部署之前,需要確保項目能夠正確打包。Spring Boot提供了多種打包方式:

Maven項目打包:

# 清理并打包
mvn clean package# 跳過測試打包(生產環境不推薦)
mvn clean package -DskipTests# 打包并運行測試
mvn clean package -Dspring.profiles.active=test

Gradle項目打包:

# 清理并構建
./gradlew clean build# 生成可執行jar
./gradlew bootJar

1.2 配置文件管理

生產環境需要獨立的配置文件,建議使用Spring Profile進行環境隔離:

application.yml(主配置):

spring:profiles:active: @spring.profiles.active@application:name: your-application

application-prod.yml(生產環境配置):

server:port: 8080servlet:context-path: /apitomcat:max-connections: 10000threads:max: 200min-spare: 10spring:datasource:url: jdbc:mysql://${DB_HOST:localhost}:${DB_PORT:3306}/${DB_NAME:your_db}?useSSL=true&serverTimezone=Asia/Shanghaiusername: ${DB_USERNAME:root}password: ${DB_PASSWORD:password}hikari:maximum-pool-size: 20minimum-idle: 5idle-timeout: 300000max-lifetime: 1200000connection-timeout: 20000jpa:hibernate:ddl-auto: validateshow-sql: falseproperties:hibernate:dialect: org.hibernate.dialect.MySQL8Dialectformat_sql: falseredis:host: ${REDIS_HOST:localhost}port: ${REDIS_PORT:6379}password: ${REDIS_PASSWORD:}timeout: 2000mslettuce:pool:max-active: 8max-idle: 8min-idle: 0logging:level:com.yourpackage: INFOorg.springframework.web: WARNpattern:file: "%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n"file:name: logs/application.logmax-size: 100MBmax-history: 30management:endpoints:web:exposure:include: health,info,metricsendpoint:health:show-details: when-authorized

2. 傳統服務器部署

2.1 Linux服務器部署

環境準備:

# 安裝Java 11
sudo apt update
sudo apt install openjdk-11-jdk# 驗證安裝
java -version

創建應用用戶:

# 創建專用用戶(安全最佳實踐)
sudo useradd -r -s /bin/false springboot
sudo mkdir -p /opt/your-app
sudo chown springboot:springboot /opt/your-app

部署腳本:

#!/bin/bash
# deploy.shAPP_NAME="your-app"
APP_VERSION="1.0.0"
JAR_FILE="${APP_NAME}-${APP_VERSION}.jar"
APP_DIR="/opt/${APP_NAME}"
PID_FILE="${APP_DIR}/${APP_NAME}.pid"# 停止舊版本
if [ -f "$PID_FILE" ]; thenPID=$(cat $PID_FILE)if ps -p $PID > /dev/null; thenecho "Stopping $APP_NAME (PID: $PID)"kill $PIDsleep 5firm -f $PID_FILE
fi# 備份當前版本
if [ -f "${APP_DIR}/${JAR_FILE}" ]; thencp "${APP_DIR}/${JAR_FILE}" "${APP_DIR}/${JAR_FILE}.backup"
fi# 部署新版本
cp "target/${JAR_FILE}" "${APP_DIR}/"
chown springboot:springboot "${APP_DIR}/${JAR_FILE}"# 啟動應用
cd $APP_DIR
sudo -u springboot nohup java \-Xms512m -Xmx1024m \-Dspring.profiles.active=prod \-Dfile.encoding=UTF-8 \-jar ${JAR_FILE} \> logs/application.log 2>&1 &echo $! > $PID_FILE
echo "$APP_NAME started successfully"

2.2 Windows服務器部署

安裝為Windows服務:

@echo off
rem install-service.batset APP_NAME=YourApp
set JAR_FILE=your-app-1.0.0.jar
set SERVICE_NAME=YourAppServicerem 下載winsw工具
rem https://github.com/winsw/winsw/releasesrem 創建服務配置文件
echo ^<service^> > %SERVICE_NAME%.xml
echo   ^<id^>%SERVICE_NAME%^</id^> >> %SERVICE_NAME%.xml
echo   ^<name^>%APP_NAME%^</name^> >> %SERVICE_NAME%.xml
echo   ^<description^>Spring Boot Application^</description^> >> %SERVICE_NAME%.xml
echo   ^<executable^>java^</executable^> >> %SERVICE_NAME%.xml
echo   ^<arguments^>-jar %JAR_FILE%^</arguments^> >> %SERVICE_NAME%.xml
echo   ^<workingdirectory^>%CD%^</workingdirectory^> >> %SERVICE_NAME%.xml
echo ^</service^> >> %SERVICE_NAME%.xmlrem 安裝服務
winsw.exe install %SERVICE_NAME%.xmlrem 啟動服務
net start %SERVICE_NAME%

3. Docker容器化部署

3.1 單容器部署

Dockerfile優化版本:

# 多階段構建減少鏡像大小
FROM maven:3.8.4-openjdk-11 AS builder
WORKDIR /app
COPY pom.xml .
RUN mvn dependency:go-offline -B
COPY src ./src
RUN mvn clean package -DskipTests# 運行時鏡像
FROM openjdk:11-jre-slim
LABEL maintainer="your-email@example.com"# 創建應用用戶
RUN groupadd -r springboot && useradd -r -g springboot springboot# 安裝必要工具
RUN apt-get update && apt-get install -y \curl \&& rm -rf /var/lib/apt/lists/*WORKDIR /app# 復制jar文件
COPY --from=builder /app/target/*.jar app.jar# 更改文件所有者
RUN chown springboot:springboot app.jar# 切換到非root用戶
USER springboot# 健康檢查
HEALTHCHECK --interval=30s --timeout=3s --start-period=5s --retries=3 \CMD curl -f http://localhost:8080/actuator/health || exit 1EXPOSE 8080# 啟動參數優化
ENTRYPOINT ["java", \"-Djava.security.egd=file:/dev/./urandom", \"-Dspring.profiles.active=prod", \"-jar", \"app.jar"]

構建和運行:

# 構建鏡像
docker build -t your-app:latest .# 運行容器
docker run -d \--name your-app \-p 8080:8080 \-e SPRING_PROFILES_ACTIVE=prod \-e DB_HOST=host.docker.internal \-e DB_USERNAME=root \-e DB_PASSWORD=password \--restart unless-stopped \your-app:latest# 查看日志
docker logs -f your-app

3.2 Docker Compose編排

docker-compose.yml:

version: '3.8'services:app:build: .container_name: your-appports:- "8080:8080"environment:- SPRING_PROFILES_ACTIVE=prod- DB_HOST=mysql- DB_USERNAME=root- DB_PASSWORD=yourpassword- REDIS_HOST=redisdepends_on:mysql:condition: service_healthyredis:condition: service_startedvolumes:- app-logs:/app/logsnetworks:- app-networkrestart: unless-stoppedhealthcheck:test: ["CMD", "curl", "-f", "http://localhost:8080/actuator/health"]interval: 30stimeout: 10sretries: 3mysql:image: mysql:8.0container_name: your-app-mysqlenvironment:- MYSQL_ROOT_PASSWORD=yourpassword- MYSQL_DATABASE=your_db- MYSQL_USER=app_user- MYSQL_PASSWORD=app_passwordports:- "3306:3306"volumes:- mysql-data:/var/lib/mysql- ./init.sql:/docker-entrypoint-initdb.d/init.sqlnetworks:- app-networkrestart: unless-stoppedhealthcheck:test: ["CMD", "mysqladmin", "ping", "-h", "localhost"]timeout: 20sretries: 10redis:image: redis:7-alpinecontainer_name: your-app-redisports:- "6379:6379"volumes:- redis-data:/datanetworks:- app-networkrestart: unless-stoppedcommand: redis-server --appendonly yesnginx:image: nginx:alpinecontainer_name: your-app-nginxports:- "80:80"- "443:443"volumes:- ./nginx.conf:/etc/nginx/nginx.conf- ./ssl:/etc/nginx/ssldepends_on:- appnetworks:- app-networkrestart: unless-stoppedvolumes:mysql-data:redis-data:app-logs:networks:app-network:driver: bridge

啟動和管理:

# 啟動所有服務
docker-compose up -d# 查看服務狀態
docker-compose ps# 查看日志
docker-compose logs -f app# 擴容應用實例
docker-compose up -d --scale app=3# 停止所有服務
docker-compose down

4. 云平臺部署

4.1 阿里云ECS部署

安全組配置:

  • 入方向:開放80、443、8080端口
  • 出方向:允許所有

自動化部署腳本:

#!/bin/bash
# aliyun-deploy.sh# 配置變量
REGION="cn-hangzhou"
IMAGE_ID="ubuntu_20_04_x64_20G_alibase_20210420.vhd"
INSTANCE_TYPE="ecs.t5-lc1m1.small"
SECURITY_GROUP_ID="sg-xxxxx"# 創建ECS實例
aliyun ecs CreateInstance \--RegionId $REGION \--ImageId $IMAGE_ID \--InstanceType $INSTANCE_TYPE \--SecurityGroupId $SECURITY_GROUP_ID \--InstanceName "springboot-app" \--InternetMaxBandwidthOut 100# 部署應用(在實例創建后執行)
# ... 部署邏輯

4.2 騰訊云CVM部署

類似阿里云,使用騰訊云CLI或控制臺創建實例,然后按照傳統服務器部署方式進行。

4.3 Kubernetes部署

deployment.yaml:

apiVersion: apps/v1
kind: Deployment
metadata:name: springboot-applabels:app: springboot-app
spec:replicas: 3selector:matchLabels:app: springboot-apptemplate:metadata:labels:app: springboot-appspec:containers:- name: appimage: your-app:latestports:- containerPort: 8080env:- name: SPRING_PROFILES_ACTIVEvalue: "prod"- name: DB_HOSTvalueFrom:secretKeyRef:name: app-secretkey: db-hostresources:requests:memory: "512Mi"cpu: "250m"limits:memory: "1Gi"cpu: "500m"livenessProbe:httpGet:path: /actuator/healthport: 8080initialDelaySeconds: 30periodSeconds: 10readinessProbe:httpGet:path: /actuator/healthport: 8080initialDelaySeconds: 5periodSeconds: 5---
apiVersion: v1
kind: Service
metadata:name: springboot-app-service
spec:selector:app: springboot-appports:- protocol: TCPport: 80targetPort: 8080type: LoadBalancer

5. 反向代理配置

5.1 Nginx配置

nginx.conf:

user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;events {worker_connections 1024;use epoll;multi_accept on;
}http {include /etc/nginx/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 /var/log/nginx/access.log main;# 基本配置sendfile on;tcp_nopush on;tcp_nodelay on;keepalive_timeout 65;types_hash_max_size 2048;# Gzip壓縮gzip on;gzip_vary on;gzip_min_length 1024;gzip_comp_level 6;gzip_types text/plain text/css application/json application/javascript text/xml application/xml;# 上游服務器upstream springboot_backend {least_conn;server 127.0.0.1:8080 weight=1 max_fails=2 fail_timeout=30s;server 127.0.0.1:8081 weight=1 max_fails=2 fail_timeout=30s;keepalive 32;}# 限流配置limit_req_zone $binary_remote_addr zone=api:10m rate=10r/s;server {listen 80;server_name your-domain.com www.your-domain.com;# HTTP重定向到HTTPSreturn 301 https://$server_name$request_uri;}server {listen 443 ssl http2;server_name your-domain.com www.your-domain.com;# SSL配置ssl_certificate /etc/nginx/ssl/cert.pem;ssl_certificate_key /etc/nginx/ssl/key.pem;ssl_protocols TLSv1.2 TLSv1.3;ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384;ssl_prefer_server_ciphers off;# 安全頭add_header X-Frame-Options DENY;add_header X-Content-Type-Options nosniff;add_header X-XSS-Protection "1; mode=block";add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;# 靜態資源緩存location ~* \.(css|js|jpg|jpeg|png|gif|ico|svg)$ {expires 1y;add_header Cache-Control "public, immutable";}# API代理location /api/ {limit_req zone=api burst=20 nodelay;proxy_pass http://springboot_backend;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;# 連接超時設置proxy_connect_timeout 30s;proxy_send_timeout 30s;proxy_read_timeout 30s;# 緩沖設置proxy_buffering on;proxy_buffer_size 4k;proxy_buffers 8 4k;}# 健康檢查location /health {access_log off;proxy_pass http://springboot_backend/actuator/health;}}
}

6. 進程管理和監控

6.1 Systemd服務管理

創建服務文件:

# /etc/systemd/system/springboot-app.service
[Unit]
Description=Spring Boot Application
After=network.target mysql.service redis.service
Wants=mysql.service redis.service[Service]
Type=simple
User=springboot
Group=springboot
WorkingDirectory=/opt/springboot-app
ExecStart=/usr/bin/java -Xms512m -Xmx1024m -Dspring.profiles.active=prod -jar app.jar
ExecStop=/bin/kill -TERM $MAINPID
Restart=always
RestartSec=10
StandardOutput=journal
StandardError=journal
SyslogIdentifier=springboot-app# 安全配置
NoNewPrivileges=yes
PrivateTmp=yes
ProtectSystem=strict
ProtectHome=yes
ReadWritePaths=/opt/springboot-app/logs# 資源限制
LimitNOFILE=65536
LimitNPROC=4096[Install]
WantedBy=multi-user.target

服務管理命令:

# 重新加載systemd配置
sudo systemctl daemon-reload# 啟用服務(開機自啟)
sudo systemctl enable springboot-app# 啟動服務
sudo systemctl start springboot-app# 查看服務狀態
sudo systemctl status springboot-app# 查看日志
sudo journalctl -u springboot-app -f# 重啟服務
sudo systemctl restart springboot-app

6.2 監控和日志

Prometheus監控配置:

# application-prod.yml 添加
management:endpoints:web:exposure:include: health,info,metrics,prometheusmetrics:export:prometheus:enabled: true

日志配置(logback-spring.xml):

<?xml version="1.0" encoding="UTF-8"?>
<configuration><springProfile name="prod"><appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"><file>logs/application.log</file><rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"><fileNamePattern>logs/application.%d{yyyy-MM-dd}.%i.log</fileNamePattern><timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP"><maxFileSize>100MB</maxFileSize></timeBasedFileNamingAndTriggeringPolicy><maxHistory>30</maxHistory><totalSizeCap>3GB</totalSizeCap></rollingPolicy><encoder><pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern></encoder></appender><root level="INFO"><appender-ref ref="FILE"/></root></springProfile>
</configuration>

7. 性能優化和安全配置

7.1 JVM參數優化

# 生產環境JVM參數示例
java -server \-Xms1g -Xmx2g \-XX:+UseG1GC \-XX:MaxGCPauseMillis=200 \-XX:+HeapDumpOnOutOfMemoryError \-XX:HeapDumpPath=logs/heapdump.hprof \-XX:+PrintGCDetails \-XX:+PrintGCTimeStamps \-Xloggc:logs/gc.log \-XX:+UseGCLogFileRotation \-XX:NumberOfGCLogFiles=5 \-XX:GCLogFileSize=10M \-Dspring.profiles.active=prod \-Dfile.encoding=UTF-8 \-Djava.awt.headless=true \-Djava.security.egd=file:/dev/./urandom \-jar your-app.jar

7.2 應用安全配置

SecurityConfig.java:

@Configuration
@EnableWebSecurity
public class SecurityConfig {@Beanpublic SecurityFilterChain filterChain(HttpSecurity http) throws Exception {http.csrf().disable().sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS).and().headers().frameOptions().deny().contentTypeOptions().and().xssProtection().and().httpStrictTransportSecurity(hstsConfig -> hstsConfig.maxAgeInSeconds(31536000).includeSubDomains(true)).and().authorizeHttpRequests(authz -> authz.requestMatchers("/actuator/health").permitAll().requestMatchers("/api/public/**").permitAll().anyRequest().authenticated());return http.build();}
}

8. 部署最佳實踐

8.1 藍綠部署

#!/bin/bash
# blue-green-deploy.shBLUE_PORT=8080
GREEN_PORT=8081
NGINX_UPSTREAM_CONF="/etc/nginx/conf.d/upstream.conf"# 檢查當前活躍端口
CURRENT_PORT=$(curl -s http://localhost/actuator/info | jq -r '.port // 8080')if [ "$CURRENT_PORT" = "$BLUE_PORT" ]; thenNEW_PORT=$GREEN_PORTOLD_PORT=$BLUE_PORT
elseNEW_PORT=$BLUE_PORTOLD_PORT=$GREEN_PORT
fiecho "Deploying to port $NEW_PORT"# 啟動新版本
java -jar -Dserver.port=$NEW_PORT your-app-new.jar &
NEW_PID=$!# 等待新版本啟動
sleep 30# 健康檢查
if curl -f http://localhost:$NEW_PORT/actuator/health; thenecho "New version is healthy, switching traffic"# 更新Nginx配置sed -i "s/server 127.0.0.1:$OLD_PORT/server 127.0.0.1:$NEW_PORT/g" $NGINX_UPSTREAM_CONFnginx -s reload# 等待流量切換完成sleep 10# 停止舊版本kill $(lsof -t -i:$OLD_PORT)echo "Deployment successful"
elseecho "New version failed health check, rolling back"kill $NEW_PIDexit 1
fi

8.2 滾動更新

#!/bin/bash
# rolling-update.shINSTANCES=("8080" "8081" "8082")
NEW_JAR="your-app-new.jar"for port in "${INSTANCES[@]}"; doecho "Updating instance on port $port"# 從負載均衡器移除# 這里需要調用你的負載均衡器API# 停止實例kill $(lsof -t -i:$port)# 啟動新版本nohup java -jar -Dserver.port=$port $NEW_JAR > logs/app-$port.log 2>&1 &# 等待啟動sleep 30# 健康檢查if curl -f http://localhost:$port/actuator/health; thenecho "Instance on port $port updated successfully"# 重新加入負載均衡器elseecho "Instance on port $port failed to start"exit 1fi# 等待一段時間再更新下一個實例sleep 10
done

9. 故障排查和運維

9.1 常見問題排查

端口占用:

# 查看端口占用
netstat -tulpn | grep :8080
lsof -i :8080# 殺死占用端口的進程
kill -9 $(lsof -t -i:8080)

內存問題:

# 查看內存使用
free -h
ps aux | grep java# 生成heap dump
jmap -dump:format=b,file=heapdump.hprof <pid># 分析GC
jstat -gc <pid> 5s

日志分析:

# 查看錯誤日志
tail -f logs/application.log | grep ERROR# 統計請求量
grep "GET\|POST" access.log | awk '{print $4}' | cut -d: -f1-2 | sort | uniq -c# 查看響應時間
awk '{print $NF}' access.log | sort -n | tail -10

9.2 性能監控

監控腳本:

#!/bin/bash
# monitor.shAPP_URL="http://localhost:8080"
ALERT_EMAIL="admin@example.com"# 檢查應用狀態
check_health() {local response=$(curl -s -o /dev/null -w "%{http_code}" $APP_URL/actuator/health)if [ "$response" != "200" ]; thenecho "Application is down! HTTP Status: $response" | mail -s "App Alert" $ALERT_EMAILreturn 1fireturn 0
}# 檢查內存使用
check_memory() {local mem_usage=$(free | grep Mem | awk '{printf "%.2f", $3/$2 * 100.0}')local threshold=80if (( $(echo "$mem_usage > $threshold" | bc -l) )); thenecho "High memory usage: ${mem_usage}%" | mail -s "Memory Alert" $ALERT_EMAILfi
}# 檢查磁盤空間
check_disk() {local disk_usage=$(df / | tail -1 | awk '{print $5}' | sed 's/%//')local threshold=85if [ "$disk_usage" -gt "$threshold" ]; thenecho "High disk usage: ${disk_usage}%" | mail -s "Disk Alert" $ALERT_EMAILfi
}# 執行檢查
check_health && check_memory && check_disk

Spring Boot應用的部署涉及多個方面,從簡單的jar包部署到復雜的容器化編排,每種方式都有其適用場景:

  • 傳統部署:適合小型項目和傳統IT環境
  • Docker部署:適合現代化應用和微服務架構
  • 云平臺部署:適合需要彈性伸縮和高可用的應用
  • Kubernetes部署:適合大規模分布式應用

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/91218.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/91218.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/91218.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

微信小程序中實現頁面跳轉的方法

微信小程序中頁面跳轉主要有兩種方式&#xff1a;聲明式導航&#xff08;通過組件實現&#xff09;和編程式導航&#xff08;通過API實現&#xff09;。兩種方式適用于不同場景&#xff0c;以下詳細說明。一、聲明式導航&#xff08;navigator組件&#xff09;通過小程序內置的…

從0開始學linux韋東山教程Linux驅動入門實驗班(7)

本人從0開始學習linux&#xff0c;使用的是韋東山的教程&#xff0c;在跟著課程學習的情況下的所遇到的問題的總結,理論雖枯燥但是是基礎。本人將前幾章的內容大致學完之后&#xff0c;考慮到后續驅動方面得更多的開始實操&#xff0c;后續的內容將以韋東山教程Linux驅動入門實…

國內AI IDE競逐:騰訊CodeBuddy、阿里通義靈碼、字節跳動TRAE、百度文心快碼

國內AI IDE競逐&#xff1a;騰訊CodeBuddy、阿里通義靈碼、字節跳動TRAE、百度文心快碼 隨著人工智能技術的不斷發展&#xff0c;各大科技公司紛紛推出自家的AI IDE&#xff0c;推動軟件開發進入全新的智能化時代。騰訊的 CodeBuddy IDE、阿里云的 通義靈碼 AI IDE、字節跳動的…

git rebase使用教程 以及和merge的區別

Merge和Rebase概念概述 rebase 和 merge 相似&#xff0c;但又不完全相同&#xff0c;本質上都是用來合并分支的命令&#xff0c;區別如下 merge合并分支會多出一條merge commit記錄&#xff0c;而rebase不會merge的提交樹是非線性的&#xff0c;會有分叉&#xff0c;而rebase的…

React中的合成事件解釋和理解

什么是合成事件&#xff08;Synthetic event&#xff09;?它和原生事件有什么區別?解題思路:解釋合成事件&#xff0c;然后對比原生事件&#xff0c;然后再說他的優勢1.一致性 在 react里面&#xff0c;這個合成事件是非常重要的&#xff0c;因為它就是為了解決瀏覽器之間與事…

【Python系列】使用 memory_profiler 診斷 Flask 應用內存問題

博客目錄一、內存分析的重要性二、memory_profiler 基礎使用安裝與基本配置理解分析報告三、在 Flask 應用中使用 memory_profiler裝飾視圖函數使用 mprof 進行長期監控四、高級內存分析技巧精確測量代碼塊內存定期內存采樣結合 objgraph 分析對象引用五、常見內存問題及解決方…

vue3【組件封裝】超級表單 S-form.vue

最終效果 代碼實現 components/SUI/S-form.vue <script lang"ts" setup> import type { FormInstance } from "element-plus";// 使用索引簽名定義對象類型 type GenericObject {[key: string]: any; };const props defineProps<{Model?: Gen…

Android Studio Memory Monitor內存分析核心指標詳解

Depth、Native Size、Shallow Size、Retained Size 解析 一、指標定義與對比指標定義計算邏輯重要性Shallow Size對象自身實例占用的內存基本類型字段大小 引用指針 內存對齊對象的基礎內存成本Retained Size回收該對象可釋放的總內存量&#xff08;含所有依賴對象&#xff0…

vue中使用wavesurfer.js繪制波形圖和頻譜圖(支持.pcm)

新的實現方式&#xff1a;vue使用Canvas繪制頻譜圖 安裝wavesurfer.js npm install wavesurfer.js第一版&#xff1a; 組件特點&#xff1a; 一次性加載好所有的數據&#xff1b; <template><div class"audio-visualizer-container"><div class&…

go mod教程、go module

什么是go mod go mod 是go語言的包管理工具&#xff0c;類似java 的maven&#xff0c;go mod的出現可以告別goPath&#xff0c;使用go module來管理項目&#xff0c;有了go mod賬號就不需要非得把項目放到gopath/src目錄下了&#xff0c;你可以在磁盤的任何位置新建一個項目 go…

150-SWT-MCNN-BiGRU-Attention分類預測模型等!

150-SWT-MCNN-BiGRU-Attention分類預測模型!基于多尺度卷積神經網絡(MCNN)雙向長短期記憶網絡(BiGRU)注意力機制(Attention)的分類預測模型&#xff0c;matlab代碼&#xff0c;直接運行使用&#xff01;1、模型介紹&#xff1a;針對傳統方法在噪聲環境下診斷精度低的問題&#…

MySQL數據一致性與主從延遲深度解析:從內核機制到生產實踐

在高并發分布式系統中&#xff0c;數據一致性與復制延遲如同硬幣的兩面。本文深入剖析MySQL持久化機制與主從同步原理&#xff0c;并提供可落地的調優方案。一、數據持久化核心機制&#xff1a;雙日志協同 1. Redo Log&#xff1a;崩潰恢復的生命線刷新策略&#xff08;innodb_…

【I】題目解析

目錄 單選題 多選題 判斷題 單選題 1.reg[7:0]A; A2hFF;則A&#xff08;&#xff09; A.8b11111110 B.8b03 C.8b00000011 D.8b11111111 C 2hFF實際上等效于2位二進制2b11&#xff0c;賦值給8位寄存器A之后&#xff0c;低位賦值&#xff0c;高位補0 A8b00000011 AMD FPG…

《Foundation 面板:設計、功能與最佳實踐解析》

《Foundation 面板:設計、功能與最佳實踐解析》 引言 在當今數字化時代,用戶界面(UI)設計的重要性不言而喻。其中,Foundation 面板作為一種流行的前端框架,因其靈活性和高效性而被眾多開發者所青睞。本文將深入解析 Foundation 面板的設計理念、功能特點以及最佳實踐,…

React服務端渲染 Next 使用詳解

1. Next.js 概述 Next.js 是一個基于 React 的開源框架&#xff0c;專注于服務器端渲染&#xff08;SSR&#xff09;和靜態站點生成&#xff08;SSG&#xff09;&#xff0c;提供開箱即用的 SSR 功能&#xff0c;簡化 React 應用的開發與部署。 2. Next.js 的核心特性 SSR 支…

Deforum Stable Diffusion,輕松實現AI視頻生成自由!

摘要&#xff1a; 你是否曾被那些充滿想象力、畫面流暢的AI視頻所震撼&#xff1f;你是否也想親手創造出屬于自己的AI動畫&#xff1f;本文將為你提供一份“保姆級”的詳盡教程&#xff0c;從環境配置到參數調整&#xff0c;一步步帶你復現強大的Deforum Stable Diffusion模型&…

不同環境安裝配置redis

不同環境安裝配置redis windows 環境安裝redis redis所有下載地址 windows版本redis下載&#xff08;GitHub&#xff09;&#xff1a; https://github.com/tporadowski/redis/releases &#xff08;推薦使用&#xff09;https://github.com/MicrosoftArchive/redis/releases]官…

匯川Easy系列PLC算法系列(回溯法ST語言實現)

Easy系列PLC 3次多項式軌跡插補算法 Easy系列PLC 3次多項式軌跡插補算法(完整ST代碼)_plc連續插補算法-CSDN博客文章瀏覽閱讀122次。INbExecuteBOOLOFFOFF不保持1INrStartPosREAL0.0000000.000000不保持起始位置unit2INrEndPosREAL0.0000000.000000不保持結束位置unit3INrStar…

Linux C:構造數據類型

目錄 一、結構體&#xff08;struct&#xff09; 1.1類型定義 1.2 結構體變量定義 1.3 結構體元素初始化 1.4 結構體成員訪問 1.5 結構體的存儲&#xff08;內存對齊&#xff09; 1.6 結構體傳參 本文主要記錄了C語言中構造數據類型部分的內容&#xff0c;今天暫時只寫了…

Python:self

在Python面向對象編程中&#xff0c;self是一個指向類實例自身的引用參數&#xff1a;?1. 本質與作用??身份標識?&#xff1a;self是類實例化后對象的"身份證"&#xff0c;代表當前實例本身&#xff0c;用于區分不同實例的屬性和方法??自動傳遞?&#xff1a;調…