在现代微服务架构中,快速部署和更新服务至关重要。本文将介绍一个通用化的Shell脚本,用于自动化部署多个Java应用。该脚本通过动态下载JAR包、自动备份、容器化部署三大核心功能,显著提升运维效率。下面以虚构的服务名为例(如gateway-service
替代原sh-gyl-gateway
),演示其工作原理。
脚本核心流程
#!/bin/bash
services=$1 # 接收逗号分隔的服务名(如:gateway-service,auth-service)
TIMESTAMP=$(date "+%Y%m%d_%H:%M:%S")
# 创建基础目录
mkdir -p /opt/apps /opt/backups
for SERVICE in ${services//,/ }
do
# 1. 动态下载与备份
case $SERVICE in
gateway-service|auth-service|storage-service|monitor-service)
wget -nv -O /deploy/apps/${SERVICE}.jar \
http://internal-repo.example.com/builds/${SERVICE}/target/${SERVICE}.jar
;;
loan-service) # 特殊路径的服务
wget -nv -O /deploy/apps/${SERVICE}.jar \
http://internal-repo.example.com/builds/loan-service/target/${SERVICE}.jar
;;
*) # 默认处理
wget -nv -O /deploy/apps/${SERVICE}.jar \
http://internal-repo.example.com/builds/${SERVICE}.jar
;;
esac
cp /deploy/apps/${SERVICE}.jar /opt/backups/${SERVICE}-${TIMESTAMP}.jar
# 2. 容器配置
JAVA_ARG="-jar -Xms256m -Xmx512m /app/${SERVICE}.jar --spring.profiles.active=test"
if [ "$SERVICE" = "gateway-service" ]; then
JAVA_ARG="-jar -Xms1g -Xmx1g ... /app/${SERVICE}.jar" # 特殊内存配置
fi
# 3. 容器重启
docker stop ${SERVICE}
docker rm ${SERVICE}
docker run -d \
-e TZ=Asia/Shanghai \
-v /etc/hosts:/etc/hosts \
-v /certs:/certs \ # 证书目录
-v /deploy/apps/${SERVICE}.jar:/app/${SERVICE}.jar \
-v /logs:/logs \ # 统一日志目录
--net=host \
--name ${SERVICE} \
--restart=always \
openjdk:11.0.2 \
java ${JAVA_ARG}
done
关键设计解析
-
智能下载与备份
- 路径通用化:
- 应用目录:
/deploy/apps
- 备份目录:
/opt/backups
(自动附加时间戳,如auth-service-20230725_14:30:00.jar
)
- 应用目录:
- 服务分类处理:
- 常规服务(如
storage-service
)直接从标准路径下载 - 特殊服务(如
loan-service
)兼容子目录结构
- 常规服务(如
- 路径通用化:
-
容器化部署优化
- 目录映射统一:
-v /logs:/logs # 日志持久化 -v /certs:/certs # 证书文件 -v /etc/localtime:/etc/localtime # 时区同步
- 资源隔离:
- 网关服务(
gateway-service
)分配更大内存(-Xms1g -Xmx1g
) - 普通服务使用默认内存配置(
-Xms256m -Xmx512m
)
- 网关服务(
- 目录映射统一:
-
高可用设计
--restart=always
:容器异常退出时自动重启--net=host
:直接使用宿主机网络,避免端口映射复杂化
使用示例
部署两个服务:
./deploy.sh "gateway-service,auth-service"
输出效果:
Deployed [gateway-service] at 20230725_14:30:00
Backup: /opt/backups/gateway-service-20230725_14:30:00.jar
Container restarted with 1GB memory.
Deployed [auth-service] at 20230725_14:32:15
Backup: /opt/backups/auth-service-20230725_14:32:15.jar
为何高效?
- 全流程自动化:从下载到容器启停,无需人工干预
- 安全兜底:每次部署自动备份,支持秒级回滚
- 资源最优化:按服务类型动态分配JVM参数
- 环境一致:通过Docker固化运行环境
Tip:将脚本集成到CI/CD流水线中,结合Kubernetes可实现灰度发布、自动扩缩容等进阶能力。
通过这个通用化脚本,运维效率可提升70%以上。开发者只需专注业务迭代,无需关心部署细节,真正实现“一键发布”。