Skip to content

实操题参考答案 · Spring Demo 部署指南

本文用于指导学员在培训环境中部署 Spring Demo。镜像和 Spring Demo 全量工程包由讲师统一准备,学员不需要在服务器上克隆源码、执行 Maven 打包或构建 Docker 镜像。

部署流程:

  1. 登录考试环境。
  2. 确认个人 Demo 工程目录和学员编号。
  3. 修改 APP_NAME 和宿主机端口。
  4. 检查名称、端口和目录是否冲突。
  5. 进入 deploy 部署目录并执行 bash deploy.sh local
  6. 在服务器本机验证容器和测试接口。

1. 培训环境

1.1 账号信息

项目信息
用户名train_user
密码Train@1234
Web 地址https://jps.yelinksaas.com
SSH 地址jps.yelinksaas.com:8422

1.2 登录考试环境

  1. 登录堡垒机。
  2. 进入讲师指定的考试环境3考试环境4
  3. 切换到 root 用户。

登录跳板机

选择考试环境

bash
sudo su

后续命令均在目标考试环境中以 root 用户执行。

2. 学员资源分配

本次培训约有 30~40 名学员。每名学员必须使用自己的编号、应用名和宿主机端口,禁止复用他人的配置。

2.1 分配规则

学员编号统一使用两位数字:

配置规则示例:01号学员
Demo 工程目录/opt/partner/train/deploy-<两位编号>/opt/partner/train/deploy-01
部署目录/opt/partner/train/deploy-<两位编号>/deploy/opt/partner/train/deploy-01/deploy
APP_NAMEtrain-<两位编号>train-01
HOST_PORT38100 + 学员编号38101
HOST_LOG_DIR/opt/partner/data/${APP_NAME}/logs/opt/partner/data/train-01/logs

端口范围为 38101~38140

学员编号APP_NAMEHOST_PORT
01train-0138101
05train-0538105
10train-1038110
20train-2038120
30train-3038130
40train-4038140

必须使用讲师分配的编号。不要自行选择空闲端口,否则可能与其他学员后续部署冲突。

3. 复制并检查 Demo 工程包

讲师会将公共 Spring Demo 工程包放到 /opt/partner/deploy。学员从公共工程包复制自己的个人 Demo 工程目录,讲师不预先创建个人目录。以下命令以 01 号学员为例,其他学员必须替换编号。

bash
mkdir -p /opt/partner/train
test -d /opt/partner/deploy
test ! -e /opt/partner/train/deploy-01
cp -a /opt/partner/deploy /opt/partner/train/deploy-01
cd /opt/partner/train/deploy-01
test -d deploy
cd deploy
pwd
ls -la

确认当前目录为 /opt/partner/train/deploy-01/deploy,且至少包含:

text
.env
deploy.sh
docker-compose.yml
variables.env

执行检查:

bash
for file in .env deploy.sh docker-compose.yml variables.env; do
  test -f "$file" || echo "缺少文件:$file"
done

如果复制命令、部署目录检查或文件检查失败,停止操作并联系讲师,不要从其他学员目录复制文件。

部署目录中的镜像仓库和版本由讲师统一维护。除非讲师明确通知,否则不要修改 .env

4. 修改个人实例参数

推荐使用一键命令修改本人部署目录中的 deploy.sh。以下命令以 01 号学员为例,其他学员只需要修改第一行 STUDENT_NO

bash
STUDENT_NO=01
APP_NAME="train-${STUDENT_NO}"
HOST_PORT="$((38100 + 10#${STUDENT_NO}))"
perl -0pi -e "s/^APP_NAME=.*/APP_NAME=\"${APP_NAME}\"/m; s/^HOST_PORT=.*/HOST_PORT=\"${HOST_PORT}\"/m; s|^HOST_LOG_DIR=.*|HOST_LOG_DIR=\"/opt/partner/data/\\\${APP_NAME}/logs\"|m" deploy.sh
grep -E '^(APP_NAME|HOST_PORT|HOST_LOG_DIR)=' deploy.sh

01 号学员执行后应看到:

bash
APP_NAME="train-01"
HOST_PORT="38101"
HOST_LOG_DIR="/opt/partner/data/${APP_NAME}/logs"

如果不使用一键命令,也可以手工编辑 deploy.sh

bash
vi deploy.sh

手工修改时,只修改顶部以下三项配置:

bash
APP_NAME="train-01"
HOST_PORT="38101"
HOST_LOG_DIR="/opt/partner/data/${APP_NAME}/logs"

修改后保存,并执行:

bash
grep -E '^(APP_NAME|HOST_PORT|HOST_LOG_DIR)=' deploy.sh

确认三项配置均属于本人。

禁止修改

  • 不要修改容器内端口 38104
  • 不要修改镜像名 yelink-demo
  • 不要修改 docker-compose.yml
  • 不要修改 variables.env 中由部署脚本生成的公共中间件地址。
  • 不要修改他人的 Demo 工程目录、部署目录、容器、工作目录或配置目录。

APP_NAME 会同时作为 Spring 应用名、Nacos 服务名、Compose Service Name 和容器名。名称只能包含小写字母、数字和中划线。

5. 部署前冲突检查

以下命令仍以 01 号学员为例。

5.1 检查端口

bash
ss -tlnp | grep ':38101 '

无输出表示端口当前未被监听。有输出时不要更换随机端口,先核对学员编号并联系讲师。

5.2 检查容器名

bash
docker ps -a --filter "name=^/train-01$" --format '{{.Names}}'

首次部署应无输出。如果输出 train-01,说明本人的容器已存在,先确认是否属于之前的部署。

5.3 检查脚本工作目录

Demo 工程目录位于 /opt/partner/train/deploy-01,部署目录位于 /opt/partner/train/deploy-01/deploy,脚本生成的运行工作目录位于 /opt/partner/train-01,三者不是同一个目录。

bash
ls -ld /opt/partner/train-01 /opt/partner/config/train-01 2>/dev/null

首次部署应无输出。已有目录时,prepare 会停止以保护现有配置,不要直接删除。

5.4 检查公共配置

bash
test -f /opt/config/common-variables.env \
  && echo "公共配置存在" \
  || echo "公共配置缺失,请联系讲师"

公共配置由培训环境统一提供,学员不要自行创建或修改。

6. 一键部署

确认当前位于本人的部署目录:

bash
cd /opt/partner/train/deploy-01/deploy
bash deploy.sh local

脚本会自动完成:

  1. 校验应用名、端口和日志目录。
  2. 读取培训环境公共配置。
  3. 生成个人应用配置和 Compose 配置。
  4. 同步实例化后的 deploy.sh 到运行工作目录。
  5. 拉取讲师指定的镜像。
  6. 启动容器。
  7. 等待健康检查通过。
  8. 输出访问地址、日志目录和配置路径。

部署成功时,终端会显示“已同步部署脚本到工作目录”“容器健康检查通过”和部署摘要。

7. 验证部署

以下命令以 01 号学员为例。

7.1 查看容器状态

bash
docker ps --filter "name=^/train-01$"
docker inspect -f 'image={{.Config.Image}} status={{.State.Status}} health={{.State.Health.Status}}' train-01

容器状态应为 running,健康状态应为 healthy

7.2 直连应用验证

bash
curl -f "http://127.0.0.1:38101/api/log-test/simple?message=hello"

请求成功并返回包含 statusmessagetimestamp 的 JSON 数据,说明应用已经启动且接口可用。

7.3 通过网关验证

应用启动后会以 APP_NAME 注册到 Nacos。网关读取 Nacos 中的服务信息,并根据应用名称自动生成路由规则:

text
https://127.0.0.1:8301/<APP_NAME>/<应用接口路径>

01 号学员使用以下命令验证。培训网关使用自签名证书,curl 调用 HTTPS 网关时必须带 -k

bash
APP_NAME=train-01
curl -k -f "https://127.0.0.1:8301/${APP_NAME}/api/log-test/simple?message=hello"

其他学员只替换 APP_NAME,例如 15 号学员使用 APP_NAME=train-15。如果刚部署完成后网关首次返回 500404,先等待 20~30 秒再重试。应用注册到 Nacos 后,网关自动路由可能需要短暂刷新时间。

该请求先进入网关,再由网关根据路径中的 train-01 找到 Nacos 中的同名服务并转发到应用。请求返回与直连接口一致的 JSON 数据,说明 Nacos 注册和网关自动路由均正常。

路径中的应用名称必须与 deploy.sh 配置的 APP_NAME 完全一致。培训环境网络不支持从学员电脑直接访问应用或网关,必须登录目标考试环境后在服务器本机执行验证命令。

7.4 查看日志

bash
docker logs --tail 200 train-01
docker logs --tail 200 -f train-01

Ctrl+C 退出持续日志查看,不会停止容器。

应用日志同时写入:

text
/opt/partner/data/train-01/logs/

8. 故障处理与清理

8.1 常见问题

现象原因处理方式
APP_NAME 校验失败名称包含大写字母、下划线或格式错误改为 train-<两位编号>
端口已被监听编号或端口填写错误,或旧实例仍在运行核对 HOST_PORT,不要随机换端口
工作目录已存在本人之前执行过部署确认旧实例后按卸载流程处理
容器已存在同名实例已经创建查看容器状态和日志,不要删除他人容器
公共配置缺失培训环境未准备完成联系讲师,不要手工伪造配置
健康检查超时中间件连接、镜像或应用启动异常查看 docker logs --tail 200 <APP_NAME>

首次部署时,部署脚本日志位于个人部署目录的 deploy_logs/ 目录。后续如果从运行工作目录执行卸载,卸载日志位于运行工作目录的 deploy_logs/ 目录。

8.2 卸载本人实例

仅在确认 APP_NAME、容器和目录均属于本人后执行:

bash
cd /opt/partner/train-01
bash deploy.sh uninstall

卸载会删除:

  • /opt/partner/train-01
  • /opt/partner/config/train-01

部署成功后,脚本会把已配置好的 deploy.sh 同步到 /opt/partner/train-01/deploy.sh。因此即使不回到 /opt/partner/train/deploy-01/deploy,也可以在运行工作目录内卸载本人实例。

卸载会保留应用日志目录:

text
/opt/partner/data/train-01/

修正参数后可以重新执行:

bash
bash deploy.sh local

8.3 培训结束清理

先卸载本人实例,再由讲师统一确认是否删除个人 Demo 工程目录和日志目录。不要删除 /opt/partner 根目录,不要使用通配符删除个人 Demo 工程目录、工作目录、配置或日志目录。

9. 完成标准

满足以下条件即部署完成:

  • APP_NAMEHOST_PORT 与本人学员编号一致。
  • 容器状态为 running
  • 容器健康状态为 healthy
  • 服务器本机直连 /api/log-test/simple 成功。
  • 通过网关的 /${APP_NAME}/api/log-test/simple 调用成功。
  • 未修改或影响其他学员的容器、端口和目录。

基于 MIT 许可发布