在linux服务器上平滑发布(蓝绿发布)java项目,不影响现有业务运行

news/2024/10/6 1:25:44/文章来源:https://www.cnblogs.com/wyxazgye/p/18288412

具体操作

  1. 使用nginx作为负载均衡,配置upstream(注意修改项目名)
    upstream 项目名 {server localhost:7008 max_fails=3 fail_timeout=30s;server localhost:7009 max_fails=3 fail_timeout=30s;}
  1. 启动命令(注意修改jar位置及端口号),后修改为start.sh并开放权限
#!/bin/shRESOURCE_NAME=你的jar具体位置
#默认端口号
DEFAULT_PORT=7008
#另一端口号
ALTERNATE_PORT=7009
STARTUP_TIMEOUT=60  # 等待新服务启动的超时时间(秒)
CHECK_INTERVAL=2    # 检查间隔时间(秒)check_port() {netstat -tuln | grep ":$1 " > /dev/nullreturn $?
}start_app() {PORT=$1nohup java -Xms256m -Xmx512m -jar $RESOURCE_NAME --spring.profiles.active=prod --server.port=$PORT > nohup_$PORT.out 2>&1 &echo $! > tpid_$PORTecho "应用程序启动成功,使用端口 $PORT"
}wait_for_startup() {PORT=$1TIMEOUT=$2INTERVAL=$3START_TIME=$(date +%s)while [ $(($(date +%s) - $START_TIME)) -lt $TIMEOUT ]; docheck_port $PORTif [ $? -eq 0 ]; thenecho "端口 $PORT 的应用程序已启动"return 0fiecho "等待端口 $PORT 的应用程序启动..."sleep $INTERVALdoneecho "等待超时,端口 $PORT 的应用程序未启动"return 1
}stop_app() {PORT=$1tpid=$(ps -ef | grep $RESOURCE_NAME | grep $PORT | grep -v grep | grep -v kill | awk '{print $2}')if [ -n "$tpid" ]; thenecho "停止进程,端口 $PORT, PID: $tpid..."kill -15 $tpidsleep 5tpid=$(ps -ef | grep $RESOURCE_NAME | grep $PORT | grep -v grep | grep -v kill | awk '{print $2}')if [ -n "$tpid" ]; thenecho "强制终止进程,PID: $tpid..."kill -9 $tpidelseecho "进程停止成功!"fielseecho "未找到端口 $PORT 的进程停止。"fi
}# 检查默认端口是否被占用
check_port $DEFAULT_PORT
if [ $? -eq 0 ]; thenecho "端口 $DEFAULT_PORT 已被占用,使用端口 $ALTERNATE_PORT 启动应用程序"start_app $ALTERNATE_PORTif wait_for_startup $ALTERNATE_PORT $STARTUP_TIMEOUT $CHECK_INTERVAL; thenecho "停止使用端口 $DEFAULT_PORT 的应用程序"stop_app $DEFAULT_PORTelseecho "备用端口的应用程序启动失败,保持原服务运行"fi
elseecho "端口 $DEFAULT_PORT 未被占用,使用该端口启动应用程序"start_app $DEFAULT_PORTif wait_for_startup $DEFAULT_PORT $STARTUP_TIMEOUT $CHECK_INTERVAL; thenecho "停止使用端口 $ALTERNATE_PORT 的应用程序"stop_app $ALTERNATE_PORTelseecho "默认端口的应用程序启动失败,保持备用服务运行"fi
fiecho "服务切换完成!"

说明:

启动应用程序:start_app 函数启动应用程序,并指定使用的端口。
等待应用程序完全启动:
wait_for_startup 函数会在指定的超时时间内轮询检查指定端口是否已经开始监听(应用程序是否已完全启动)。
这个函数会每 CHECK_INTERVAL 秒检查一次端口,直到超过 STARTUP_TIMEOUT 秒。
停止旧的应用程序:只有在新的应用程序完全启动后,才会停止旧的应用程序。
超时处理:如果在指定时间内新服务未能启动,将会输出相应的信息,并保留原服务继续运行。
使用说明:
STARTUP_TIMEOUT:等待新服务启动的最大时间(秒)。
CHECK_INTERVAL:检查新服务是否启动的间隔时间(秒)。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/739746.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

《已解决》无法将“pip”项识别为 cmdlet、函数、脚本文件或可运行程序的名称

原因: Python 环境未正确配置:可能你没有将 Python 添加到系统的环境变量中。 你需要手动将 Python 的安装目录(以及包含 pip.exe 的文件夹)添加到系统的环境变量 PATH 中。解决: 1. 找到python的安装目录 键盘按下 win键+R键, 输入cmd回车。 随后输入 where pythonwhe…

最新扣子(Coze)实战案例:图像流工具之空间风格化,完全免费教程

🧙‍♂️ 大家好,我是斜杠君,手把手教你搭建扣子AI应用。 📜 本教程是《AI应用开发系列教程之扣子(Coze)实战教程》,完全免费学习。 👀 免费扣子Coze教程地址:https://www.bzfree.com/如果想学习AI应用搭建,请关注公众号,及时获取最新免费教程。 上节课讲了人像风格…

认识终端和shell

【教程】在macOS上用VSCode写C++代码 4 认识终端和shell 内建程序与内建命令 打开终端,其实相当于打开了shell。shell 可以运行一些程序(例如 sayhello、 /bin/mkdir )。 shell自身也带着一些程序(二进制可执行文件),这些程序就叫内建程序。 特点:调用shell内建程序的时…

LVGL一键打包图片工具,全部图片打包成一个bin文件,支持nor flash XIP模式下直接访问数据显示

最近做工程项目,需要用到LVGL,但是搜了很长时间没有看到合适的图片打包工具,大多都是生成数组或者单个的bin文件,这样烧录到nor flash很麻烦 后来看到一篇博客,博主的想法与我类似,不过他后面部分就做的麻烦了,所以,我直接从头写了一个工具,他的博客地址:https://www…

mini-lsm通关笔记-字符相关操作

本文捋一下mini-lsm中的字符相关操作[u8] Vec<u8> Bytes Buf KeySlice KeyBytes[u8]和Vec<u8> 这两个是rust内置的数据类型。 [u8]: 切片本身并不拥有数据,而是引用了数据。它由一个指向数组开始处的指针和一个表示数组长度的计数器组成。[u8]类型通常写作&[u…

张高兴的 MicroPython 入门指南:(二)GPIO 的使用

目录什么是 GPIO使用方法使用微动开关点亮板载 LED硬件需求电路代码参考 什么是 GPIO GPIO 是 General Purpose Input Output 的缩写,即“通用输入输出”。 Raspberry Pi Pico 左右两侧各有一列 GPIO 引脚, Pico 通过这两列引脚进行一些硬件上的扩展,与传感器进行交互等等。…

MySQL-17.其他数据日志

C-17.其他数据日志 在之前的数据库事务的章节中,已经讲过,redo log和undo log。 对于线上数据库应用系统,突然遭遇数据库宕机怎么办?在这种情况下,定位宕机的原因就非常关键。我们可以查看数据库的错误日志。因为日志中记录了数据库运行中的诊断信息,包括了错误,警告和注…

如何恢复SSD NVME固态硬盘的数据恢复

一、使用数据恢复软件 操作步骤(以EaseUS Data Recovery Wizard为例): 安装软件:从EaseUS官网或其他可靠来源下载并安装EaseUS Data Recovery Wizard。 连接固态硬盘:将SSD NVMe固态硬盘连接到电脑上,并确保系统能够识别。 启动软件并选择恢复选项:打开EaseUS Data Reco…

raid5存储池已损毁硬盘数据

RAID 5存储池中的硬盘数据损毁是一个复杂的问题,因为它涉及到数据的冗余、存储方式以及恢复策略。 一、RAID 5的工作原理 RAID 5是一种使用条带化和奇偶校验技术的存储解决方案,它至少需要三个硬盘来构建。在这种配置中,数据和奇偶校验信息被分布在所有硬盘上,以提供数据冗…

SSD NVME固态 硬盘 数据恢复

SSD NVMe固态硬盘数据恢复是一个复杂但并非不可能的任务,以下是一些建议的方法和步骤: 一、了解数据恢复的基本原理 数据恢复的基本原理在于,即使文件在操作系统中被删除或格式化,其实际数据在硬盘的物理介质上可能仍然存在,只是被标记为可覆盖。 SSD NVMe固态硬盘与传统的…

磁盘阵列中raid5坏了一个硬盘数据恢复

RAID5数据恢复步骤包括备份数据、更换故障硬盘、重建RAID阵列和数据恢复注意事项。在恢复过程中,需遵循正确的步骤并保持冷静,不要尝试自行解决复杂的数据恢复问题,以免造成不可逆转的数据损失。完成恢复后,应进行完整性检查和验证。 一、概述 RAID 5是一种存储配置,它将多…

电脑开机检测不到硬盘怎么办 电脑检测不到硬盘问题解决

电脑开机检测不到硬盘,无法进入系统或者显示“Reboot and Select proper Boot device”等错误信息。这种情况可能会导致我们的数据丢失或者无法使用电脑。 一、电脑检测不到硬盘的可能原因 电脑检测不到硬盘的原因主要有以下几种:1、硬盘连接线松动或损坏:硬盘是通过SATA线或…