nacos版本v2和v3下线服务使用的shell脚本

# 这个适用于nacos v2.x版本使用

#!/bin/sh

# shell脚本作用
# 在更新服务时先执行这个脚本,把服务从nacos中下线
# Nacos 服务端在30秒没收到心跳时将这个实例摘除,sleep时间需要大于30秒

NACOS_SERVER_ADDR=x.x.x.x  # nacos所在主机IP
NACOS_PORT=8848 # nacos端口号,默认8848
username=xxx  # 在nacos上的用户,默认是nacos
password=xxx  # 在nacos上的用户密码,默认是nacos
NACOS_NAMESPACE=
HOST_IP=x.x.x.x  # 应用服务所在主机IP
SERVICE_NAME=xxx # 应用服务在nacos上注册的服务名
PORT=xxxx # 应用服务在nacos上注册的服务端口号

echo "获取accessToken鉴权"
TempResult=$(curl -X POST "http://${NACOS_SERVER_ADDR}:${NACOS_PORT}/nacos/v1/auth/login" -d "username=${username}&password=${password}")

# echo ${AccessTokenResult}
# {"accessToken":"eyJhbGciOiJIUzM4NCJ9.eyJzdWIiOiJuYWNvcyIsImV4cCI6MTc0MDY0MzEwNX0.krAoXUCT8JllmFxpy5svh-EmCovOgC6hq5UQTuSjRUGCG6jefQuan1LVJAZ9TShZ","tokenTtl":18000,"globalAdmin":true,"username":"nacos"}

echo "切割字符串获取所需要的accessToken"
# 切割以,号为分隔符的第一个字段,切割以:号为分隔符的第一个字段,最后去掉双引号
AccessToken=$(echo $TempResult | cut -d',' -f1 | cut -d':' -f2 | sed 's/\"//g')

echo "put请求服务下线"
result=$(curl -X PUT "http://${NACOS_SERVER_ADDR}:${NACOS_PORT}/nacos/v1/ns/instance?serviceName=${SERVICE_NAME}&clusterName=DEFAULT&groupName=DEFAULT_GROUP&ip=${HOST_IP}&port=${PORT}&ephemeral=true&weight=1&enabled=false&namespaceId=${NACOS_NAMESPACE}&accessToken=${AccessToken}")

echo "输出curl执行结果result:${result}"

if [ ${result} == "ok" ]; then
  echo "服务下线-执行成功,等待60秒后退出"
  sleep 60
  exit 0
else
  echo "执行失败"
  exit 1
fi
# 这个适用于nacos v3.x版本使用

#!/bin/sh

# shell脚本作用
# 在更新服务时先执行这个脚本,把服务从nacos中下线
# Nacos 服务端在30秒没收到心跳时将这个实例摘除,sleep时间需要大于30秒


NACOS_SERVER_ADDR=x.x.x.x  # nacos所在主机IP
NACOS_CONSOLE_PORT=18080  # nacos v3.x版本新增的控制台端口号,默认18080
NACOS_PORT=8848 # nacos端口号,默认8848
username=xxx  # 在nacos上的用户,默认是nacos
password=xxx  # 在nacos上的用户密码,默认是nacos
NACOS_NAMESPACE=
HOST_IP=x.x.x.x  # 应用服务所在主机IP
SERVICE_NAME=xxx # 应用服务在nacos上注册的服务名
PORT=xxxx # 应用服务在nacos上注册的服务端口号

echo "获取accessToken鉴权" # 注意这个地址跟nacos v2.x 的不一样
TempResult=$(curl -X POST "http://${NACOS_SERVER_ADDR}:${NACOS_PORT}/nacos/v3/auth/user/login" -d "username=${username}&password=${password}")

# echo ${TempResult}
# {"accessToken":"eyJhbGciOiJIUzM4NCJ9.eyJzdWIiOiJuYWNvcyIsImV4cCI6MTc0MDY0MzEwNX0.krAoXUCT8JllmFxpy5svh-EmCovOgC6hq5UQTuSjRUGCG6jefQuan1LVJAZ9TShZ","tokenTtl":18000,"globalAdmin":true,"username":"nacos"}

echo "切割字符串获取所需要的accessToken"
# 切割以,号为分隔符的第一个字段,切割以:号为分隔符的第一个字段,最后去掉双引号
AccessToken=$(echo $TempResult | cut -d',' -f1 | cut -d':' -f2 | sed 's/\"//g')
# echo ${AccessToken}

echo "put请求服务下线"  # 注意这个地址和端口号跟nacos v2.x 的不一样
result=$(curl -X PUT "http://${NACOS_SERVER_ADDR}:${NACOS_CONSOLE_PORT}/v3/console/ns/instance?serviceName=${SERVICE_NAME}&clusterName=DEFAULT&groupName=DEFAULT_GROUP&ip=${HOST_IP}&port=${PORT}&ephemeral=true&weight=1&enabled=false&namespaceId=${NACOS_NAMESPACE}&accessToken=${AccessToken}")

echo "输出curl执行结果result:${result}" # 输出结果也跟 nacos v2.x 的不一样
# 输出curl执行结果result:{"code":0,"message":"success","data":"ok"}

# 截取所需要的字符串:data的值是ok # 对结果进行进一步的处理,获取所需要的值进行后续的判断处理
data=$(echo ${result} | cut -d',' -f3 | cut -d':' -f2 | cut -c 2-3)

echo "确认data的值:" $data

if [ ${data} == "ok" ]; then
  echo "服务下线-执行成功,等待60秒后退出"
  sleep 60
  exit 0
else
  echo "执行失败"
  exit 1
fi


# 备注:若是nacos v3.x中的配置文件中设置了控制台的访问路径,也就是配置了参数:nacos.console.contextPath=/xxxx
# 意味着原先访问nacos的web控制台地址是 http://ip:18080 换成了 http://ip:18080/xxxx
# 相对应的,put请求服务下线的地址也要加上这个访问路径,变成了如下,跟原先的相比在路径中多了/xxxx
# result=$(curl -X PUT "http://${NACOS_SERVER_ADDR}:${NACOS_CONSOLE_PORT}/xxxx/v3/console/ns/instance?serviceName=${SERVICE_NAME}&clusterName=DEFAULT&groupName=DEFAULT_GROUP&ip=${HOST_IP}&port=${PORT}&ephemeral=true&weight=1&enabled=false&namespaceId=${NACOS_NAMESPACE}&accessToken=${AccessToken}")
posted @ 2025-06-25 11:19  哈喽哈喽111111  阅读(91)  评论(0)    收藏  举报