2026/3/24 17:55:01
网站建设
项目流程
ghostwin8网站奖别人做,网站建设 微信微博外包,python 网站开发 实例,云南旅游网站在SpringBoot应用的生产环境部署中#xff0c;传统的手动启停服务方式不仅效率低下#xff0c;还容易出错。今天分享一个功能强大的可视化服务管理脚本#xff0c;让SpringBoot应用的部署和运维变得简单高效。痛点分析#xff1a;传统部署方式的困扰相信很多开发者都遇到过…在SpringBoot应用的生产环境部署中传统的手动启停服务方式不仅效率低下还容易出错。今天分享一个功能强大的可视化服务管理脚本让SpringBoot应用的部署和运维变得简单高效。痛点分析传统部署方式的困扰相信很多开发者都遇到过这些问题操作繁琐每次部署都要手动执行一堆命令状态不明不知道服务是否真正启动成功日志分散查看日志需要记住各种路径回滚困难出问题时手忙脚乱找备份多服务管理微服务架构下管理复杂度倍增这些问题不仅影响开发效率还增加了生产环境的风险。解决方案可视化服务管理器为了解决这些痛点我开发了一套完整的SpringBoot服务管理解决方案核心特性包括 可视化操作界面告别枯燥的命令行操作采用彩色终端界面#################### SpringBoot服务管理器 #################### 当前时间: 2024-01-15 14:30:25 配置文件: /path/to/services.conf 日志目录: /path/to/logs 服务列表 序号 服务名称 端口 状态 ----------------------------------------------- 1 user-service 8080 运行中 (PID: 1234, Port: 8080) 2 order-service 8081 已停止 3 payment-service 8082 启动中 (PID: 5678) 界面直观清晰服务状态一目了然支持实时状态更新和彩色状态标识。 智能服务管理1. 配置驱动的服务管理通过简单的配置文件管理所有服务# services.conf 配置格式 # 服务名称|JAR路径|端口|环境|JVM参数 user-service|/opt/apps/user-service.jar|8080|prod|-Xms512m -Xmx1024m order-service|/opt/apps/order-service.jar|8081|prod|-Xms256m -Xmx512m这种配置方式的优势统一管理所有服务配置集中管理灵活配置支持不同JVM参数和环境配置易于维护修改配置无需改动脚本2. 智能启停机制优雅启动流程检查JAR文件 → 验证端口可用性 → 构建启动命令 → 后台启动服务 → 健康检查 → 状态确认安全停止流程发送TERM信号 → 等待优雅停止 → 超时强制终止 → 状态确认这种机制确保服务启停的可靠性避免了常见的端口占用和进程残留问题。 全方位监控功能1. 实时状态监控 服务详细信息 服务名称: user-service 运行状态: 运行中 (PID: 1234, Port: 8080) 内存使用: 345.6 MB CPU使用: 12.5% 启动时间: Dec 15 14:30 日志大小: 25.3M 2. 系统资源监控 系统资源信息 CPU使用率: 15.2% 内存使用: 4.2G / 8.0G 磁盘使用: 25G / 50G (52%) Java进程: 3个运行中 这些监控信息帮助运维人员及时发现性能瓶颈和资源问题。 智能日志管理支持多种日志查看方式实时跟踪tail -f实时查看最新日志历史查看查看指定行数的历史日志全文浏览使用less命令浏览完整日志日志轮转自动管理日志文件大小日志管理界面请选择查看方式: 1) 查看最后50行 2) 查看最后100行 3) 实时跟踪日志 4) 查看全部日志 批量操作支持微服务架构下批量操作必不可少 批量操作菜单 1) 启动所有服务 2) 停止所有服务 3) 重启所有服务 4) 查看所有服务状态 批量操作特别适用于系统重启后的服务恢复版本发布时的服务更新故障处理时的快速响应自动化部署解决方案除了服务管理还提供了完整的自动化部署脚本 一键部署流程./deploy.sh deploy app-1.0.0.jar部署流程包括1. 环境检查验证部署环境和依赖2. 版本备份自动备份当前运行版本3. 服务停止优雅停止当前服务4. 文件部署复制新版本到部署目录5. 服务启动启动新版本服务6. 健康检查验证服务是否正常运行7. 清理备份保留最近5个版本备份 安全回滚机制当部署出现问题时./deploy.sh rollback回滚流程• 自动查找最新备份版本• 停止问题版本服务• 恢复备份文件• 重启服务并验证这种设计确保了部署过程的安全性即使出现问题也能快速恢复。实战应用场景场景1微服务集群管理某电商公司有用户服务、订单服务、支付服务等10个微服务传统方式• 需要登录到每台服务器• 手动执行启停命令• 分别查看各服务日志• 耗时30分钟使用脚本后• 一个界面管理所有服务• 批量操作3分钟完成• 状态监控一目了然• 效率提升10倍场景2版本发布管理发布前# 查看当前所有服务状态 选择批量操作 → 查看所有服务状态发布过程# 逐个服务更新 ./deploy.sh deploy user-service-v2.0.jar ./deploy.sh deploy order-service-v2.0.jar发布验证# 健康检查和监控 ./deploy.sh health场景3故障应急处理当生产环境出现问题1. 快速定位通过状态监控快速识别问题服务2. 日志分析实时查看相关服务日志3. 紧急处理重启问题服务或快速回滚4. 影响评估查看系统资源使用情况最佳实践建议1. 配置管理• 使用版本控制管理配置文件• 不同环境使用不同的配置• 定期备份配置文件2. 监控告警• 配合监控系统使用• 设置关键指标告警• 建立故障处理流程3. 安全考虑• 限制脚本执行权限• 使用非root用户运行• 定期清理敏感日志4. 性能优化• 合理配置JVM参数• 监控服务资源使用• 定期优化配置参数总结这套基于SHELL的SpringBoot服务管理解决方案通过可视化界面、智能管理机制、资源监控和自动化部署可以极大提供服务管理效率。它不仅大大提升了运维效率还降低了操作风险特别适合单机多服务和小规模微服务架构的部署场景。如果你也在为SpringBoot应用的部署和管理而烦恼不妨试试这套解决方案。相信它会让你的运维工作变得更加轻松高效脚本附录springboot-service-manager#!/bin/bash # SpringBoot服务管理脚本 - 可视化版本 # 支持多个服务的启动、停止、重启、状态查看等功能 # 配置目录 SCRIPT_DIR$(cd $(dirname ${BASH_SOURCE[0]}) pwd) CONFIG_FILE$SCRIPT_DIR/services.conf LOG_DIR$SCRIPT_DIR/logs # 创建必要目录 mkdir -p $LOG_DIR # 颜色定义 RED\033[0;31m GREEN\033[0;32m YELLOW\033[1;33m BLUE\033[0;34m PURPLE\033[0;35m CYAN\033[0;36m WHITE\033[1;37m NC\033[0m # No Color # 加载服务配置 load_services() { if [[ ! -f $CONFIG_FILE ]]; then echo -e ${RED}配置文件不存在: $CONFIG_FILE${NC} echo 请先创建配置文件参考 services.conf.example exit 1 fi # 清空服务数组 unset SERVICE_NAMES unset SERVICE_PATHS unset SERVICE_PORTS unset SERVICE_PROFILES unset SERVICE_JVM_OPTS declare -g -a SERVICE_NAMES() declare -g -a SERVICE_PATHS() declare -g -a SERVICE_PORTS() declare -g -a SERVICE_PROFILES() declare -g -a SERVICE_JVM_OPTS() # 读取配置文件 while IFS| read -r name path port profile jvm_opts; do # 跳过注释和空行 [[ $name ~ ^#.*$ ]] continue [[ -z $name ]] continue SERVICE_NAMES($name) SERVICE_PATHS($path) SERVICE_PORTS($port) SERVICE_PROFILES($profile) SERVICE_JVM_OPTS($jvm_opts) done $CONFIG_FILE } # 获取服务PID get_service_pid() { local service_name$1 local port$2 # 先通过端口查找 if [[ -n $port ]]; then pid$(lsof -ti:$port 2/dev/null) if [[ -n $pid ]]; then echo $pid return fi fi # 通过jar文件名查找 pid$(ps aux | grep java | grep -v grep | grep $service_name | awk {print $2}) echo $pid } # 检查服务状态 check_service_status() { local index$1 local service_name${SERVICE_NAMES[$index]} local port${SERVICE_PORTS[$index]} local pid$(get_service_pid $service_name $port) if [[ -n $pid ]]; then # 检查端口是否可访问 if [[ -n $port ]] nc -z localhost $port 2/dev/null; then echo -e ${GREEN}运行中${NC} (PID: $pid, Port: $port) else echo -e ${YELLOW}启动中${NC} (PID: $pid) fi return 0 else echo -e ${RED}已停止${NC} return 1 fi } # 启动服务 start_service() { local index$1 local service_name${SERVICE_NAMES[$index]} local jar_path${SERVICE_PATHS[$index]} local port${SERVICE_PORTS[$index]} local profile${SERVICE_PROFILES[$index]} local jvm_opts${SERVICE_JVM_OPTS[$index]} echo -e ${BLUE}正在启动服务: $service_name${NC} # 检查jar文件是否存在 if [[ ! -f $jar_path ]]; then echo -e ${RED}错误: JAR文件不存在 - $jar_path${NC} return 1 fi # 检查服务是否已经运行 local pid$(get_service_pid $service_name $port) if [[ -n $pid ]]; then echo -e ${YELLOW}服务已经在运行中 (PID: $pid)${NC} return 0 fi # 构建启动命令 local cmdjava [[ -n $jvm_opts ]] cmd$cmd $jvm_opts [[ -n $profile ]] cmd$cmd -Dspring.profiles.active$profile cmd$cmd -jar $jar_path # 启动服务 local log_file$LOG_DIR/${service_name}.log nohup $cmd $log_file 21 local new_pid$! echo 启动命令: $cmd $log_file echo 启动时间: $(date) $log_file echo 进程PID: $new_pid $log_file echo ---------------------------------------- $log_file # 等待服务启动 echo -n 等待服务启动 for i in {1..30}; do sleep 1 echo -n . if [[ -n $port ]] nc -z localhost $port 2/dev/null; then echo echo -e ${GREEN}服务启动成功!${NC} (PID: $new_pid, Port: $port) return 0 fi done echo echo -e ${YELLOW}服务已启动但端口检查超时${NC} (PID: $new_pid) echo 请查看日志文件: $log_file return 0 } # 停止服务 stop_service() { local index$1 local service_name${SERVICE_NAMES[$index]} local port${SERVICE_PORTS[$index]} echo -e ${BLUE}正在停止服务: $service_name${NC} local pid$(get_service_pid $service_name $port) if [[ -z $pid ]]; then echo -e ${YELLOW}服务未运行${NC} return 0 fi # 优雅停止 echo 发送TERM信号... kill -TERM $pid # 等待服务停止 echo -n 等待服务停止 for i in {1..15}; do sleep 1 echo -n . if ! kill -0 $pid 2/dev/null; then echo echo -e ${GREEN}服务已停止${NC} return 0 fi done # 强制停止 echo echo 优雅停止超时强制停止... kill -KILL $pid 2/dev/null sleep 2 if ! kill -0 $pid 2/dev/null; then echo -e ${GREEN}服务已强制停止${NC} return 0 else echo -e ${RED}服务停止失败${NC} return 1 fi } # 重启服务 restart_service() { local index$1 local service_name${SERVICE_NAMES[$index]} echo -e ${BLUE}正在重启服务: $service_name${NC} stop_service $index sleep 2 start_service $index } # 查看服务日志 view_service_log() { local index$1 local service_name${SERVICE_NAMES[$index]} local log_file$LOG_DIR/${service_name}.log if [[ ! -f $log_file ]]; then echo -e ${RED}日志文件不存在: $log_file${NC} return 1 fi echo -e ${BLUE}查看服务日志: $service_name${NC} echo 日志文件: $log_file echo ---------------------------------------- # 选择查看方式 echo 请选择查看方式: echo 1) 查看最后50行 echo 2) 查看最后100行 echo 3) 实时跟踪日志 echo 4) 查看全部日志 echo 0) 返回主菜单 read -p 请输入选择 [1-4]: log_choice case $log_choice in 1) tail -50 $log_file ;; 2) tail -100 $log_file ;; 3) echo 按 CtrlC 退出实时跟踪 sleep 2 tail -f $log_file ;; 4) less $log_file ;; 0) return ;; *) echo -e ${RED}无效选择${NC} ;; esac } # 显示服务详细信息 show_service_detail() { local index$1 local service_name${SERVICE_NAMES[$index]} local jar_path${SERVICE_PATHS[$index]} local port${SERVICE_PORTS[$index]} local profile${SERVICE_PROFILES[$index]} local jvm_opts${SERVICE_JVM_OPTS[$index]} clear echo -e ${CYAN} 服务详细信息 ${NC} echo -e ${WHITE}服务名称:${NC} $service_name echo -e ${WHITE}JAR路径:${NC} $jar_path echo -e ${WHITE}端口号:${NC} ${port:-未配置} echo -e ${WHITE}环境配置:${NC} ${profile:-默认} echo -e ${WHITE}JVM参数:${NC} ${jvm_opts:-默认} local pid$(get_service_pid $service_name $port) echo -e ${WHITE}运行状态:${NC} $(check_service_status $index) if [[ -n $pid ]]; then echo -e ${WHITE}进程PID:${NC} $pid echo -e ${WHITE}内存使用:${NC} $(ps -p $pid -o rss | awk {printf %.1f MB, $1/1024}) echo -e ${WHITE}CPU使用:${NC} $(ps -p $pid -o %cpu | awk {print $1%}) echo -e ${WHITE}启动时间:${NC} $(ps -p $pid -o lstart | awk {print $1 $2 $3 $4}) fi local log_file$LOG_DIR/${service_name}.log if [[ -f $log_file ]]; then echo -e ${WHITE}日志文件:${NC} $log_file echo -e ${WHITE}日志大小:${NC} $(du -h $log_file | awk {print $1}) fi echo -e ${CYAN}${NC} echo read -p 按回车键返回主菜单... } # 显示系统资源使用情况 show_system_info() { clear echo -e ${CYAN} 系统资源信息 ${NC} # CPU使用率 cpu_usage$(top -bn1 | grep Cpu(s) | awk {print $2} | sed s/%us,//) echo -e ${WHITE}CPU使用率:${NC} ${cpu_usage}% # 内存使用情况 memory_info$(free -h | grep Mem) total_mem$(echo $memory_info | awk {print $2}) used_mem$(echo $memory_info | awk {print $3}) echo -e ${WHITE}内存使用:${NC} $used_mem / $total_mem # 磁盘使用情况 echo -e ${WHITE}磁盘使用:${NC} df -h | grep -E ^/dev/ | awk {printf %s: %s / %s (%s)\n, $1, $3, $2, $5} # Java进程信息 echo -e ${WHITE}Java进程:${NC} ps aux | grep java | grep -v grep | while read line; do pid$(echo $line | awk {print $2}) mem$(echo $line | awk {print $4}) cmd$(echo $line | awk {for(i11;iNF;i) printf %s , $i; print }) echo PID: $pid, MEM: ${mem}%, CMD: ${cmd:0:50}... done echo -e ${CYAN}${NC} echo read -p 按回车键返回主菜单... } # 批量操作菜单 batch_operations_menu() { while true; do clear echo -e ${PURPLE} 批量操作菜单 ${NC} echo 1) 启动所有服务 echo 2) 停止所有服务 echo 3) 重启所有服务 echo 4) 查看所有服务状态 echo 0) 返回主菜单 echo -e ${PURPLE}${NC} read -p 请输入选择 [0-4]: batch_choice case $batch_choice in 1) echo -e ${BLUE}正在启动所有服务...${NC} for ((i0; i${#SERVICE_NAMES[]}; i)); do start_service $i echo done read -p 按回车键继续... ;; 2) echo -e ${BLUE}正在停止所有服务...${NC} for ((i0; i${#SERVICE_NAMES[]}; i)); do stop_service $i echo done read -p 按回车键继续... ;; 3) echo -e ${BLUE}正在重启所有服务...${NC} for ((i0; i${#SERVICE_NAMES[]}; i)); do restart_service $i echo done read -p 按回车键继续... ;; 4) clear echo -e ${CYAN} 所有服务状态 ${NC} printf %-20s %-10s %-15s\n 服务名称 端口 状态 echo ------------------------------------------------------ for ((i0; i${#SERVICE_NAMES[]}; i)); do status$(check_service_status $i) printf %-20s %-10s %s\n ${SERVICE_NAMES[$i]} ${SERVICE_PORTS[$i]} $status done echo -e ${CYAN}${NC} read -p 按回车键继续... ;; 0) break ;; *) echo -e ${RED}无效选择请重新输入${NC} sleep 1 ;; esac done } # 服务管理菜单 service_management_menu() { local index$1 local service_name${SERVICE_NAMES[$index]} while true; do clear echo -e ${CYAN} 服务管理: $service_name ${NC} echo -e 当前状态: $(check_service_status $index) echo echo 1) 启动服务 echo 2) 停止服务 echo 3) 重启服务 echo 4) 查看日志 echo 5) 服务详情 echo 0) 返回主菜单 echo -e ${CYAN}${NC} read -p 请输入选择 [0-5]: service_choice case $service_choice in 1) start_service $index read -p 按回车键继续... ;; 2) stop_service $index read -p 按回车键继续... ;; 3) restart_service $index read -p 按回车键继续... ;; 4) view_service_log $index ;; 5) show_service_detail $index ;; 0) break ;; *) echo -e ${RED}无效选择请重新输入${NC} sleep 1 ;; esac done } # 主菜单 main_menu() { while true; do clear echo -e ${GREEN}#################### SpringBoot服务管理器 ####################${NC} echo -e ${WHITE}当前时间: $(date %Y-%m-%d %H:%M:%S)${NC} echo -e ${WHITE}配置文件: $CONFIG_FILE${NC} echo -e ${WHITE}日志目录: $LOG_DIR${NC} echo # 显示服务列表和状态 if [[ ${#SERVICE_NAMES[]} -eq 0 ]]; then echo -e ${RED}未找到任何服务配置${NC} else echo -e ${CYAN} 服务列表 ${NC} printf %-3s %-20s %-10s %-15s\n 序号 服务名称 端口 状态 echo ----------------------------------------------- for ((i0; i${#SERVICE_NAMES[]}; i)); do status$(check_service_status $i) printf %-3s %-20s %-10s %s\n $((i1)) ${SERVICE_NAMES[$i]} ${SERVICE_PORTS[$i]} $status done echo -e ${CYAN}${NC} fi echo echo 操作选项: echo 1-${#SERVICE_NAMES[]}) 管理对应服务 echo b) 批量操作 echo s) 系统信息 echo r) 重新加载配置 echo q) 退出程序 echo -e ${GREEN}#########################################################${NC} read -p 请输入选择: main_choice case $main_choice in [1-9]|[1-9][0-9]) index$((main_choice-1)) if [[ $index -ge 0 $index -lt ${#SERVICE_NAMES[]} ]]; then service_management_menu $index else echo -e ${RED}无效的服务序号${NC} sleep 1 fi ;; b|B) batch_operations_menu ;; s|S) show_system_info ;; r|R) echo -e ${BLUE}重新加载配置文件...${NC} load_services echo -e ${GREEN}配置加载完成${NC} sleep 1 ;; q|Q) echo -e ${GREEN}感谢使用SpringBoot服务管理器${NC} exit 0 ;; *) echo -e ${RED}无效选择请重新输入${NC} sleep 1 ;; esac done } # 检查依赖命令 check_dependencies() { local missing_deps() command -v java /dev/null 21 || missing_deps(java) command -v lsof /dev/null 21 || missing_deps(lsof) command -v nc /dev/null 21 || missing_deps(netcat) if [[ ${#missing_deps[]} -ne 0 ]]; then echo -e ${RED}错误: 缺少必要的命令工具${NC} echo 请安装以下工具: ${missing_deps[*]} echo echo Ubuntu/Debian: sudo apt-get install openjdk-8-jdk lsof netcat echo CentOS/RHEL: sudo yum install java-1.8.0-openjdk lsof nc exit 1 fi } # 主程序入口 main() { # 检查依赖 check_dependencies # 加载服务配置 load_services # 显示欢迎信息 clear echo -e ${GREEN} echo ######################################################## echo # # echo # SpringBoot服务管理器 v1.0 # echo # # echo # 支持多服务管理、日志查看、状态监控 # echo # # echo ######################################################## echo -e ${NC} sleep 2 # 启动主菜单 main_menu } # 脚本执行入口 if [[ ${BASH_SOURCE[0]} ${0} ]]; then main $ fiservices.conf# SpringBoot服务配置文件 # 格式: 服务名称|JAR文件路径|端口号|Profile环境|JVM参数 # 示例配置请根据实际情况修改 # 测试服务 serveless-core|/opt/apps/serverless-core-1.0.0.jar|8080|prod|-Xms512m -Xmx1024m -XX:UseG1GC # 注意事项: # 1. 每行一个服务配置 # 2. 使用 | 分隔各个字段 # 3. JAR文件路径必须是绝对路径 # 4. 端口号用于健康检查 # 5. Profile环境可以为空默认使用default # 6. JVM参数可以为空使用默认配置 # 7. 以#开头的行为注释行deploy.sh# SpringBoot服务部署脚本 # 自动化部署和管理SpringBoot应用 #!/bin/bash # 部署配置 APP_NAMEserverless-core APP_VERSION1.0.0 JAR_NAME${APP_NAME}-${APP_VERSION}.jar DEPLOY_DIR/opt/apps BACKUP_DIR/opt/backups SERVICE_PORT8080 PROFILEprod # JVM参数配置 JVM_OPTS-Xms512m -Xmx1024m -XX:UseG1GC -XX:MaxGCPauseMillis200 JVM_OPTS$JVM_OPTS -XX:PrintGC -XX:PrintGCDetails -XX:PrintGCTimeStamps JVM_OPTS$JVM_OPTS -Xloggc:$DEPLOY_DIR/logs/gc.log -XX:UseGCLogFileRotation JVM_OPTS$JVM_OPTS -XX:NumberOfGCLogFiles5 -XX:GCLogFileSize10M # 颜色定义 RED\033[0;31m GREEN\033[0;32m YELLOW\033[1;33m BLUE\033[0;34m NC\033[0m # 创建必要目录 setup_directories() { echo -e ${BLUE}创建部署目录...${NC} mkdir -p $DEPLOY_DIR mkdir -p $DEPLOY_DIR/logs mkdir -p $BACKUP_DIR echo -e ${GREEN}目录创建完成${NC} } # 备份当前版本 backup_current_version() { if [[ -f $DEPLOY_DIR/$JAR_NAME ]]; then echo -e ${BLUE}备份当前版本...${NC} local backup_file$BACKUP_DIR/${JAR_NAME}.$(date %Y%m%d_%H%M%S).bak cp $DEPLOY_DIR/$JAR_NAME $backup_file echo -e ${GREEN}备份完成: $backup_file${NC} fi } # 部署新版本 deploy_new_version() { local jar_file$1 if [[ ! -f $jar_file ]]; then echo -e ${RED}错误: JAR文件不存在 - $jar_file${NC} return 1 fi echo -e ${BLUE}部署新版本...${NC} # 停止当前服务 ./springboot-service-manager.sh stop $APP_NAME 2/dev/null || true # 等待服务完全停止 sleep 3 # 复制新版本 cp $jar_file $DEPLOY_DIR/$JAR_NAME chmod x $DEPLOY_DIR/$JAR_NAME echo -e ${GREEN}部署完成${NC} } # 健康检查 health_check() { local max_attempts30 local attempt0 echo -e ${BLUE}进行健康检查...${NC} while [[ $attempt -lt $max_attempts ]]; do if curl -s -f http://localhost:$SERVICE_PORT/actuator/health /dev/null 21; then echo -e ${GREEN}健康检查通过${NC} return 0 fi attempt$((attempt 1)) echo -n . sleep 2 done echo echo -e ${RED}健康检查失败${NC} return 1 } # 回滚到上一版本 rollback() { echo -e ${YELLOW}开始回滚...${NC} # 查找最新的备份文件 local latest_backup$(ls -t $BACKUP_DIR/${JAR_NAME}.*.bak 2/dev/null | head -1) if [[ -z $latest_backup ]]; then echo -e ${RED}没有找到备份文件${NC} return 1 fi echo -e ${BLUE}回滚到: $latest_backup${NC} # 停止当前服务 ./springboot-service-manager.sh stop $APP_NAME 2/dev/null || true sleep 3 # 恢复备份 cp $latest_backup $DEPLOY_DIR/$JAR_NAME # 启动服务 ./springboot-service-manager.sh start $APP_NAME # 健康检查 if health_check; then echo -e ${GREEN}回滚成功${NC} else echo -e ${RED}回滚后健康检查失败${NC} return 1 fi } # 完整部署流程 full_deploy() { local jar_file$1 echo -e ${GREEN}开始部署 $APP_NAME${NC} echo JAR文件: $jar_file echo 部署目录: $DEPLOY_DIR echo 服务端口: $SERVICE_PORT echo 环境配置: $PROFILE echo ---------------------------------------- # 创建目录 setup_directories # 备份当前版本 backup_current_version # 部署新版本 if ! deploy_new_version $jar_file; then echo -e ${RED}部署失败${NC} return 1 fi # 启动服务 echo -e ${BLUE}启动服务...${NC} ./springboot-service-manager.sh start $APP_NAME # 健康检查 if health_check; then echo -e ${GREEN}部署成功${NC} # 清理旧备份保留最近5个 echo -e ${BLUE}清理旧备份...${NC} ls -t $BACKUP_DIR/${JAR_NAME}.*.bak 2/dev/null | tail -n 6 | xargs rm -f echo -e ${GREEN}清理完成${NC} else echo -e ${RED}部署失败开始回滚...${NC} rollback return 1 fi } # 显示使用帮助 show_help() { echo SpringBoot应用部署脚本 echo echo 用法: echo $0 deploy jar-file - 部署新版本 echo $0 rollback - 回滚到上一版本 echo $0 health - 健康检查 echo $0 setup - 初始化部署环境 echo echo 示例: echo $0 deploy app-1.0.0.jar echo $0 rollback } # 主程序 main() { case ${1:-} in deploy) if [[ -z ${2:-} ]]; then echo -e ${RED}错误: 请指定JAR文件${NC} show_help exit 1 fi full_deploy $2 ;; rollback) rollback ;; health) health_check ;; setup) setup_directories ;; *) show_help ;; esac } main $