滚动发布 代码 实际测试

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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

javafanwk

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值