目的:
实现java微服务进程的运行保障,故障发现和自动恢复,保障系统业务运行
原理:
通过持续监测java服务的tcp端口,判断进程是否存在——故障检测
定义各个jar的启动命令,检测到故障后可自动执行启动命令——故障恢复
针对恢复后的进程进行再次检测,若无法恢复则关闭nginx进行vip漂移——nginx+keepalived
变量:
端口号、对应服务名、服务启动命令、指定nacos地址文件、java虚机的资源分配、jar包的路径、nginx的pid、循环检测的时间
命令:
需要安装nc命令,用于检测端口状态
yum install nc
脚本内容:
#!/bin/bash
#脚本运行环境需要安装nc
#nacos地址文件路径、jar包路径、java虚机内存大小
NACOS=/x/x/x #nacos文件地址
pwd=/x/x/x #jar包路径
MIN=xxx #java虚拟机初始内存
MAX=xxx #java虚拟机最大内存
# 定义要检测的端口和对应的服务名和启动命令,服务名写可被过滤到的进程名称关键字
declare -A port_services=(
["8101"]="bridata-user"
["8102"]="bridata-auth"
["8103"]="bridata-log"
["8200"]="beidata-gateway"
["8104"]="bridata-system"
)
declare -A service_start=(
["bridata-user"]="nohup java -Xms$MIN -Xmx$MAX -jar $PWD/aaa.jar --spring.profiles.active=dev --spring.bootstrap.location=$NACOS >aaa.log 2>&1 &"
["bridata-auth"]="nohup java -Xms$MIN -Xmx$MAX -jar $PWD/bbb.jar --spring.profiles.active=dev --spring.bootstrap.location=$NACOS >bbb.log 2>&1 &"
["bridata-log"]="nohup java -Xms$MIN -Xmx$MAX -jar $PWD/ccc.jar --spring.profiles.active=dev --spring.bootstrap.location=$NACOS >ccc.log 2>&1 &"
["beidata-gateway"]="nohup java -Xms$MIN -Xmx$MAX -jar $PWD/ddd.jar --spring.profiles.active=dev --spring.bootstrap.location=$NACOS >ddd.log 2>&1 &"
["bridata-system"]="nohup java -Xms$MIN -Xmx$MAX -jar $PWD/eee.jar --spring.profiles.active=dev --spring.bootstrap.location=$NACOS >eee.log 2>&1 &"
)
# 定义Nginx进程名
nginx_process=$(ps -ef | grep nginx | grep -v grep | awk '{print $2}')
# 定义检测间隔(秒)
interval=10
# 循环检测端口连通性
while true; do
for port in "${!port_services[@]}"; do
# 使用nc命令检测端口连通性
nc -z -w1 localhost "$port"
if [[ $? -ne 0 ]]; then
# 端口不可用,查找对应的服务进程并杀死
service="${port_services[$port]}"
pid=$(ps -ef | grep "$service" | grep -v grep | awk '{print $2}')
if [[ -n $pid ]]; then
echo "Port $port is not available. Killing service $service (PID: $pid)..."
kill -9 "$pid"
fi
# 启动对应的服务
echo "Starting service $service..."
start="${service_start[$service]}"
eval "$start"
if [[ $? -eq 0 ]]; then
# 等待一段时间
sleep 20
# 再次检查端口是否可用
nc -z -w1 localhost "$port"
if [[ $ -eq 0 ]]; then
# 端口可用,继续监控其他端口
echo "Service $service 端口正常。。。"
else
# 端口不可用,关闭Nginx进程
echo "Service $service 端口号: $port ,端口仍不可用,将关闭nginx。。。"
kill -9 "$nginx_process"
fi
else
# 启动命令无法启动服务,关闭Nginx进程
echo "无法启动 $service. 将关闭nginx进程。。。"
kill -9 "$nginx_process"
fi
fi
done
sleep "$interval"
done