SpringCloud部署Shell方式
练手脚本别太当真
脱离docker方式直接部署在服务器上
八个jar服务:registry, gateway,task, system, server_name, app, jar1, jar2
四个应用服务:nginx, vsftpd, redis, mysqld
脚本已脱敏,centos7使用,centos6的话只需要修改vsftpd mysql等应用服务的启动方式即可
脚本功能:server的一键安装(子脚本)、运行、重启
#!/usr/bin/env sh
server_name_dir=/opt/server_name/service/
redis_dir=/usr/local/redis/
jdk_dir=/usr/lib/jvm
HELP() {
echo "NAME:
server_name - 命令行工具, 用于快速部署安装server_name平台.
USAGE:
server_name command [options] service_name
COMMANDS:
create 创建并启动服务, 部署新环境或清空后用该指令
clear 慎用:清空已安装资源 (卸载应用服务,保留数据)
start 启动指定服务
restart 重启指定服务
stop 关闭指定服务
***后接 all 指所有服务
--help, -h Shows a list of commands or help for one command
SERVICE:
gateway, server_name, jar1, app, task, system, registry, nginx, vsftpd, redis, mysqld
"
}
[[ $# -eq 0 || "$1" == "-h" || "$1" == "--help" ]] && HELP && exit 1
export REGISTRY_port=1299
export DEVICE_port=1272
export SYSTEM_port=1275
export TASK_port=1273
export SERVER_NAME_port=1271
export GATEWAY_port=1270
export JAR2_port=1276
export APP_port=1274
export NGINX_port=443
export VSFTPD_port=21
export MYSQL_port=3306
export REDIS_port=6379
app_jvm="-Xms300m -Xmx300m"
jar1_jvm="-Xms1g -Xmx1g"
gateway_jvm="-Xms1g -Xmx1g"
registry_jvm="-Xms300m -Xmx300m"
jar2_jvm=" "
system_jvm="-Xms2g -Xmx2g"
task_jvm="-Xms2g -Xmx2g"
server_name_jvm="-Xms2g -Xmx2g"
#服务器内存小于16G时,由jar服务自己分配jvm内存
Jvm_flag=1
Mem_Total=$(expr `free | grep "Mem" | awk '{print $2}'` / 1024 / 1024)
[ ${Mem_Total} -lt 15 ] && Jvm_flag=0
#判断有没有netstat命令
netstat -tlnp &>/dev/null || rpm -ivh --nodeps --force /opt/server_name/install/netstat/*.rpm &> /dev/null
GET_PID() {
registry_pid=` netstat -tlnp |grep -w ${REGISTRY_port}|cut -d "/" -f 1|awk '{printf $NF}' 2> /dev/null`
jar1_pid=` netstat -tlnp |grep -w ${DEVICE_port} |cut -d "/" -f 1|awk '{printf $NF}' 2> /dev/null`
system_pid=` netstat -tlnp |grep -w ${SYSTEM_port} |cut -d "/" -f 1|awk '{printf $NF}' 2> /dev/null`
task_pid=` netstat -tlnp |grep -w ${TASK_port} |cut -d "/" -f 1|awk '{printf $NF}' 2> /dev/null`
server_name_pid=`netstat -tlnp |grep -w ${SERVER_NAME_port}|cut -d "/" -f 1|awk '{printf $NF}' 2> /dev/null`
gateway_pid=` netstat -tlnp |grep -w ${GATEWAY_port}|cut -d "/" -f 1|awk '{printf $NF}' 2> /dev/null`
jar2_pid=` netstat -tlnp |grep -w ${JAR2_port} |cut -d "/" -f 1|awk '{printf $NF}' 2> /dev/null`
app_pid=` netstat -tlnp |grep -w ${APP_port} |cut -d "/" -f 1|awk '{printf $NF}' 2> /dev/null`
nginx_pid=` netstat -tlnp |grep -w ${NGINX_port} |cut -d "/" -f 1|awk '{printf $NF}' 2> /dev/null`
vsftpd_pid=` netstat -tlnp |grep -w ${VSFTPD_port} |cut -d "/" -f 1|awk '{printf $NF}' 2> /dev/null`
mysql_pid=` netstat -tlnp |grep -w ${MYSQL_port} |cut -d "/" -f 1|awk '{printf $NF}' 2> /dev/null`
redis_pid=` netstat -tlnp |grep -w ${REDIS_port} |cut -d "/" -f 1|awk '{printf $NF}' 2> /dev/null`
}
GET_PID
[ -d /opt/system/log/registry-service ] || `/usr/bin/mkdir -p /opt/system/log/registry-service`
[ -d /opt/system/log/jar2-service ] || `/usr/bin/mkdir -p /opt/system/log/jar2-service`
Jar_timeout_flag=0 #用于超时提示
#Usage: START ServerName ServerPort
START() {
echo "--------${1} 开始启动--------------"
to_log="/dev/null 2>&1"
[ ${1} == "registry" ] && to_log=/opt/system/log/registry-service/info.log
[ ${1} == "jar2" ] && to_log=/opt/system/log/jar2-service/info.log
var_cache=${1}_jvm
[ ${1} != "share-room" ] && jvm=`eval echo '$'${var_cache}` || jvm=$share_room_jvm
[ ${Jvm_flag} -eq 0 ] && jvm=" "
nohup java -jar ${jvm} ${server_name_dir}${1}/app.jar --spring.config.additional-location=file:${server_name_dir}${1}/config.properties &> ${to_log} &
nohup java -jar ${server_name_dir}${1}/app.jar --spring.config.additional-location=file:${server_name_dir}${1}/config.properties &> ${to_log} &
sleep 10
for (( i=1;i<=20;i++ ));do
sleep 5
# 这里之所以不用 $! ,因为 jar 运行需要一段时间 且之后还要判段该进程是否存活
SERVER_pid=`netstat -tlnp|grep -w ${2}|cut -d "/" -f 1|awk '{printf $NF}' 2> /dev/null`
if [ -n "$SERVER_pid" ];then
echo "${1} pid is $SERVER_pid"
eval ${1}_pid=${SERVER_pid}
echo -e "--------\033[32m${1} 启动成功\033[0m--------------"
break
fi
done
[ -z "$SERVER_pid" ] && echo -e "--------\033[31m${1} 启动超时 \033[0m--------------" && Jar_timeout_flag=1
#&& exit ${2}
return 0
}
echo "`date`"
if [ "$1" == "start" ];then
source /etc/profile.d/jdk-13.sh
[ $? != "0" ] && echo "请检查当前jdk是否是/etc/profile.d/jdk-13.sh" && exit 1
[ $Jvm_flag -eq 0 ] && echo "Warning: server memory is less than 16GB"
case "$2" in
"registry")
## 启动registry
[ -z "${registry_pid}" ] && START "registry" ${REGISTRY_port} || echo "$2 It's already running"
exit 0 ;;
"jar1")
## 启动DEVICE
[ -z "${jar1_pid}" ] && START "jar1" ${DEVICE_port} || echo "$2 It's already running"
exit 0 ;;
"system")
## 启动SYSTEM
[ -z "${system_pid}" ] && START "system" ${SYSTEM_port} || echo "$2 It's already running"
exit 0 ;;
"task")
## 启动TASK
[ -z "${task_pid}" ] && START "task" ${TASK_port} || echo "$2 It's already running"
exit 0 ;;
"server_name")
## 启动SERVER_NAME
[ -z "${server_name_pid}"] && START "server_name" ${SERVER_NAME_port} || echo "$2 It's already running"
exit 0 ;;
"gateway")
## 启动GATEWAY
[ -z "${gateway_pid}" ] && START "gateway" ${GATEWAY_port} || echo "$2 It's already running"
exit 0 ;;
"jar2" | "jar2")
## 启动JAR2
[ -z "${jar2_pid}" ] && START "jar2" ${JAR2_port} || echo "$2 It's already running"
exit 0 ;;
"app")
[ -z "${app_pid}" ] && START "app" ${APP_port} || echo "$2 It's already running"
exit 0 ;;
"nginx")
[ -z "${nginx_pid}" ] && nginx && echo "start $2 success" || echo "$2 It's already running"
exit 0 ;;
"vsftpd")
[ -z "${vsftpd_pid}" ] && systemctl start vsftpd && echo "start $2 success" || echo "$2 It's already running"
exit 0 ;;
"mysql")
[ -z "${mysql_pid}" ] && systemctl start mysqld && echo "start $2 success" || echo "$2 It's already running"
exit 0 ;;
"redis") # redis set "daemonize yes"
[ -z "${redis_pid}" ] && ${redis_dir}src/redis-server ${server_name_dir}/redis/redis.conf && echo "start $2 success" || echo "$2 It's already running"
exit 0 ;;
all)
echo "===Please wait while starting the service==="
## 启动nginx mysql vsftpd redis 等应用服务
[ -z "${nginx_pid}" ] && nginx && echo "start nginx success" || echo "nginx It's already running"
[ -z "${vsftpd_pid}" ] && systemctl start vsftpd &>/dev/null && echo "start vsftpd success" || echo "vsftpd It's already running"
[ -z "${mysql_pid}" ] && systemctl start mysqld &>/dev/null && echo "start mysql success" || echo "mysql It's already running"
[ -z "${redis_pid}" ] && ${redis_dir}src/redis-server ${server_name_dir}redis/redis.conf && echo "start redis success" || echo "redis It's already running"
## 启动registry
[ -z "${registry_pid}" ] && START "registry" ${REGISTRY_port} || echo "registry It's already running"
## 启动SYSTEM
[ -z "${system_pid}" ] && START "system" ${SYSTEM_port} || echo "system It's already running"
## 启动TASK
[ -z "${task_pid}" ] && START "task" ${TASK_port} || echo "task It's already running"
## 启动SERVER_NAME
[ -z "${server_name_pid}"] && START "server_name" ${SERVER_NAME_port} || echo "server_name It's already running"
## 启动GATEWAY
[ -z "${gateway_pid}" ] && START "gateway" ${GATEWAY_port} || echo "gateway It's already running"
## 启动JAR2
[ -z "${jar2_pid}" ] && START "jar2" ${JAR2_port} || echo "jar2 It's already running"
## 启动DEVICE
sleep 10
[ -z "${jar1_pid}" ] && START "jar1" ${DEVICE_port} || echo "jar1 It's already running"
## 启动APP
[ -z "${app_pid}" ] && START "app" ${APP_port} || echo "app It's already running"
[ ${Jar_timeout_flag} -eq 1 ] && echo -e "\033[31m 服务启动超时原因: \033[0m \n 1.jar服务的配置参数有误 \n 2.服务器CPU性能问题,命令执行完后需多等待一会"
echo -e "===\033[32mstart All service success\033[0m==="
exit 0
;;
*)
HELP
;;
esac
elif [ "$1" == "stop" ];then
case "$2" in
registry)
## 关闭registry
[ -n "${registry_pid}" ] && kill -9 ${registry_pid} && sleep 6
echo "$2 stop success"
exit 0 ;;
jar1)
## 关闭jar1
[ -n "${jar1_pid}" ] && kill -9 ${jar1_pid} && sleep 6
echo "$2 stop success"
exit 0 ;;
system)
## 关闭system
[ -n "${system_pid}" ] && kill -9 ${system_pid} && sleep 6
echo "$2 stop success"
exit 0 ;;
server_name)
## 关闭server_name
[ -n "${server_name_pid}"] && kill -9 ${server_name_pid} && sleep 6
echo "$2 stop success"
exit 0 ;;
task)
## 关闭task
[ -n "${task_pid}" ] && kill -9 ${task_pid} && sleep 6
echo "$2 stop success"
exit 0 ;;
gateway)
## 关闭gateway
[ -n "${gateway_pid}" ] && kill -9 ${gateway_pid} && sleep 6
echo "$2 stop success"
exit 0 ;;
"jar2" | "jar2")
## 关闭jar2
[ -n "${jar2_pid}" ] && kill -9 ${jar2_pid} && sleep 6
echo "$2 stop success"
exit 0 ;;
app)
## 关闭app
[ -n "${app_pid}" ] && kill -9 ${app_pid} && sleep 6
echo "$2 stop success"
exit 0 ;;
nginx)
[ -n "${nginx_pid}" ] && nginx -s stop && sleep 6
echo "$2 stop success"
exit 0 ;;
vsftpd)
[ -n "${vsftpd_pid}" ] && systemctl stop vsftpd && sleep 6
echo "$2 stop success"
exit 0 ;;
mysql)
[ -n "${mysql_pid}" ] && systemctl stop mysqld && sleep 6
echo "$2 stop success"
exit 0 ;;
redis)
[ -n "${redis_pid}" ] && kill -9 ${redis_pid} && sleep 6
echo "$2 stop success"
exit 0 ;;
all)
echo "===Please wait while the service is being suspended==="
## 关闭 nginx mysql vsftpd redis 等应用服务
[ -n "${nginx_pid}" ] && nginx -s stop &> /dev/null
[ -n "${vsftpd_pid}" ] && systemctl stop vsftpd
[ -n "${mysql_pid}" ] && systemctl stop mysqld
[ -n "${redis_pid}" ] && kill -9 ${redis_pid}
## 关闭registry
[ -n "${registry_pid}" ] && kill -9 ${registry_pid}
## 关闭jar1
[ -n "${jar1_pid}" ] && kill -9 ${jar1_pid}
## 关闭system
[ -n "${system_pid}" ] && kill -9 ${system_pid}
## 关闭task
[ -n "${task_pid}" ] && kill -9 ${task_pid}
## 关闭server_name
[ -n "${server_name_pid}"] && kill -9 ${server_name_pid}
## 关闭gateway
[ -n "${gateway_pid}" ] && kill -9 ${gateway_pid}
## 关闭jar2
[ -n "${jar2_pid}" ] && kill -9 ${jar2_pid}
## 关闭app
[ -n "${app_pid}" ] && kill -9 ${app_pid}
sleep 20
echo -e "===\033[32m all service stop success\033[0m==="
exit 0
;;
*)
HELP
;;
esac
elif [ "$1" == "restart" ];then
echo "===Please wait while restarting==="
$0 stop $2
#sleep 20
$0 start $2
echo -e "===\033[32m restart success\e[0m==="
elif [ "$1" == "create" ];then
sh_dir=/opt/server_name/bin
cd $sh_dir
echo "===system initialization==="
sh init.sh > /dev/null
echo "===Installing service==="
# 以下均是应用服务的安装及初始化脚本
# mysql
sh mysql-service.sh &> /dev/null
# nginx
sh nginx-service.sh &> /dev/null
# gcc redis
sh redis-service.sh &> /dev/null
# vsftpd
sh vsftpd-service.sh &> /dev/null
# openjdk
sh openjdk.sh &> /dev/null
# ntp
sh ntp.sh &> /dev/null
#rsync
#sh rsync.sh &> /dev/null
$0 start all
exit 0
elif [ "$1" == "clear" ];then
# remove rpm
$0 stop all
services=(mysql nginx vsftpd inotify )
echo "Removing all services..."
for i in ${servicesi[*]};do
rpm -qa|grep $i|xargs rpm -e --nodeps > /dev/null
done
rm -rf "${redis_dir}" > /dev/null
rm -rf "${jdk_dir}" > /dev/null
#rm -rf /opt/system/log/*
exit 0
else
HELP
exit 1
fi
exit 0