From 3e73b6c086b0f708edf0ee3b5ee24a6582e29572 Mon Sep 17 00:00:00 2001 From: zhangjf Date: Sun, 22 Feb 2026 15:46:09 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E8=84=9A=E6=9C=AC=E6=94=AF=E6=8C=81?= =?UTF-8?q?=E5=A4=9A=E7=A7=9F=E6=88=B7=E5=AE=9E=E4=BE=8B=E9=83=A8=E7=BD=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - env.properties新增APP_NAME、INSTANCE_NAME、TENANT_ID配置 - APP_NAME: 服务名称(对应JAR文件名) - INSTANCE_NAME: 实例名称(区分多租户实例,用于日志目录和PID文件) - TENANT_ID: 租户标识(用于Nacos元数据路由) - start.sh传递spring.application.name和TENANT_ID参数 - stop.sh和status.sh同步支持INSTANCE_NAME --- scripts/env.properties | 11 ++++++++ scripts/start.sh | 63 ++++++++++++++++++++++++++++++------------ scripts/status.sh | 27 ++++++++++++++---- scripts/stop.sh | 32 +++++++++++++++------ 4 files changed, 101 insertions(+), 32 deletions(-) diff --git a/scripts/env.properties b/scripts/env.properties index b1e8e82..33e756d 100644 --- a/scripts/env.properties +++ b/scripts/env.properties @@ -3,6 +3,17 @@ # 服务启动时会加载此文件 # ============================================ +# -------------------------------------------- +# 服务标识配置 +# -------------------------------------------- +# 服务名称(对应JAR文件名,如fund-sys) +APP_NAME=fund-sys +# 实例名称(用于区分多租户实例,如fund-sys-shared, fund-sys-vip001) +# 默认与APP_NAME相同,多租户模式下需要修改 +INSTANCE_NAME=${APP_NAME} +# 租户标识(多租户模式使用,用于Nacos元数据路由) +TENANT_ID= + # -------------------------------------------- # Nacos配置(所有服务共用) # -------------------------------------------- diff --git a/scripts/start.sh b/scripts/start.sh index e0a6343..34710a6 100755 --- a/scripts/start.sh +++ b/scripts/start.sh @@ -1,35 +1,57 @@ #!/bin/bash # 服务启动脚本 -# 自动从目录名推断服务名称 +# 支持多租户模式:同一服务可部署多个实例(数据库连接不同) -# 获取脚本所在目录和服务名 +# 获取脚本所在目录 SCRIPT_DIR=$(dirname "$(readlink -f "$0")") APP_HOME=$(dirname "$SCRIPT_DIR") -APP_NAME=$(basename "$APP_HOME") -# 日志目录 -LOG_HOME="/datacfs/applogs/${APP_NAME}" +# 加载环境变量配置(优先从env.properties读取) +if [ -f "${APP_HOME}/conf/env.properties" ]; then + # 读取APP_NAME和INSTANCE_NAME + while IFS='=' read -r key value; do + # 跳过注释和空行 + [[ "$key" =~ ^#.*$ ]] && continue + [[ -z "$key" ]] && continue + # 去除前后空格 + key=$(echo "$key" | xargs) + value=$(echo "$value" | xargs) + # 导出环境变量 + export "$key=$value" + done < "${APP_HOME}/conf/env.properties" +fi -# JAR文件路径 +# 服务名称(对应JAR文件名,从env.properties读取或从目录名推断) +APP_NAME=${APP_NAME:-$(basename "$APP_HOME")} + +# 实例名称(用于区分多租户实例,默认与APP_NAME相同) +INSTANCE_NAME=${INSTANCE_NAME:-${APP_NAME}} + +# 日志目录(使用INSTANCE_NAME区分不同实例) +LOG_HOME="/datacfs/applogs/${INSTANCE_NAME}" + +# JAR文件路径(使用APP_NAME找JAR) JAR_FILE="${APP_HOME}/lib/${APP_NAME}.jar" -# PID文件路径 -PID_FILE="${APP_HOME}/${APP_NAME}.pid" - -# 加载环境变量配置(如果存在) -if [ -f "${APP_HOME}/conf/env.properties" ]; then - source "${APP_HOME}/conf/env.properties" -fi +# PID文件路径(使用INSTANCE_NAME) +PID_FILE="${APP_HOME}/${INSTANCE_NAME}.pid" # JVM参数(可通过环境变量覆盖) JAVA_OPTS="${JAVA_OPTS:--Xms256m -Xmx512m -XX:+UseG1GC -XX:MaxGCPauseMillis=200}" # 日志参数(从env.properties读取或使用默认值) -LOG_OPTS="-Dlogging.file.path=${LOG_HOME} -DAPP_NAME=${APP_NAME}" +LOG_OPTS="-Dlogging.file.path=${LOG_HOME}" +LOG_OPTS="$LOG_OPTS -Dspring.application.name=${APP_NAME}" LOG_OPTS="$LOG_OPTS -Dlogging.level.root=${LOG_LEVEL_ROOT:-INFO}" LOG_OPTS="$LOG_OPTS -Dlogging.level.app=${LOG_LEVEL_APP:-DEBUG}" LOG_OPTS="$LOG_OPTS -Dlogging.pattern.console=${LOG_PATTERN}" +# 多租户参数 +TENANT_OPTS="" +if [ -n "${TENANT_ID}" ]; then + TENANT_OPTS="-DTENANT_ID=${TENANT_ID}" +fi + # 配置文件路径 CONFIG_OPTS="--spring.config.location=${APP_HOME}/conf/application.yml" @@ -37,7 +59,7 @@ CONFIG_OPTS="--spring.config.location=${APP_HOME}/conf/application.yml" if [ -f "$PID_FILE" ]; then PID=$(cat $PID_FILE) if ps -p $PID > /dev/null 2>&1; then - echo "${APP_NAME} is already running (PID: $PID)" + echo "${INSTANCE_NAME} is already running (PID: $PID)" exit 1 fi fi @@ -46,13 +68,18 @@ fi mkdir -p ${LOG_HOME} # 启动服务 -echo "Starting ${APP_NAME}..." +echo "Starting ${INSTANCE_NAME}..." +echo " APP_NAME: ${APP_NAME}" +echo " INSTANCE_NAME: ${INSTANCE_NAME}" echo " APP_HOME: ${APP_HOME}" echo " LOG_HOME: ${LOG_HOME}" echo " JAVA_OPTS: ${JAVA_OPTS}" +if [ -n "${TENANT_ID}" ]; then + echo " TENANT_ID: ${TENANT_ID}" +fi -nohup java $JAVA_OPTS $LOG_OPTS -jar $JAR_FILE $CONFIG_OPTS > /dev/null 2>&1 & +nohup java $JAVA_OPTS $LOG_OPTS $TENANT_OPTS -jar $JAR_FILE $CONFIG_OPTS > /dev/null 2>&1 & # 保存PID echo $! > $PID_FILE -echo "${APP_NAME} started (PID: $(cat $PID_FILE))" +echo "${INSTANCE_NAME} started (PID: $(cat $PID_FILE))" diff --git a/scripts/status.sh b/scripts/status.sh index 4a28efd..526fae5 100755 --- a/scripts/status.sh +++ b/scripts/status.sh @@ -1,17 +1,31 @@ #!/bin/bash # 查看服务状态 -# 自动从目录名推断服务名称 +# 支持多租户模式 -# 获取脚本所在目录和服务名 +# 获取脚本所在目录 SCRIPT_DIR=$(dirname "$(readlink -f "$0")") APP_HOME=$(dirname "$SCRIPT_DIR") -APP_NAME=$(basename "$APP_HOME") + +# 加载环境变量配置 +if [ -f "${APP_HOME}/conf/env.properties" ]; then + while IFS='=' read -r key value; do + [[ "$key" =~ ^#.*$ ]] && continue + [[ -z "$key" ]] && continue + key=$(echo "$key" | xargs) + value=$(echo "$value" | xargs) + export "$key=$value" + done < "${APP_HOME}/conf/env.properties" +fi + +# 服务名称和实例名称 +APP_NAME=${APP_NAME:-$(basename "$APP_HOME")} +INSTANCE_NAME=${INSTANCE_NAME:-${APP_NAME}} # PID文件路径 -PID_FILE="${APP_HOME}/${APP_NAME}.pid" +PID_FILE="${APP_HOME}/${INSTANCE_NAME}.pid" echo "==========================================" -echo " Service: ${APP_NAME}" +echo " Service: ${INSTANCE_NAME}" echo "==========================================" if [ -f "$PID_FILE" ]; then @@ -20,6 +34,9 @@ if [ -f "$PID_FILE" ]; then echo -e "Status: \033[32mRUNNING\033[0m" echo "PID: ${PID}" echo "Home: ${APP_HOME}" + if [ -n "${TENANT_ID}" ]; then + echo "Tenant: ${TENANT_ID}" + fi echo "" # 显示进程信息 ps -p $PID -o pid,ppid,%cpu,%mem,etime,cmd --no-headers 2>/dev/null diff --git a/scripts/stop.sh b/scripts/stop.sh index 047a468..11817e0 100755 --- a/scripts/stop.sh +++ b/scripts/stop.sh @@ -1,30 +1,44 @@ #!/bin/bash # 服务停止脚本 -# 自动从目录名推断服务名称 +# 支持多租户模式 -# 获取脚本所在目录和服务名 +# 获取脚本所在目录 SCRIPT_DIR=$(dirname "$(readlink -f "$0")") APP_HOME=$(dirname "$SCRIPT_DIR") -APP_NAME=$(basename "$APP_HOME") + +# 加载环境变量配置 +if [ -f "${APP_HOME}/conf/env.properties" ]; then + while IFS='=' read -r key value; do + [[ "$key" =~ ^#.*$ ]] && continue + [[ -z "$key" ]] && continue + key=$(echo "$key" | xargs) + value=$(echo "$value" | xargs) + export "$key=$value" + done < "${APP_HOME}/conf/env.properties" +fi + +# 服务名称和实例名称 +APP_NAME=${APP_NAME:-$(basename "$APP_HOME")} +INSTANCE_NAME=${INSTANCE_NAME:-${APP_NAME}} # PID文件路径 -PID_FILE="${APP_HOME}/${APP_NAME}.pid" +PID_FILE="${APP_HOME}/${INSTANCE_NAME}.pid" # 检查是否运行 if [ ! -f "$PID_FILE" ]; then - echo "${APP_NAME} is not running" + echo "${INSTANCE_NAME} is not running" exit 0 fi PID=$(cat $PID_FILE) if ! ps -p $PID > /dev/null 2>&1; then - echo "${APP_NAME} is not running" + echo "${INSTANCE_NAME} is not running" rm -f $PID_FILE exit 0 fi # 停止服务 -echo "Stopping ${APP_NAME} (PID: $PID)..." +echo "Stopping ${INSTANCE_NAME} (PID: $PID)..." kill $PID # 等待停止 @@ -37,9 +51,9 @@ done # 强制停止 if ps -p $PID > /dev/null 2>&1; then - echo "Force killing ${APP_NAME}..." + echo "Force killing ${INSTANCE_NAME}..." kill -9 $PID fi rm -f $PID_FILE -echo "${APP_NAME} stopped" +echo "${INSTANCE_NAME} stopped"