SpringBoot数十Jar包批量生产部署落地实施方案(Shell+Systemd完整版)
一、方案整体概述
1.1 适用场景
本地存在数十个独立SpringBoot Jar包,单/少量生产服务器部署,无需容器化、低成本、快速落地,支持批量更新、批量启停、版本备份回滚、开机自启、故障自动重启,适配中小型项目运维场景。
1.2 方案核心优势
- 无需修改业务代码,原有Jar包直接复用
- 纯Shell脚本+Systemd,无中间件依赖,服务器资源占用极低
- 标准化目录、标准化启停、标准化备份,杜绝部署混乱
- 支持批量全量部署、单个服务更新、一键回滚版本
- 服务崩溃自动重启、服务器开机自启,满足生产基础高可用
1.3 环境前置要求
- 生产服务器:CentOS 7+/Ubuntu 18.04+
- 统一JDK环境:JDK8/JDK11(全员统一版本,本机与生产一致)
- 服务器可联网、支持SSH远程连接、开启SFTP文件上传
- 拥有服务器root或sudo权限
二、第一步:生产服务器环境初始化(必做)
2.1 安装并配置统一JDK
全程使用统一JDK版本,避免环境不一致导致启动异常,以JDK11为例:
|------------------------------------------------------------------------------------------------------------------------------|
| bash # CentOS安装JDK11 yum install -y java-11-openjdk-devel # Ubuntu安装JDK11 apt install -y openjdk-11-jdk # 验证版本 java -version |
2.2 创建专用运维用户(禁止root运行业务)
|---------------------------------------------------------------------------------------------------------------------------------------------|
| bash # 创建普通用户app,统一运行业务 useradd app # 设置密码(自定义) passwd app # 赋予app用户sudo权限(方便运维操作) usermod -aG wheel app # 切换到app用户,后续所有部署操作均使用该用户 su - app |
2.3 搭建统一标准化目录结构
所有服务统一目录规范,杜绝散乱部署,执行以下命令一键创建所有目录:
|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| bash # 基础根目录 mkdir -p /opt/app/{bin,apps,deploy,backup,logs,temp} # 目录说明 # /opt/app/bin :所有运维脚本存放目录 # /opt/app/apps :所有服务Jar、配置文件运行目录 # /opt/app/deploy :本地上传新包的临时部署目录 # /opt/app/backup :历史版本Jar备份目录(用于回滚) # /opt/app/logs :全局日志汇总目录 # /opt/app/temp :临时文件目录 |
三、第二步:本地文件标准化整理(核心前置)
将本地几十个Jar包统一规整,适配批量部署规则,避免部署出错。
3.1 统一服务命名规范
所有服务名称统一小写、中划线分隔,无特殊字符,示例:user-service、order-service、gateway-service。
3.2 本地文件夹规整结构
本地新建总文件夹 local-deploy,内部每个服务独立子文件夹,结构如下:
|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| Plain Text local-deploy/ ├── user-service/ │ ├── user-service.jar # 业务jar包 │ └── application-prod.yml # 生产环境配置文件(外置,不打包进jar) ├── order-service/ │ ├── order-service.jar │ └── application-prod.yml ├── goods-service/ └── ...(剩余所有服务) |
3.3 配置文件强制外置
所有服务的生产配置application-prod.yml全部外置,不打入Jar包,后续改配置无需重新打包,直接修改服务器文件即可,降低运维成本。
四、第三步:服务器批量运维脚本部署(核心)
在服务器/opt/app/bin目录下创建4个核心脚本,覆盖部署、启停、回滚、状态检查全能力。
4.1 脚本1:批量部署更新脚本 deploy.sh
功能:自动备份旧包、替换新Jar和配置、保留历史版本、避免丢包
|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| bash #!/bin/bash # 批量部署SpringBoot服务脚本 APP_BASE="/opt/app" DEPLOY_DIR="{APP_BASE}/deploy" BACKUP_DIR="{APP_BASE}/backup" TIMESTAMP=(date +%Y%m%d_%H%M%S) echo "=====================================" echo "开始批量部署,部署时间戳:{TIMESTAMP}" echo "=====================================" # 遍历部署目录下所有服务文件夹 for SERVICE_DIR in {DEPLOY_DIR}/\*/; do # 截取服务名 SERVICE_NAME=(basename {SERVICE_DIR%/}) TARGET_DIR="{APP_BASE}/apps/{SERVICE_NAME}" # 跳过空目录 if \[ ! -d "{SERVICE_DIR}" ]; then continue fi echo "【正在部署】{SERVICE_NAME}" # 1. 创建服务运行目录 mkdir -p {TARGET_DIR} # 2. 备份旧版本Jar(存在才备份) if -f "${TARGET_DIR}/${SERVICE_NAME}.jar" ; then mkdir -p {BACKUP_DIR}/{SERVICE_NAME} cp {TARGET_DIR}/{SERVICE_NAME}.jar {BACKUP_DIR}/{SERVICE_NAME}/{SERVICE_NAME}_{TIMESTAMP}.jar echo "✅ 已备份{SERVICE_NAME}历史版本" fi # 3. 替换新Jar包 cp {SERVICE_DIR}/*.jar {TARGET_DIR}/{SERVICE_NAME}.jar # 4. 替换生产配置文件 cp {SERVICE_DIR}/application-prod.yml {TARGET_DIR}/application-prod.yml echo "✅ {SERVICE_NAME}文件更新完成" done echo "=====================================" echo "所有文件更新完成,即将批量重启服务" echo "=====================================" # 执行批量重启脚本 {APP_BASE}/bin/restart_all.sh echo "�� 批量部署任务执行完毕" |
4.2 脚本2:批量重启脚本 restart_all.sh
功能:遍历所有服务,逐个重启Systemd服务,避免暴力停机
|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| bash #!/bin/bash APP_BASE="/opt/app" APP_DIR="{APP_BASE}/apps" echo "开始批量重启所有SpringBoot服务..." for SERVICE_DIR in {APP_DIR}/*/; do SERVICE_NAME=(basename {SERVICE_DIR%/}) # 仅重启已注册systemd的服务 if systemctl list-unit-files | grep -q "{SERVICE_NAME}.service"; then echo "重启服务:{SERVICE_NAME}" systemctl restart ${SERVICE_NAME} # 等待2秒,避免并发启动端口冲突 sleep 2 fi done echo "✅ 所有服务重启指令执行完成" echo "可执行 systemctl status 服务名 查看启动状态" |
4.3 脚本3:批量停止脚本 stop_all.sh
|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| bash #!/bin/bash APP_BASE="/opt/app" APP_DIR="{APP_BASE}/apps" echo "开始批量停止所有服务..." for SERVICE_DIR in {APP_DIR}/*/; do SERVICE_NAME=(basename {SERVICE_DIR%/}) if systemctl list-unit-files | grep -q "{SERVICE_NAME}.service"; then echo "停止服务:{SERVICE_NAME}" systemctl stop ${SERVICE_NAME} fi done echo "✅ 所有服务已全部停止" |
4.4 脚本4:版本一键回滚脚本 rollback.sh
功能:部署出错时,一键回滚到上一个版本Jar包
|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| bash #!/bin/bash # 使用方式:./rollback.sh 服务名 时间戳 # 示例:./rollback.sh user-service 20250909_103000 APP_BASE="/opt/app" SERVICE_NAME=1 ROLLBACK_TS=2 if -z "${SERVICE_NAME}" || -z "${ROLLBACK_TS}" ; then echo "用法错误!" echo "正确用法:./rollback.sh 服务名 备份时间戳" echo "示例:./rollback.sh user-service 20250909_103000" exit 1 fi BACKUP_JAR="{APP_BASE}/backup/{SERVICE_NAME}/{SERVICE_NAME}_{ROLLBACK_TS}.jar" TARGET_JAR="{APP_BASE}/apps/{SERVICE_NAME}/{SERVICE_NAME}.jar" if \[ ! -f "{BACKUP_JAR}" ]; then echo "❌ 未找到对应备份版本!" exit 1 fi # 覆盖回滚 cp {BACKUP_JAR} {TARGET_JAR} # 重启对应服务 systemctl restart {SERVICE_NAME} echo "✅ {SERVICE_NAME} 已回滚至${ROLLBACK_TS}版本并重启" |
4.5 赋予脚本执行权限
全部脚本创建完成后,执行以下命令授权,永久生效:
|----------------------------------|
| bash chmod +x /opt/app/bin/*.sh |
五、第四步:Systemd服务批量注册(关键步骤)
通过统一模板为几十个服务生成开机自启、故障自愈的Systemd服务配置,无需逐个手动编写。
5.1 Systemd统一模板规范
每个服务的systemd文件统一存放至/etc/systemd/system/,模板如下(可直接复用):
|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| ini Unit Description=%I SpringBoot Service After=network.target Service # 运行用户 User=app Group=app # 服务工作目录 WorkingDirectory=/opt/app/apps/%I # 启动命令(统一JVM参数,可根据服务器配置调整) ExecStart=/usr/bin/java -Xms256m -Xmx512m -jar %I.jar --spring.profiles.active=prod # 停止参数 SuccessExitStatus=143 # 故障自动重启 Restart=on-failure RestartSec=5 Install WantedBy=multi-user.target |
5.2 批量创建Systemd服务实操(两种方式)
方式一:少量服务(手动创建,1分钟3-5个)
以user-service为例,创建/etc/systemd/system/user-service.service,粘贴上述模板,无需修改参数,文件名与服务名一致即可。
方式二:几十服务批量自动生成(推荐,极速落地)
编写批量生成脚本,一次性生成所有服务的systemd配置,只需填写所有服务名:
|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| bash #!/bin/bash # 批量生成systemd服务文件 SERVICE_LIST=("user-service" "order-service" "goods-service" "gateway-service") # 此处替换为你所有的服务名 for SERVICE in {SERVICE_LIST\[@\]}; do cat \> /etc/systemd/system/{SERVICE}.service << EOF Unit Description={SERVICE} SpringBoot Service After=network.target \[Service\] User=app Group=app WorkingDirectory=/opt/app/apps/{SERVICE} ExecStart=/usr/bin/java -Xms256m -Xmx512m -jar ${SERVICE}.jar --spring.profiles.active=prod SuccessExitStatus=143 Restart=on-failure RestartSec=5 Install WantedBy=multi-user.target EOF done echo "✅ 所有服务systemd配置批量生成完成" |
执行脚本后,所有服务自启配置自动生成,无需手动操作。
5.3 加载服务并开启开机自启
|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| bash # 重新加载系统服务配置 systemctl daemon-reload # 批量设置开机自启(遍历所有服务) SERVICE_LIST=("user-service" "order-service" "goods-service" "gateway-service") for SERVICE in {SERVICE_LIST\[@\]}; do systemctl enable {SERVICE} done echo "✅ 所有服务已开启开机自启" |
六、第五步:正式批量部署上线(完整上线流程)
6.1 本地上传文件到生产服务器
将本地规整好的 local-deploy 内所有服务文件夹,整体上传至服务器 /opt/app/deploy/ 目录,保证目录结构一致。
上传方式:Xshell/SFTP、FinalShell、rzsz命令均可,上传后服务器目录:/opt/app/deploy/每个服务名/jar+yml。
6.2 执行一键批量部署
|----------------------------------------------------|
| bash # 进入脚本目录 cd /opt/app/bin # 执行批量部署 ./deploy.sh |
脚本自动完成:备份旧包、替换新文件、批量重启服务,全程无需人工干预。
6.3 逐个校验服务启动状态
|--------------------------------------------------------------------------------------------------------------------------------------------------|
| bash # 查看单个服务状态 systemctl status user-service # 查看服务实时日志(排查启动异常) journalctl -fu user-service # 批量查看所有服务运行状态 systemctl list-units | grep service |
七、第六步:日常运维操作手册(生产常用)
7.1 日常更新部署(迭代更新)
- 本地更新Jar/配置,保持原有文件夹结构
- 上传至服务器/opt/app/deploy/覆盖对应服务文件夹
- 执行 /opt/app/bin/deploy.sh 一键更新重启
7.2 版本回滚操作(部署失败应急)
- 进入备份目录查看历史版本时间戳:ls /opt/app/backup/对应服务名/
- 执行回滚脚本:/opt/app/bin/rollback.sh 服务名 时间戳
- 示例:/opt/app/bin/rollback.sh user-service 20250909_103000
7.3 启停服务命令
|---------------------------------------------------------------------------------------------------------------------------|
| bash # 批量停止所有服务 /opt/app/bin/stop_all.sh # 批量重启所有服务 /opt/app/bin/restart_all.sh # 单个服务启停 systemctl start/stop/restart 服务名 |
八、生产保障优化配置(必配)
8.1 防火墙放行端口
所有服务端口统一放行,避免外部无法访问:
|--------------------------------------------------------------------------------------------|
| bash # 放行单个端口示例 firewall-cmd --permanent --add-port=8080/tcp # 重载防火墙 firewall-cmd --reload |
8.2 统一日志规范
所有服务配置日志输出路径至/opt/app/logs/服务名/,统一归集,方便排查问题,避免日志散落。
8.3 服务器开机自启校验
重启服务器测试:reboot,重启后执行systemctl list-units | grep service,确认所有服务自动启动成功。
九、方案落地总结
本方案全程无代码改造、无容器依赖,通过标准化目录+批量脚本+Systemd托管,完美适配数十个SpringBoot Jar包的批量部署场景。首次部署完成后,后续所有迭代更新、启停、回滚均为一键操作,极大降低运维成本,同时满足生产环境的稳定性、自愈性、可回滚性,是中小规模多服务部署的最优轻量方案。
批量生成 systemd 服务文件脚本
使用说明:
- 修改脚本里
SERVICE_LIST数组,把你全部服务名称填进去(服务名必须和 jar 包名称保持一致,小写、中划线,不要空格)- 服务器执行需要 root 权限,因为要写入
/etc/systemd/system/- 脚本会自动生成每个服务对应的
xxx.service文件- 执行完脚本后,执行
systemctl daemon-reload加载配置,再批量 enable 开机自启
#!/bin/bash
# batch-gen-systemd.sh
# 批量生成springboot服务systemd单元文件
# 执行方式:sudo bash batch-gen-systemd.sh
# ========== 在这里填写你所有的服务名称 ==========
SERVICE_LIST=(
"user-service"
"order-service"
"goods-service"
"gateway-service"
"file-service"
"message-service"
"pay-service"
"auth-service"
"log-service"
"monitor-service"
# 继续追加剩下所有服务,一行一个,双引号包裹
)
# ===============================================
for SERVICE in "${SERVICE_LIST[@]}"; do
cat > /etc/systemd/system/${SERVICE}.service << EOF
[Unit]
Description=${SERVICE} SpringBoot Service
After=network.target
[Service]
User=app
Group=app
WorkingDirectory=/opt/app/apps/${SERVICE}
ExecStart=/usr/bin/java -Xms256m -Xmx512m -jar ${SERVICE}.jar --spring.profiles.active=prod
SuccessExitStatus=143
Restart=on-failure
RestartSec=5
[Install]
WantedBy=multi-user.target
EOF
echo "已生成:/etc/systemd/system/${SERVICE}.service"
done
echo "=============================="
echo "✅ 全部systemd服务文件生成完成!"
echo "接下来执行两条命令:"
echo "systemctl daemon-reload"
echo "然后执行下面批量enable脚本开启开机自启"
批量 enable 开机自启脚本
脚本内
SERVICE_LIST和上面保持一模一样,复制粘贴,名字:batch-enable.sh
#!/bin/bash
# batch-enable.sh
# 批量设置服务开机自启
SERVICE_LIST=(
"user-service"
"order-service"
"goods-service"
"gateway-service"
"file-service"
"message-service"
"pay-service"
"auth-service"
"log-service"
"monitor-service"
# 和上面列表保持一致
)
for SERVICE in "${SERVICE_LIST[@]}"; do
systemctl enable ${SERVICE}
echo "已设置开机自启:${SERVICE}"
done
echo "✅ 全部服务开机自启配置完成"
配套:批量检查所有服务状态脚本 batch-status.sh
日常运维一键查看全部服务是否 running
#!/bin/bash
# batch-status.sh
SERVICE_LIST=(
"user-service"
"order-service"
"goods-service"
"gateway-service"
"file-service"
"message-service"
"pay-service"
"auth-service"
"log-service"
"monitor-service"
)
for SERVICE in "${SERVICE_LIST[@]}"; do
echo "==================== ${SERVICE} ===================="
systemctl status ${SERVICE} --no-pager
done
使用完整操作步骤
-
在服务器
/opt/app/bin创建三个文件,分别粘贴上面三段代码cd /opt/app/bin
vim batch-gen-systemd.sh
vim batch-enable.sh
vim batch-status.sh -
授权
chmod +x batch-gen-systemd.sh batch-enable.sh batch-status.sh
-
执行生成 systemd 配置(需要 sudo)
sudo ./batch-gen-systemd.sh
-
重载 systemd
sudo systemctl daemon-reload
-
批量开启开机自启
sudo ./batch-enable.sh
-
校验全部服务状态
./batch-status.sh