Eureka强制下线
可以通过调用actuator/service-registry/instance-status
接口,更改实例的状态为OUT_OF_SERVICE 。
curl -X POST -H 'Content-Type: application/json' -d 'OUT_OF_SERVICE' "http://localhost:$1/internal/
actuator/service-registry/instance-status"
当调用上面的接口之后,实例的状态即被修改为OUT_OF_SERVICE
启动后 监控微服务状态 当返回200时启动成功
curl --write-out %{http_code} --silent --output /dev/null http://localhost:$1/internal/actuator/health
.gitlab-ci.yml
- sh $CI_PROJECT_DIR/scripts/deploy-pscm.sh "/data/deploy" "book-sub" "10.187.237.140"
"-Djava.net.preferIPv4Stack=true -Dspring.profiles.active=dev4" "root" "18288"
注意:当测试环境时推荐参数不传端口号"18288"这样的话就不走强制下线的方法,可以加快启动速度
deploy-pscm.sh
#!/usr/bin/env bash
echo "deploy pscm"
apphome=${1}
app=${2}
ip=${3}
javaParam=${4}
appuser=${5}
serverPort=${6}
echo "apphome:${1} app:${2},ip:${3},javaParam:${4},appuser:${5} serverPort:${6}"
OLD_IFS=$IFS
IFS=',' arr=(${ip})
IFS=${OLD_IFS}
for item in ${arr[@]}; do
echo "in th loop"
echo "${appuser}@${item}"
echo " mkdir -p ${apphome}/${app}/target/ "
ssh ${appuser}@${item} " mkdir -p ${apphome}/${app}/target/ "
echo "scp ${CI_PROJECT_DIR}/scripts/*.sh ${appuser}@${item}:${apphome}/${app}"
ls -l ${CI_PROJECT_DIR}/scripts/
scp ${CI_PROJECT_DIR}/scripts/*.sh ${appuser}@${item}:${apphome}/${app}
ssh ${appuser}@${item} " chmod +x ${apphome}/${app}/stop.sh && cd ${apphome}/${app} && ${apphome}/${app}/stop.sh ${app} ${serverPort}"
echo "scp ${CI_PROJECT_DIR}/${srcDir}/target/${app}.jar ${appuser}@${item}:${apphome}/${app}"
scp ${CI_PROJECT_DIR}/${srcDir}/target/${app}.jar ${appuser}@${item}:${apphome}/${app}
ssh ${appuser}@${item} "chmod +x ${apphome}/${app}/start.sh && ${apphome}/${app}/start.sh '${apphome}/${app}' '${javaParam}' '${app}' '${serverPort}'"
done
start.sh
#!/usr/bin/env bash
function wait_to_start(){
if [ ! -z "$1" ]; then
response=$(curl --write-out %{http_code} --silent --output /dev/null http://localhost:$1/internal/actuator/health)
echo "$response :结果"
count=1
while [ $response -ne 200 ]
do
echo "waiting to start " $(date)
sleep 2
response=$(curl --write-out %{http_code} --silent --output /dev/null http://localhost:$1/internal/actuator/health)
count=$((count+1))
if [ $count -gt 100 ]; then
echo "waiting too long $count" $(date)
break
fi
done
echo "启动成功: 状态码: $response"
sleep_90
else
echo "未提供服务端口,跳过启动成功检查"
fi
}
function sleep_90(){
echo "等待90秒,以知晓其他服务" $(date)
for i in {1..9}
do
sleep 10
echo "sleep 10 * $i " $(date)
done
echo "等待结束!" $(date)
}
apphome=${1}
srcDir=${2}
appDir=${3}
app=${4}
ip=${5}
echo "dir:${1} javaParam:${2} app:${3} serverPort:${4},5:${5}"
cd $1
echo "start $3 @ $1"
echo "java -jar $2 $3.jar"
java -jar $2 $3.jar> /dev/null &
wait_to_start $4
echo "$3 started"
stop.sh
#!/usr/bin/env bash
stopPathNo="ieejifgjoweifgthsdleeoiisdwjqw125tgr8838rufgrtg"
AppName=$1
serverPort=$2
function stop_by_findPid_kill(){
pid=$(ps -ef | grep $AppName | grep 'java' | grep -v grep | awk '{print $2}')
echo "$AppName pid $pid $serverPort" $(date)
try_out_of_service $serverPort
kill_with_wait $pid
out=`echo $?`
if [ $out -eq 0 ]
then
echo "$AppName stopped by kill pid success" $(date)
else
echo "$AppName stopped by kill pid fail" $(date)
fi
}
PIDFile="application.pid"
PORTFile="application.port"
function check_if_pid_file_exists {
if [ ! -f $PIDFile ]
then
return 1
else
return 0
fi
}
function check_if_process_is_running() {
if ps -p $(print_process) > /dev/null
then
return 0
else
return 1
fi
}
function kill_with_wait() {
count=1
pid=$1
kill $pid 2>/dev/null
while checkExist $pid
do
echo "waiting to stop $count" $(date)
sleep 2
pid=$(ps -ef | grep $AppName | grep 'java' | grep -v grep | awk '{print $2}')
count=$((count+1))
if [ $count -gt 100 ]; then
echo "waiting too long $count" $(date)
break
fi
done
}
function try_out_of_service(){
echo "$1"
if [ ! -z "$1" ]
then
response=$(curl --write-out %{http_code} --silent --output /dev/null http://localhost:$1/internal/actuator/health)
echo "当前服务状态: $response"
if [ $response == 200 ]; then
echo curl -X POST -H 'Content-Type: application/json' -d 'OUT_OF_SERVICE' "http://localhost:$1/internal/actuator/service-registry/instance-status" $(date)
curl -X POST -H 'Content-Type: application/json' -d 'OUT_OF_SERVICE' "http://localhost:$1/internal/actuator/service-registry/instance-status"
sleep_90
else
echo "当前服务未启动,无需通知停止!"
fi
else
echo "未提供服务端口,跳过服务下线处理" $(date)
fi
}
function sleep_90(){
echo "等待90秒,以知晓其他服务" $(date)
for i in {1..9}
do
sleep 10
echo "sleep 10 * $i " $(date)
done
echo "等待结束!" $(date)
}
function print_process() {
echo $(<"$PIDFile")
}
function print_port(){
echo $(<"$PORTFile")
}
function checkExist(){
if [ -z "$1" ]
then
return 1
else
return 0
fi
}
function stop_by_kill_appid(){
kill $(print_process) 2>/dev/null
out=`echo $?`
if [ $out -eq 0 ]
then
echo -e "$AppName stopped by kill appId success" $(date)
else
echo -e "$AppName stopped by kill appId fail" $(date)
fi
}
#do not use it now
function normal_stop(){
curl --connect-timeout 5 -X POST http://127.0.0.1:$(print_port)/$stopPathNo 2>/dev/null
out=`echo $?`
if [ $out -eq 0 ]
then
echo "$AppName stopped by normal_stop" $(date)
return 0
else
return 1
fi
}
function do_stop(){
stop_by_findPid_kill
}
do_stop