欢迎光临
我们一直在努力

SpringBoot数十Jar包批量生产部署落地实施方案(Shell+Systemd完整版)

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

    赞(0)
    未经允许不得转载:171主机测评 » SpringBoot数十Jar包批量生产部署落地实施方案(Shell+Systemd完整版)
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址