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 # 验证版本 |
2.2 创建专用运维用户(禁止root运行业务)
|
bash # 切换到app用户,后续所有部署操作均使用该用户 |
2.3 搭建统一标准化目录结构
所有服务统一目录规范,杜绝散乱部署,执行以下命令一键创建所有目录:
|
bash # 目录说明 |
三、第二步:本地文件标准化整理(核心前置)
将本地几十个Jar包统一规整,适配批量部署规则,避免部署出错。
3.1 统一服务命名规范
所有服务名称统一小写、中划线分隔,无特殊字符,示例:user-service、order-service、gateway-service。
3.2 本地文件夹规整结构
本地新建总文件夹 local-deploy,内部每个服务独立子文件夹,结构如下:
|
Plain Text |
3.3 配置文件强制外置
所有服务的生产配置application-prod.yml全部外置,不打入Jar包,后续改配置无需重新打包,直接修改服务器文件即可,降低运维成本。
四、第三步:服务器批量运维脚本部署(核心)
在服务器/opt/app/bin目录下创建4个核心脚本,覆盖部署、启停、回滚、状态检查全能力。
4.1 脚本1:批量部署更新脚本 deploy.sh
功能:自动备份旧包、替换新Jar和配置、保留历史版本、避免丢包
|
bash echo "=====================================" # 遍历部署目录下所有服务文件夹 # 跳过空目录 echo "【正在部署】${SERVICE_NAME}" # 1. 创建服务运行目录 echo "=====================================" # 执行批量重启脚本 echo "�� 批量部署任务执行完毕" |
4.2 脚本2:批量重启脚本 restart_all.sh
功能:遍历所有服务,逐个重启Systemd服务,避免暴力停机
|
bash echo "开始批量重启所有SpringBoot服务…" for SERVICE_DIR in ${APP_DIR}/*/; do echo "✅ 所有服务重启指令执行完成" |
4.3 脚本3:批量停止脚本 stop_all.sh
|
bash echo "开始批量停止所有服务…" for SERVICE_DIR in ${APP_DIR}/*/; do echo "✅ 所有服务已全部停止" |
4.4 脚本4:版本一键回滚脚本 rollback.sh
功能:部署出错时,一键回滚到上一个版本Jar包
|
bash if [ -z "${SERVICE_NAME}" ] || [ -z "${ROLLBACK_TS}" ]; then BACKUP_JAR="${APP_BASE}/backup/${SERVICE_NAME}/${SERVICE_NAME}_${ROLLBACK_TS}.jar" if [ ! -f "${BACKUP_JAR}" ]; then # 覆盖回滚 |
4.5 赋予脚本执行权限
全部脚本创建完成后,执行以下命令授权,永久生效:
|
bash |
五、第四步:Systemd服务批量注册(关键步骤)
通过统一模板为几十个服务生成开机自启、故障自愈的Systemd服务配置,无需逐个手动编写。
5.1 Systemd统一模板规范
每个服务的systemd文件统一存放至/etc/systemd/system/,模板如下(可直接复用):
|
ini [Service] [Install] |
5.2 批量创建Systemd服务实操(两种方式)
方式一:少量服务(手动创建,1分钟3-5个)
以user-service为例,创建/etc/systemd/system/user-service.service,粘贴上述模板,无需修改参数,文件名与服务名一致即可。
方式二:几十服务批量自动生成(推荐,极速落地)
编写批量生成脚本,一次性生成所有服务的systemd配置,只需填写所有服务名:
|
bash for SERVICE in ${SERVICE_LIST[@]}; do [Service] [Install] echo "✅ 所有服务systemd配置批量生成完成" |
执行脚本后,所有服务自启配置自动生成,无需手动操作。
5.3 加载服务并开启开机自启
|
bash # 批量设置开机自启(遍历所有服务) echo "✅ 所有服务已开启开机自启" |
六、第五步:正式批量部署上线(完整上线流程)
6.1 本地上传文件到生产服务器
将本地规整好的 local-deploy 内所有服务文件夹,整体上传至服务器 /opt/app/deploy/ 目录,保证目录结构一致。
上传方式:Xshell/SFTP、FinalShell、rzsz命令均可,上传后服务器目录:/opt/app/deploy/每个服务名/jar+yml。
6.2 执行一键批量部署
|
bash |
脚本自动完成:备份旧包、替换新文件、批量重启服务,全程无需人工干预。
6.3 逐个校验服务启动状态
|
bash # 查看服务实时日志(排查启动异常) # 批量查看所有服务运行状态 |
七、第六步:日常运维操作手册(生产常用)
7.1 日常更新部署(迭代更新)
7.2 版本回滚操作(部署失败应急)
7.3 启停服务命令
|
bash # 批量重启所有服务 # 单个服务启停 |
八、生产保障优化配置(必配)
8.1 防火墙放行端口
所有服务端口统一放行,避免外部无法访问:
|
bash |
8.2 统一日志规范
所有服务配置日志输出路径至/opt/app/logs/服务名/,统一归集,方便排查问题,避免日志散落。
8.3 服务器开机自启校验
重启服务器测试:reboot,重启后执行systemctl list-units | grep service,确认所有服务自动启动成功。
九、方案落地总结
本方案全程无代码改造、无容器依赖,通过标准化目录+批量脚本+Systemd托管,完美适配数十个SpringBoot Jar包的批量部署场景。首次部署完成后,后续所有迭代更新、启停、回滚均为一键操作,极大降低运维成本,同时满足生产环境的稳定性、自愈性、可回滚性,是中小规模多服务部署的最优轻量方案。
批量生成 systemd 服务文件脚本
使用说明:
#!/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
使用完整操作步骤
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
sudo ./batch-gen-systemd.sh
sudo systemctl daemon-reload
sudo ./batch-enable.sh
./batch-status.sh


